)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f8b748f481ba8b116a6ee0990e2c8956d9d6a9e7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"75ec5fd4_425df970","updated":"2026-03-04 10:11:40.000000000","message":"Also, I think that ovn driver implementation can be moved to another patch. This one may only be about service plugin, db layer and extending API resources. That way it will be smaller and hopefully a bit easier to review :)","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5964683412fc445226246718b3f1d5dce7941ef7","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":33,"id":"cef04583_73cda4ba","updated":"2026-05-07 07:55:09.000000000","message":"I tried your patch locally. Generally it works fine but I noticed couple of small issues there. Details are below:\n\n\n    \u003d\u003d\u003d Update port to be pvlan_type \u003d \"community\" was not reflected in the returned data but was fine in db \u003d\u003d\u003d\n\n    curl -g -i -X PUT http://10.120.0.40/networking/v2.0/ports/fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616 -H \"Content-Type: application/json\" -H \"User-Agent: openstacksdk/4.12.0 keystoneauth1/5.13.1 python-requests/2.33.1 CPython/3.12.3\" -H \"X-Auth-Token: $token\" -d \u0027{\"port\": {\"pvlan_type\": \"community\", \"pvlan_community\": \"community1\"}}\u0027\n    HTTP/1.1 200 OK\n    Date: Wed, 06 May 2026 13:08:50 GMT\n    Server: Apache/2.4.58 (Ubuntu)\n    Content-Type: application/json\n    Content-Length: 841\n    x-openstack-request-id: req-b0aec626-c09c-4c1c-91d3-ccf20c43d34f\n    Connection: close\n\n    {\"port\":{\"id\":\"fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616\",\"name\":\"port_1\",\"network_id\":\"d0dfc5b6-4962-42ea-84aa-f48684943d3a\",\"project_id\":\"8fe966d02c3c45d2b4ad7f2b3bf2062f\",\"mac_address\":\"fa:16:3e:b0:e2:c0\",\"admin_state_up\":true,\"status\":\"DOWN\",\"device_id\":\"\",\"device_owner\":\"\",\"fixed_ips\":[],\"allowed_address_pairs\":[],\"extra_dhcp_opts\":[],\"security_groups\":[\"79c8183e-3913-4f16-965f-039e4bcce8dd\"],\"description\":\"\",\"binding:vnic_type\":\"normal\",\"binding:profile\":{},\"binding:host_id\":\"\",\"binding:vif_type\":\"unbound\",\"binding:vif_details\":{},\"port_security_enabled\":true,\"qos_policy_id\":null,\"qos_network_policy_id\":null,\"resource_request\":null,\"pvlan_type\":\"promiscuous\",\"pvlan_community\":null,\"tags\":[],\"created_at\":\"2026-05-06T13:04:23Z\",\"updated_at\":\"2026-05-06T13:04:23Z\",\"revision_number\":1,\"tenant_id\":\"8fe966d02c3c45d2b4ad7f2b3bf2062f\"}}%  \n\n\n    mysql\u003e select * from portpvlan where port_id \u003d \u0027fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616\u0027;\n    +--------------------------------------+------------+-----------------+\n    | port_id                              | pvlan_type | pvlan_community |\n    +--------------------------------------+------------+-----------------+\n    | fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616 | community  | community1      |\n    +--------------------------------------+------------+-----------------+\n\n\n    \u003d\u003d\u003d Get port shows correct data \u003d\u003d\u003d\n\n    curl -g -i -X GET http://10.120.0.40/networking/v2.0/ports/fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616 -H \"Content-Type: application/json\" -H \"User-Agent: openstacksdk/4.12.0 keystoneauth1/5.13.1 python-requests/2.33.1 CPython/3.12.3\" -H \"X-Auth-Token: $token\" \n    HTTP/1.1 200 OK\n    Date: Wed, 06 May 2026 13:11:34 GMT\n    Server: Apache/2.4.58 (Ubuntu)\n    Content-Type: application/json\n    Content-Length: 847\n    x-openstack-request-id: req-0d6b05d9-eba9-4e07-9a01-d21c82af2000\n    Connection: close\n\n    {\"port\":{\"id\":\"fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616\",\"name\":\"port_1\",\"network_id\":\"d0dfc5b6-4962-42ea-84aa-f48684943d3a\",\"project_id\":\"8fe966d02c3c45d2b4ad7f2b3bf2062f\",\"mac_address\":\"fa:16:3e:b0:e2:c0\",\"admin_state_up\":true,\"status\":\"DOWN\",\"device_id\":\"\",\"device_owner\":\"\",\"fixed_ips\":[],\"allowed_address_pairs\":[],\"extra_dhcp_opts\":[],\"security_groups\":[\"79c8183e-3913-4f16-965f-039e4bcce8dd\"],\"description\":\"\",\"binding:vnic_type\":\"normal\",\"binding:profile\":{},\"binding:host_id\":\"\",\"binding:vif_type\":\"unbound\",\"binding:vif_details\":{},\"port_security_enabled\":true,\"qos_policy_id\":null,\"qos_network_policy_id\":null,\"resource_request\":null,\"pvlan_type\":\"community\",\"pvlan_community\":\"community1\",\"tags\":[],\"created_at\":\"2026-05-06T13:04:23Z\",\"updated_at\":\"2026-05-06T13:08:50Z\",\"revision_number\":2,\"tenant_id\":\"8fe966d02c3c45d2b4ad7f2b3bf2062f\"}}% \n\n\n    \u003d\u003d\u003d Updating port to be isolated but also giving \"community\" value returns HTTP 200 but actually community is changed to Null in DB \u003d\u003d\u003d\n\n    curl -g -i -X PUT http://10.120.0.40/networking/v2.0/ports/fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616 -H \"Content-Type: application/json\" -H \"User-Agent: openstacksdk/4.12.0 keystoneauth1/5.13.1 python-requests/2.33.1 CPython/3.12.3\" -H \"X-Auth-Token: $token\" -d \u0027{\"port\": {\"pvlan_type\": \"isolated\", \"pvlan_community\": \"community1\"}}\u0027\n    HTTP/1.1 200 OK\n    Date: Wed, 06 May 2026 13:12:05 GMT\n    Server: Apache/2.4.58 (Ubuntu)\n    Content-Type: application/json\n    Content-Length: 847\n    x-openstack-request-id: req-b060600d-0985-485b-8ccb-a870580d88a3\n    Connection: close\n\n    {\"port\":{\"id\":\"fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616\",\"name\":\"port_1\",\"network_id\":\"d0dfc5b6-4962-42ea-84aa-f48684943d3a\",\"project_id\":\"8fe966d02c3c45d2b4ad7f2b3bf2062f\",\"mac_address\":\"fa:16:3e:b0:e2:c0\",\"admin_state_up\":true,\"status\":\"DOWN\",\"device_id\":\"\",\"device_owner\":\"\",\"fixed_ips\":[],\"allowed_address_pairs\":[],\"extra_dhcp_opts\":[],\"security_groups\":[\"79c8183e-3913-4f16-965f-039e4bcce8dd\"],\"description\":\"\",\"binding:vnic_type\":\"normal\",\"binding:profile\":{},\"binding:host_id\":\"\",\"binding:vif_type\":\"unbound\",\"binding:vif_details\":{},\"port_security_enabled\":true,\"qos_policy_id\":null,\"qos_network_policy_id\":null,\"resource_request\":null,\"pvlan_type\":\"community\",\"pvlan_community\":\"community1\",\"tags\":[],\"created_at\":\"2026-05-06T13:04:23Z\",\"updated_at\":\"2026-05-06T13:08:50Z\",\"revision_number\":2,\"tenant_id\":\"8fe966d02c3c45d2b4ad7f2b3bf2062f\"}}%  \n\n\n    mysql\u003e select * from portpvlan where port_id \u003d \u0027fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616\u0027;\n    +--------------------------------------+------------+-----------------+\n    | port_id                              | pvlan_type | pvlan_community |\n    +--------------------------------------+------------+-----------------+\n    | fc4f8fb6-8b8f-48fd-bc4d-63ddacc1d616 | isolated   | NULL            |\n    +--------------------------------------+------------+-----------------+\n    1 row in set (0.00 sec)","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9baa74b477260d4a7129a49d5f7fa73a4d510272","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":42,"id":"7da2d740_24f40634","updated":"2026-05-18 16:10:59.000000000","message":"I think I addressed both comments, thanks!","commit_id":"a4607b1c01d203db831ce35e23b044f2fb40ea64"}],"neutron/db/migration/alembic_migrations/versions/2026.1/contract/a9b0618921a1_add_pvlan.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade():"},{"line_number":30,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"ca087e3e_c41c7d2e","line":30,"updated":"2026-03-04 09:40:00.000000000","message":"we don\u0027t need contract phase scripts at all because we don\u0027t do upgrades in that phase currently. Only EXPAND is enough","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"50d243d843461e392bc710e4f454914a76874ed9","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade():"},{"line_number":30,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"110f399e_55e5d089","line":30,"in_reply_to":"ca087e3e_c41c7d2e","updated":"2026-03-09 08:48:23.000000000","message":"Done","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"}],"neutron/db/migration/alembic_migrations/versions/2026.1/expand/bdae3a00c493_add_pvlan.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":32,"id":"6843731b_1eb06b42","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"updated":"2026-05-07 07:05:51.000000000","message":"This file needs to go to `neutron/db/migration/alembic_migrations/versions/2026.2`. We are in Hibiscus now.","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":32,"id":"52314d07_4c89d2a4","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"in_reply_to":"6843731b_1eb06b42","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5964683412fc445226246718b3f1d5dce7941ef7","unresolved":true,"context_lines":[{"line_number":34,"context_line":"        \u0027networkpvlan\u0027,"},{"line_number":35,"context_line":"        sa.Column(\u0027network_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sa.Column(\u0027pvlan\u0027, sa.Boolean(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  server_default\u003dsa.sql.false(), index\u003dTrue),"},{"line_number":38,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027], [\u0027networks.id\u0027],"},{"line_number":39,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027))"}],"source_content_type":"text/x-python","patch_set":32,"id":"8dbd495f_8fe94bcf","line":37,"updated":"2026-05-07 07:55:09.000000000","message":"is indexing of that column really helpful for the performance here?","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":true,"context_lines":[{"line_number":34,"context_line":"        \u0027networkpvlan\u0027,"},{"line_number":35,"context_line":"        sa.Column(\u0027network_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sa.Column(\u0027pvlan\u0027, sa.Boolean(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  server_default\u003dsa.sql.false(), index\u003dTrue),"},{"line_number":38,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027], [\u0027networks.id\u0027],"},{"line_number":39,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027))"}],"source_content_type":"text/x-python","patch_set":32,"id":"005a7c88_9052e13c","line":37,"in_reply_to":"8dbd495f_8fe94bcf","updated":"2026-05-11 09:22:42.000000000","message":"not sure, I have removed this since I\u0027m not sure either. I mostly did this following other migrations as example and thinking this would be an useful filter for users (checking all networks with pvlan).","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":35,"context_line":"        sa.Column(\u0027network_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sa.Column(\u0027pvlan\u0027, sa.Boolean(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  server_default\u003dsa.sql.false(), index\u003dTrue),"},{"line_number":38,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027], [\u0027networks.id\u0027],"},{"line_number":39,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    migration.create_table_if_not_exists("},{"line_number":43,"context_line":"        \u0027portpvlan\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"ca6aaad7_9b30ba8f","line":40,"range":{"start_line":38,"start_character":8,"end_line":40,"end_character":46},"updated":"2026-05-07 07:05:51.000000000","message":"nit: you can directly add these constrains in the column definition:\n```\nsa.Column(\u0027network_id\u0027, sa.String(length\u003d36),\n          sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\u0027CASCADE\u0027),\n          primary_key\u003dTrue),\n```\nIf it is primary_key, there is no need to define nullable\u003dTrue:\n```\nself.nullable \u003d not primary_key  # sqlalchemy code\n```","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        sa.Column(\u0027network_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sa.Column(\u0027pvlan\u0027, sa.Boolean(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  server_default\u003dsa.sql.false(), index\u003dTrue),"},{"line_number":38,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027], [\u0027networks.id\u0027],"},{"line_number":39,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    migration.create_table_if_not_exists("},{"line_number":43,"context_line":"        \u0027portpvlan\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7884e192_9537feb4","line":40,"range":{"start_line":38,"start_character":8,"end_line":40,"end_character":46},"in_reply_to":"ca6aaad7_9b30ba8f","updated":"2026-05-11 09:22:42.000000000","message":"Oooh I see, thanks!","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    migration.create_table_if_not_exists("},{"line_number":43,"context_line":"        \u0027portpvlan\u0027,"},{"line_number":44,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027pvlan_type\u0027, sa.String(255), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027pvlan_community\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":47,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":48,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":32,"id":"5d4b30ad_74c24cc2","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":64},"updated":"2026-05-07 07:05:51.000000000","message":"If I\u0027m not wrong, this must be an enum: isolated, promiscuous, community","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    migration.create_table_if_not_exists("},{"line_number":43,"context_line":"        \u0027portpvlan\u0027,"},{"line_number":44,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027pvlan_type\u0027, sa.String(255), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027pvlan_community\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":47,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":48,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":32,"id":"c967abe9_0585c8c4","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":64},"in_reply_to":"5d4b30ad_74c24cc2","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027pvlan_type\u0027, sa.String(255), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027pvlan_community\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":47,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":48,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":49,"context_line":"        sa.PrimaryKeyConstraint(\u0027port_id\u0027))"}],"source_content_type":"text/x-python","patch_set":32,"id":"0b8e458a_ac947151","line":49,"range":{"start_line":47,"start_character":8,"end_line":49,"end_character":43},"updated":"2026-05-07 07:05:51.000000000","message":"ditto","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        sa.Column(\u0027port_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":45,"context_line":"        sa.Column(\u0027pvlan_type\u0027, sa.String(255), nullable\u003dFalse),"},{"line_number":46,"context_line":"        sa.Column(\u0027pvlan_community\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":47,"context_line":"        sa.ForeignKeyConstraint([\u0027port_id\u0027], [\u0027ports.id\u0027],"},{"line_number":48,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":49,"context_line":"        sa.PrimaryKeyConstraint(\u0027port_id\u0027))"}],"source_content_type":"text/x-python","patch_set":32,"id":"7dcb7092_72b67719","line":49,"range":{"start_line":47,"start_character":8,"end_line":49,"end_character":43},"in_reply_to":"0b8e458a_ac947151","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"}],"neutron/db/models/pvlan.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    pvlan_type \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":55,"context_line":"    pvlan_community \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add a relationship to the Network model in order to instruct"},{"line_number":58,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":59,"context_line":"    port \u003d orm.relationship(models_v2.Port,"},{"line_number":60,"context_line":"                            load_on_pending\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":1,"id":"e62d1677_ed9febbd","line":57,"range":{"start_line":57,"start_character":32,"end_line":57,"end_character":39},"updated":"2026-03-04 09:40:00.000000000","message":"Port","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"50d243d843461e392bc710e4f454914a76874ed9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    pvlan_type \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":55,"context_line":"    pvlan_community \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add a relationship to the Network model in order to instruct"},{"line_number":58,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":59,"context_line":"    port \u003d orm.relationship(models_v2.Port,"},{"line_number":60,"context_line":"                            load_on_pending\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":1,"id":"374600a1_610bc7ca","line":57,"range":{"start_line":57,"start_character":32,"end_line":57,"end_character":39},"in_reply_to":"e62d1677_ed9febbd","updated":"2026-03-09 08:48:23.000000000","message":"Done","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":51,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":52,"context_line":"                        primary_key\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    pvlan_type \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":55,"context_line":"    pvlan_community \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add a relationship to the Port model in order to instruct"}],"source_content_type":"text/x-python","patch_set":32,"id":"2316e53d_68b9d142","line":54,"range":{"start_line":54,"start_character":3,"end_line":54,"end_character":58},"updated":"2026-05-07 07:05:51.000000000","message":"Same comment as in the DDL file: this must be an enum","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":52,"context_line":"                        primary_key\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    pvlan_type \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":55,"context_line":"    pvlan_community \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add a relationship to the Port model in order to instruct"}],"source_content_type":"text/x-python","patch_set":32,"id":"11496bae_eb45a892","line":54,"range":{"start_line":54,"start_character":3,"end_line":54,"end_character":58},"in_reply_to":"2316e53d_68b9d142","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d2f223c1caae2f2ca2437079f35c0f306c0e71a","unresolved":true,"context_lines":[{"line_number":51,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":52,"context_line":"                        primary_key\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    pvlan_type \u003d sa.Column(sa.Enum(\u0027isolated\u0027, \u0027promiscuous\u0027, \u0027community\u0027,"},{"line_number":55,"context_line":"                           name\u003d\u0027pvlan_type_enum\u0027),"},{"line_number":56,"context_line":"                           nullable\u003dFalse)"},{"line_number":57,"context_line":"    pvlan_community \u003d sa.Column(sa.String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"bf70abaa_ff2f6274","line":54,"range":{"start_line":54,"start_character":36,"end_line":54,"end_character":73},"updated":"2026-05-13 13:05:05.000000000","message":"nit (can be done in follow up if that one will not be respined anymore): shouldn\u0027t we have those defined as constants somewhere?","commit_id":"3b1a0829cc0b12eceb2072f8525754f94033bf05"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"741dfb322653dd2c257b9a64acf23f830b8555f0","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                        sa.ForeignKey(\u0027ports.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":52,"context_line":"                        primary_key\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    pvlan_type \u003d sa.Column(sa.Enum(\u0027isolated\u0027, \u0027promiscuous\u0027, \u0027community\u0027,"},{"line_number":55,"context_line":"                           name\u003d\u0027pvlan_type_enum\u0027),"},{"line_number":56,"context_line":"                           nullable\u003dFalse)"},{"line_number":57,"context_line":"    pvlan_community \u003d sa.Column(sa.String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":37,"id":"f939520b_f4f178ec","line":54,"range":{"start_line":54,"start_character":36,"end_line":54,"end_character":73},"in_reply_to":"bf70abaa_ff2f6274","updated":"2026-05-14 13:17:37.000000000","message":"We have this on neutron-lib indeed, I changed it to use them","commit_id":"3b1a0829cc0b12eceb2072f8525754f94033bf05"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86dea0fb3618bec491f3bc871a177e269b1f879d","unresolved":true,"context_lines":[{"line_number":30,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":31,"context_line":"                           primary_key\u003dTrue)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    pvlan \u003d sa.Column(sa.Boolean, nullable\u003dFalse, default\u003dFalse,"},{"line_number":34,"context_line":"                      server_default\u003dsql.false())"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":43,"id":"52ed9ef6_e8f2fe94","line":33,"range":{"start_line":33,"start_character":22,"end_line":33,"end_character":32},"updated":"2026-05-20 09:51:38.000000000","message":"This should be an object, not a class\ns/sa.Boolean/sa.Boolean()","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":31,"context_line":"                           primary_key\u003dTrue)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    pvlan \u003d sa.Column(sa.Boolean, nullable\u003dFalse, default\u003dFalse,"},{"line_number":34,"context_line":"                      server_default\u003dsql.false())"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":43,"id":"e4bd482b_4a4c3e1f","line":33,"range":{"start_line":33,"start_character":22,"end_line":33,"end_character":32},"in_reply_to":"52ed9ef6_e8f2fe94","updated":"2026-05-20 15:31:23.000000000","message":"Done","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"}],"neutron/extensions/pvlan.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    api_definition \u003d apidef"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def get_plugin_interface(cls):"},{"line_number":37,"context_line":"        return PVLANPluginBase"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_resources(cls):"},{"line_number":41,"context_line":"        \"\"\"Returns Ext Resources.\"\"\""},{"line_number":42,"context_line":"        special_mappings \u003d {\u0027networks\u0027: \u0027network\u0027}"},{"line_number":43,"context_line":"        plural_mappings \u003d resource_helper.build_plural_mappings("},{"line_number":44,"context_line":"            special_mappings, itertools.chain("},{"line_number":45,"context_line":"                apidef.RESOURCE_ATTRIBUTE_MAP,"},{"line_number":46,"context_line":"                apidef.SUB_RESOURCE_ATTRIBUTE_MAP))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        resources \u003d resource_helper.build_resource_info("},{"line_number":49,"context_line":"                        plural_mappings,"},{"line_number":50,"context_line":"                        apidef.RESOURCE_ATTRIBUTE_MAP,"},{"line_number":51,"context_line":"                        plugin_consts.PVLAN,"},{"line_number":52,"context_line":"                        translate_name\u003dTrue,"},{"line_number":53,"context_line":"                        allow_bulk\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        plugin \u003d directory.get_plugin(plugin_consts.PVLAN)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        parent \u003d apidef.SUB_RESOURCE_ATTRIBUTE_MAP["},{"line_number":58,"context_line":"            apidef.COLLECTION_NAME].get(\u0027parent\u0027)"},{"line_number":59,"context_line":"        params \u003d apidef.SUB_RESOURCE_ATTRIBUTE_MAP[apidef.COLLECTION_NAME].get("},{"line_number":60,"context_line":"            \u0027parameters\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        controller \u003d base.create_resource(apidef.COLLECTION_NAME,"},{"line_number":63,"context_line":"                                          apidef.RESOURCE_NAME,"},{"line_number":64,"context_line":"                                          plugin, params,"},{"line_number":65,"context_line":"                                          allow_bulk\u003dTrue,"},{"line_number":66,"context_line":"                                          parent\u003dparent,"},{"line_number":67,"context_line":"                                          allow_pagination\u003dTrue,"},{"line_number":68,"context_line":"                                          allow_sorting\u003dTrue)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        resource \u003d api_extensions.ResourceExtension("},{"line_number":71,"context_line":"            apidef.COLLECTION_NAME,"},{"line_number":72,"context_line":"            controller, parent,"},{"line_number":73,"context_line":"            attr_map\u003dparams)"},{"line_number":74,"context_line":"        resources.append(resource)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        return resources"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class PVLANPluginBase(service_base.ServicePluginBase, metaclass\u003dabc.ABCMeta):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5cd47f08_3b59408d","line":76,"range":{"start_line":35,"start_character":0,"end_line":76,"end_character":24},"updated":"2026-03-04 09:40:00.000000000","message":"I don\u0027t think you need those methods to be implemented here, probably having just:\n\n    api_definition \u003d apidef\n    \nin that extension class would be enough.","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"50d243d843461e392bc710e4f454914a76874ed9","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    api_definition \u003d apidef"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def get_plugin_interface(cls):"},{"line_number":37,"context_line":"        return PVLANPluginBase"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_resources(cls):"},{"line_number":41,"context_line":"        \"\"\"Returns Ext Resources.\"\"\""},{"line_number":42,"context_line":"        special_mappings \u003d {\u0027networks\u0027: \u0027network\u0027}"},{"line_number":43,"context_line":"        plural_mappings \u003d resource_helper.build_plural_mappings("},{"line_number":44,"context_line":"            special_mappings, itertools.chain("},{"line_number":45,"context_line":"                apidef.RESOURCE_ATTRIBUTE_MAP,"},{"line_number":46,"context_line":"                apidef.SUB_RESOURCE_ATTRIBUTE_MAP))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        resources \u003d resource_helper.build_resource_info("},{"line_number":49,"context_line":"                        plural_mappings,"},{"line_number":50,"context_line":"                        apidef.RESOURCE_ATTRIBUTE_MAP,"},{"line_number":51,"context_line":"                        plugin_consts.PVLAN,"},{"line_number":52,"context_line":"                        translate_name\u003dTrue,"},{"line_number":53,"context_line":"                        allow_bulk\u003dTrue)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        plugin \u003d directory.get_plugin(plugin_consts.PVLAN)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        parent \u003d apidef.SUB_RESOURCE_ATTRIBUTE_MAP["},{"line_number":58,"context_line":"            apidef.COLLECTION_NAME].get(\u0027parent\u0027)"},{"line_number":59,"context_line":"        params \u003d apidef.SUB_RESOURCE_ATTRIBUTE_MAP[apidef.COLLECTION_NAME].get("},{"line_number":60,"context_line":"            \u0027parameters\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        controller \u003d base.create_resource(apidef.COLLECTION_NAME,"},{"line_number":63,"context_line":"                                          apidef.RESOURCE_NAME,"},{"line_number":64,"context_line":"                                          plugin, params,"},{"line_number":65,"context_line":"                                          allow_bulk\u003dTrue,"},{"line_number":66,"context_line":"                                          parent\u003dparent,"},{"line_number":67,"context_line":"                                          allow_pagination\u003dTrue,"},{"line_number":68,"context_line":"                                          allow_sorting\u003dTrue)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        resource \u003d api_extensions.ResourceExtension("},{"line_number":71,"context_line":"            apidef.COLLECTION_NAME,"},{"line_number":72,"context_line":"            controller, parent,"},{"line_number":73,"context_line":"            attr_map\u003dparams)"},{"line_number":74,"context_line":"        resources.append(resource)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        return resources"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class PVLANPluginBase(service_base.ServicePluginBase, metaclass\u003dabc.ABCMeta):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f1069d33_c367f4ae","line":76,"range":{"start_line":35,"start_character":0,"end_line":76,"end_character":24},"in_reply_to":"5cd47f08_3b59408d","updated":"2026-03-09 08:48:23.000000000","message":"Done","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        return resources"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class PVLANPluginBase(service_base.ServicePluginBase, metaclass\u003dabc.ABCMeta):"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    path_prefix \u003d apidef.API_PREFIX"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"29343a45_f12f9904","line":79,"updated":"2026-03-04 09:40:00.000000000","message":"I also don\u0027t think we need this base class for the service plugin, especially that we will not implement really new API endpoints but only extend existing resources (network and port)","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"50d243d843461e392bc710e4f454914a76874ed9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        return resources"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class PVLANPluginBase(service_base.ServicePluginBase, metaclass\u003dabc.ABCMeta):"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    path_prefix \u003d apidef.API_PREFIX"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"8696edba_9c7b0026","line":79,"in_reply_to":"29343a45_f12f9904","updated":"2026-03-09 08:48:23.000000000","message":"Acknowledged","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"}],"neutron/objects/network.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d2f223c1caae2f2ca2437079f35c0f306c0e71a","unresolved":true,"context_lines":[{"line_number":208,"context_line":"class Network(rbac_db.NeutronRbacObject):"},{"line_number":209,"context_line":"    # Version 1.0: Initial version"},{"line_number":210,"context_line":"    # Version 1.1: Changed \u0027mtu\u0027 to be not nullable"},{"line_number":211,"context_line":"    # Version 1.2: Added \u0027qinq\u0027 field"},{"line_number":212,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    rbac_db_cls \u003d NetworkRBAC"}],"source_content_type":"text/x-python","patch_set":37,"id":"10db0475_48ee16ff","line":211,"updated":"2026-05-13 13:05:05.000000000","message":"I think you should bump version of Network object too","commit_id":"3b1a0829cc0b12eceb2072f8525754f94033bf05"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"741dfb322653dd2c257b9a64acf23f830b8555f0","unresolved":false,"context_lines":[{"line_number":208,"context_line":"class Network(rbac_db.NeutronRbacObject):"},{"line_number":209,"context_line":"    # Version 1.0: Initial version"},{"line_number":210,"context_line":"    # Version 1.1: Changed \u0027mtu\u0027 to be not nullable"},{"line_number":211,"context_line":"    # Version 1.2: Added \u0027qinq\u0027 field"},{"line_number":212,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    rbac_db_cls \u003d NetworkRBAC"}],"source_content_type":"text/x-python","patch_set":37,"id":"60a520b5_41a3f544","line":211,"in_reply_to":"10db0475_48ee16ff","updated":"2026-05-14 13:17:37.000000000","message":"Done","commit_id":"3b1a0829cc0b12eceb2072f8525754f94033bf05"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1a827d5dd3c927c478ee20110afb9beaef5ed6f6","unresolved":true,"context_lines":[{"line_number":43,"context_line":"    #              StringField to UUIDField"},{"line_number":44,"context_line":"    # Version 1.3: Changed \u0027target_tenant\u0027 to \u0027target_project\u0027"},{"line_number":45,"context_line":"    # Version 1.4: Added \u0027pvlan\u0027 field"},{"line_number":46,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    db_model \u003d rbac_db_models.NetworkRBAC"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"20bafd2c_e5b50e82","line":46,"updated":"2026-05-18 08:25:31.000000000","message":"sorry that I didn\u0027t commented it earlier but why do you need to bump version of this object? \"pvlan\" field is added to the `Network` object, not to `NetworkRBAC`","commit_id":"a7e8e91bce6f06315ade80b1957ac0c98fc2a7e5"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9baa74b477260d4a7129a49d5f7fa73a4d510272","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    #              StringField to UUIDField"},{"line_number":44,"context_line":"    # Version 1.3: Changed \u0027target_tenant\u0027 to \u0027target_project\u0027"},{"line_number":45,"context_line":"    # Version 1.4: Added \u0027pvlan\u0027 field"},{"line_number":46,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    db_model \u003d rbac_db_models.NetworkRBAC"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"966a8411_165514e6","line":46,"in_reply_to":"20bafd2c_e5b50e82","updated":"2026-05-18 16:10:59.000000000","message":"Done","commit_id":"a7e8e91bce6f06315ade80b1957ac0c98fc2a7e5"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    #              StringField to UUIDField"},{"line_number":44,"context_line":"    # Version 1.3: Changed \u0027target_tenant\u0027 to \u0027target_project\u0027"},{"line_number":45,"context_line":"    # Version 1.4: Added \u0027pvlan\u0027 field"},{"line_number":46,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    db_model \u003d rbac_db_models.NetworkRBAC"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"c01edd96_c8c1f66e","line":46,"in_reply_to":"20bafd2c_e5b50e82","updated":"2026-05-20 15:31:23.000000000","message":"Done","commit_id":"a7e8e91bce6f06315ade80b1957ac0c98fc2a7e5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1a827d5dd3c927c478ee20110afb9beaef5ed6f6","unresolved":true,"context_lines":[{"line_number":210,"context_line":"    # Version 1.1: Changed \u0027mtu\u0027 to be not nullable"},{"line_number":211,"context_line":"    # Version 1.2: Added \u0027qinq\u0027 field"},{"line_number":212,"context_line":"    # Version 1.3: Added \u0027pvlan\u0027 field"},{"line_number":213,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    rbac_db_cls \u003d NetworkRBAC"},{"line_number":216,"context_line":"    db_model \u003d models_v2.Network"}],"source_content_type":"text/x-python","patch_set":41,"id":"6dc72885_af4cd67c","line":213,"updated":"2026-05-18 08:25:31.000000000","message":"now You should also create compatibility method to drop \"pvlan\" field if target_version is \u003c 1.3","commit_id":"a7e8e91bce6f06315ade80b1957ac0c98fc2a7e5"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9baa74b477260d4a7129a49d5f7fa73a4d510272","unresolved":false,"context_lines":[{"line_number":210,"context_line":"    # Version 1.1: Changed \u0027mtu\u0027 to be not nullable"},{"line_number":211,"context_line":"    # Version 1.2: Added \u0027qinq\u0027 field"},{"line_number":212,"context_line":"    # Version 1.3: Added \u0027pvlan\u0027 field"},{"line_number":213,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    rbac_db_cls \u003d NetworkRBAC"},{"line_number":216,"context_line":"    db_model \u003d models_v2.Network"}],"source_content_type":"text/x-python","patch_set":41,"id":"843a9348_6ea4b519","line":213,"in_reply_to":"6dc72885_af4cd67c","updated":"2026-05-18 16:10:59.000000000","message":"Done","commit_id":"a7e8e91bce6f06315ade80b1957ac0c98fc2a7e5"}],"neutron/objects/pvlan.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    fields \u003d {"},{"line_number":47,"context_line":"        \u0027port_id\u0027: common_types.UUIDField(),"},{"line_number":48,"context_line":"        \u0027pvlan_type\u0027: obj_fields.StringField(),"},{"line_number":49,"context_line":"        \u0027pvlan_community\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":18,"id":"9d425176_7e27756d","line":48,"updated":"2026-04-10 13:32:41.000000000","message":"for this I think we can have new Enum type, like we have for other types in https://github.com/openstack/neutron-lib/blob/master/neutron_lib/objects/common_types.py","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    fields \u003d {"},{"line_number":47,"context_line":"        \u0027port_id\u0027: common_types.UUIDField(),"},{"line_number":48,"context_line":"        \u0027pvlan_type\u0027: obj_fields.StringField(),"},{"line_number":49,"context_line":"        \u0027pvlan_community\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":18,"id":"7aff13c5_64c00af5","line":48,"in_reply_to":"9d425176_7e27756d","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"}],"neutron/services/pvlan/drivers/ovn/driver.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron_lib.services.qos import base"},{"line_number":14,"context_line":"from oslo_config import cfg"},{"line_number":15,"context_line":"from oslo_log import log as logging"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c5ef18b0_97795cae","line":13,"updated":"2026-03-04 09:40:00.000000000","message":"I think we should have base pvlan driver, not use QoS one here","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"50d243d843461e392bc710e4f454914a76874ed9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron_lib.services.qos import base"},{"line_number":14,"context_line":"from oslo_config import cfg"},{"line_number":15,"context_line":"from oslo_log import log as logging"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"43d3af5b_478a4c01","line":13,"in_reply_to":"c5ef18b0_97795cae","updated":"2026-03-09 08:48:23.000000000","message":"oh wow that\u0027s clearly some copy paste error, I have not really started doing much around the driver so I did not double-check :) thanks for pointing it out!","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"PVLAN_PLUGIN \u003d \u0027pvlan_plugin\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def register(mech_driver):"}],"source_content_type":"text/x-python","patch_set":32,"id":"b90ff718_00d6bd7a","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":2},"updated":"2026-05-07 07:05:51.000000000","message":"Add a note to move this to `neutron_lib.callbacks.resources`","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"PVLAN_PLUGIN \u003d \u0027pvlan_plugin\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def register(mech_driver):"}],"source_content_type":"text/x-python","patch_set":32,"id":"7ed83e2c_3bc9990f","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":2},"in_reply_to":"b90ff718_00d6bd7a","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"2bb5e787_d27707e1","line":58,"range":{"start_line":54,"start_character":2,"end_line":58,"end_character":1},"updated":"2026-05-07 07:05:51.000000000","message":"This is not defined","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":32,"id":"d06fe6d0_e95e7d38","line":58,"range":{"start_line":54,"start_character":2,"end_line":58,"end_character":1},"in_reply_to":"2bb5e787_d27707e1","updated":"2026-05-11 09:22:42.000000000","message":"I just added the function as a placeholder because I name it in neutron/services/pvlan/pvlan_plugin.py but the actual content is defined in the follow-up patch. This was the best separation I thought I could do.","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"}],"neutron/services/pvlan/exceptions.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron._i18n import _"},{"line_number":17,"context_line":"from neutron_lib import exceptions as n_exc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class PVLANNotEnabledOnNetwork(n_exc.NeutronException):"}],"source_content_type":"text/x-python","patch_set":18,"id":"dcfae8e6_0760a403","line":17,"updated":"2026-04-10 13:32:41.000000000","message":"please split those imports into 2 separate sections","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron._i18n import _"},{"line_number":17,"context_line":"from neutron_lib import exceptions as n_exc"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class PVLANNotEnabledOnNetwork(n_exc.NeutronException):"}],"source_content_type":"text/x-python","patch_set":18,"id":"b545e795_acc47127","line":17,"in_reply_to":"dcfae8e6_0760a403","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"}],"neutron/services/pvlan/pvlan_plugin.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                port_id\u003dport_id).first()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @db_api.CONTEXT_WRITER"},{"line_number":104,"context_line":"    def update_pvlan_network(self, context, network_id, enable\u003dFalse):"},{"line_number":105,"context_line":"        \"\"\"Enable or disable PVLAN on a network.\"\"\""},{"line_number":106,"context_line":"        LOG.debug(\"Updating PVLAN for network %s: enable\u003d%s\","},{"line_number":107,"context_line":"                  network_id, enable)"}],"source_content_type":"text/x-python","patch_set":1,"id":"aa1598bb_5812ea3a","line":104,"updated":"2026-03-04 09:40:00.000000000","message":"how this method is called? Shouldn\u0027t it be subscribed to e.g. network_update BEFORE_COMMIT event?","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"c6fc5db4028544b102ad51e5995cc352dfce0e27","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                port_id\u003dport_id).first()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @db_api.CONTEXT_WRITER"},{"line_number":104,"context_line":"    def update_pvlan_network(self, context, network_id, enable\u003dFalse):"},{"line_number":105,"context_line":"        \"\"\"Enable or disable PVLAN on a network.\"\"\""},{"line_number":106,"context_line":"        LOG.debug(\"Updating PVLAN for network %s: enable\u003d%s\","},{"line_number":107,"context_line":"                  network_id, enable)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2d5fda0e_2efd13ed","line":104,"in_reply_to":"aa1598bb_5812ea3a","updated":"2026-04-06 22:33:13.000000000","message":"Done","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5968cf4bb1fe3fe81ec01110890d7f4245f39005","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        return network_pvlan"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    @db_api.CONTEXT_WRITER"},{"line_number":123,"context_line":"    def update_pvlan_port(self, context, port_id, pvlan_type\u003dNone,"},{"line_number":124,"context_line":"                          community\u003dNone):"},{"line_number":125,"context_line":"        \"\"\"Update PVLAN configuration for a port.\"\"\""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"28ead1da_4e38396c","line":123,"updated":"2026-03-04 09:40:00.000000000","message":"same question here","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"c6fc5db4028544b102ad51e5995cc352dfce0e27","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        return network_pvlan"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    @db_api.CONTEXT_WRITER"},{"line_number":123,"context_line":"    def update_pvlan_port(self, context, port_id, pvlan_type\u003dNone,"},{"line_number":124,"context_line":"                          community\u003dNone):"},{"line_number":125,"context_line":"        \"\"\"Update PVLAN configuration for a port.\"\"\""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c149240b_779d30ff","line":123,"in_reply_to":"28ead1da_4e38396c","updated":"2026-04-06 22:33:13.000000000","message":"Done","commit_id":"519b35144fd8856e226060976bfe9892b172cb94"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":26,"context_line":"from neutron_lib.services import base as service_base"},{"line_number":27,"context_line":"from neutron_lib.services.pvlan import constants as pvlan_const"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"from neutron._i18n import _"},{"line_number":32,"context_line":"from neutron.db.models import pvlan as pvlan_models"}],"source_content_type":"text/x-python","patch_set":18,"id":"90bfe823_b036923e","line":29,"updated":"2026-04-10 13:32:41.000000000","message":"this import should be in the same section with neutron_lib imports","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron_lib.services import base as service_base"},{"line_number":27,"context_line":"from neutron_lib.services.pvlan import constants as pvlan_const"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_log import log as logging"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"from neutron._i18n import _"},{"line_number":32,"context_line":"from neutron.db.models import pvlan as pvlan_models"}],"source_content_type":"text/x-python","patch_set":18,"id":"90656da7_c5b7817b","line":29,"in_reply_to":"90bfe823_b036923e","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        \"\"\"Get PVLAN configuration for a port.\"\"\""},{"line_number":113,"context_line":"        return context.session.query("},{"line_number":114,"context_line":"            pvlan_models.PortPVLAN).filter_by("},{"line_number":115,"context_line":"                port_id\u003dport_id).first()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @db_api.CONTEXT_READER"},{"line_number":118,"context_line":"    def _get_networkpvlan(self, context, network_id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f563066_6aa191f4","line":115,"updated":"2026-04-10 13:32:41.000000000","message":"why you are making direct call to db here and not use OVO objects?","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        \"\"\"Get PVLAN configuration for a port.\"\"\""},{"line_number":113,"context_line":"        return context.session.query("},{"line_number":114,"context_line":"            pvlan_models.PortPVLAN).filter_by("},{"line_number":115,"context_line":"                port_id\u003dport_id).first()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @db_api.CONTEXT_READER"},{"line_number":118,"context_line":"    def _get_networkpvlan(self, context, network_id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fb271a7_1fea4a9c","line":115,"in_reply_to":"3f563066_6aa191f4","updated":"2026-04-13 18:27:30.000000000","message":"You are right, I did not realize I could do it like that, I think I have fixed it now. Thanks!","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        \"\"\"Get PVLAN configuration for a port.\"\"\""},{"line_number":113,"context_line":"        return context.session.query("},{"line_number":114,"context_line":"            pvlan_models.PortPVLAN).filter_by("},{"line_number":115,"context_line":"                port_id\u003dport_id).first()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @db_api.CONTEXT_READER"},{"line_number":118,"context_line":"    def _get_networkpvlan(self, context, network_id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"06ef6659_97dd5edf","line":115,"in_reply_to":"9fb271a7_1fea4a9c","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":119,"context_line":"        \"\"\"Get Network PVLAN DB entry for a network.\"\"\""},{"line_number":120,"context_line":"        return context.session.query("},{"line_number":121,"context_line":"            pvlan_models.NetworkPVLAN).filter_by("},{"line_number":122,"context_line":"                network_id\u003dnetwork_id).first()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _pvlan_network_update(self, resource, event, trigger, payload\u003dNone):"},{"line_number":125,"context_line":"        \"\"\"Handle network update events to manage PVLAN.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"c8ea45d3_39005a7c","line":122,"updated":"2026-04-10 13:32:41.000000000","message":"same here","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        \"\"\"Get Network PVLAN DB entry for a network.\"\"\""},{"line_number":120,"context_line":"        return context.session.query("},{"line_number":121,"context_line":"            pvlan_models.NetworkPVLAN).filter_by("},{"line_number":122,"context_line":"                network_id\u003dnetwork_id).first()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _pvlan_network_update(self, resource, event, trigger, payload\u003dNone):"},{"line_number":125,"context_line":"        \"\"\"Handle network update events to manage PVLAN.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"32615c90_79d5516b","line":122,"in_reply_to":"c8ea45d3_39005a7c","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                network_id\u003dnetwork_id,"},{"line_number":145,"context_line":"                pvlan\u003denable_pvlan"},{"line_number":146,"context_line":"            )"},{"line_number":147,"context_line":"        context.session.add(networkpvlan)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _pvlan_port_update(self, resource, event, trigger, payload\u003dNone):"},{"line_number":150,"context_line":"        \"\"\"Handle port update events to manage PVLAN.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"0693939d_38b27f56","line":147,"updated":"2026-04-10 13:32:41.000000000","message":"and here (and in any other places in this sevice plugin as well)","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                network_id\u003dnetwork_id,"},{"line_number":145,"context_line":"                pvlan\u003denable_pvlan"},{"line_number":146,"context_line":"            )"},{"line_number":147,"context_line":"        context.session.add(networkpvlan)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _pvlan_port_update(self, resource, event, trigger, payload\u003dNone):"},{"line_number":150,"context_line":"        \"\"\"Handle port update events to manage PVLAN.\"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"2d3f0574_ba15eb35","line":147,"in_reply_to":"0693939d_38b27f56","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":191,"context_line":"                pvlan_type\u003dpvlan_type,"},{"line_number":192,"context_line":"                pvlan_community\u003dpvlan_community"},{"line_number":193,"context_line":"            )"},{"line_number":194,"context_line":"        context.session.add(portpvlan)"}],"source_content_type":"text/x-python","patch_set":18,"id":"dbd13091_d3ae990c","line":194,"updated":"2026-04-10 13:32:41.000000000","message":"shouldn\u0027t you also call backend driver in each of those methods?","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":true,"context_lines":[{"line_number":191,"context_line":"                pvlan_type\u003dpvlan_type,"},{"line_number":192,"context_line":"                pvlan_community\u003dpvlan_community"},{"line_number":193,"context_line":"            )"},{"line_number":194,"context_line":"        context.session.add(portpvlan)"}],"source_content_type":"text/x-python","patch_set":18,"id":"72d212df_0fb9394a","line":194,"in_reply_to":"dbd13091_d3ae990c","updated":"2026-04-13 18:27:30.000000000","message":"Right now the OVN driver part is not there so I\u0027m not sure of what is the proper way of calling the backend driver and how it works.","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6fda80595d061373be5964a775688580061d1b6e","unresolved":true,"context_lines":[{"line_number":149,"context_line":"                                    context\u003dcontext)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _pvlan_port_update(self, resource, event, trigger, payload\u003dNone,"},{"line_number":152,"context_line":"                           port\u003dNone, context\u003dNone):"},{"line_number":153,"context_line":"        \"\"\"Handle port update events to manage PVLAN.\"\"\""},{"line_number":154,"context_line":"        context \u003d payload.context if payload else context"},{"line_number":155,"context_line":"        port_id \u003d port.id if port else payload.resource_id"}],"source_content_type":"text/x-python","patch_set":26,"id":"1c3eefe1_e18e93d9","line":152,"updated":"2026-04-21 08:38:37.000000000","message":"I think this could be done a bit differently. You could have method which would be subscribed to the PORT_UPDATE event which would be just kind of event handler and then another private method which would implement actual logic which is currently in the _pvlan_port_update() method. So it would be something like:\n\n    def pvlan_port_update(self, resource, event, trigger, payload\u003dNone,\n                           port\u003dNone, context\u003dNone):\n        return self._pvlan_port_update(...)\n        \n\nThat way you could e.g. optionally pass \"networkpvlan\" value as argument to the self._pvlan_port_update() thus when it would be called from L148 you would need to get it from db only once, not once for each port like is now in L176.","commit_id":"5786537d6fb3107f586bf6c74b5a7aad8655d5f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"c2057fe86dcbdd9328a7b3372e85fa7b9637ab60","unresolved":true,"context_lines":[{"line_number":149,"context_line":"                                    context\u003dcontext)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _pvlan_port_update(self, resource, event, trigger, payload\u003dNone,"},{"line_number":152,"context_line":"                           port\u003dNone, context\u003dNone):"},{"line_number":153,"context_line":"        \"\"\"Handle port update events to manage PVLAN.\"\"\""},{"line_number":154,"context_line":"        context \u003d payload.context if payload else context"},{"line_number":155,"context_line":"        port_id \u003d port.id if port else payload.resource_id"}],"source_content_type":"text/x-python","patch_set":26,"id":"90a20d70_8ff0f2a8","line":152,"in_reply_to":"1c3eefe1_e18e93d9","updated":"2026-04-29 08:53:49.000000000","message":"I think you are totally right, fixed!","commit_id":"5786537d6fb3107f586bf6c74b5a7aad8655d5f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                    context\u003dcontext)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _pvlan_port_update(self, resource, event, trigger, payload\u003dNone,"},{"line_number":152,"context_line":"                           port\u003dNone, context\u003dNone):"},{"line_number":153,"context_line":"        \"\"\"Handle port update events to manage PVLAN.\"\"\""},{"line_number":154,"context_line":"        context \u003d payload.context if payload else context"},{"line_number":155,"context_line":"        port_id \u003d port.id if port else payload.resource_id"}],"source_content_type":"text/x-python","patch_set":26,"id":"36ed47c3_02124b84","line":152,"in_reply_to":"90a20d70_8ff0f2a8","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"5786537d6fb3107f586bf6c74b5a7aad8655d5f1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    def get_plugin_description(self):"},{"line_number":57,"context_line":"        return \"PVLAN Service Plugin\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    required_service_plugins, _rpc_notifications_required \u003d \\"},{"line_number":60,"context_line":"        _required_service_plugins()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    supported_extension_aliases \u003d [apidef.ALIAS]"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"63740789_fa3cc5c5","line":60,"range":{"start_line":59,"start_character":4,"end_line":60,"end_character":35},"updated":"2026-05-07 07:05:51.000000000","message":"Why don\u0027t you assign a value directly instead of using a method?\n```\nrequired_service_plugins \u003d []\n_rpc_notifications_required \u003d False\n```\n\nIn any case:\n* If `required_service_plugins\u003d[]`, there is no need to define it\n* Where `_rpc_notifications_required` is used?","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def get_plugin_description(self):"},{"line_number":57,"context_line":"        return \"PVLAN Service Plugin\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    required_service_plugins, _rpc_notifications_required \u003d \\"},{"line_number":60,"context_line":"        _required_service_plugins()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    supported_extension_aliases \u003d [apidef.ALIAS]"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"c5bc0009_f79509f0","line":60,"range":{"start_line":59,"start_character":4,"end_line":60,"end_character":35},"in_reply_to":"63740789_fa3cc5c5","updated":"2026-05-11 09:22:42.000000000","message":"I was not sure if I should leave the function defined in case in the future OVS does need RPC for anything, although it is not needed for OVN. When in doubt I tried to keep stuff as similar to logging / qos plugin as possible. Fixed! o\u003e","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"01cdc8a888d727bd39a3e5efa0f8835400dbb1cd","unresolved":true,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    __native_pagination_support \u003d True"},{"line_number":65,"context_line":"    __native_sorting_support \u003d True"},{"line_number":66,"context_line":"    __filter_validation_support \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __init__(self):"},{"line_number":69,"context_line":"        super().__init__()"}],"source_content_type":"text/x-python","patch_set":32,"id":"dc282d20_51d4db5f","line":66,"updated":"2026-05-06 10:59:20.000000000","message":"__filter_validation_support can be removed from here as no longer needed since https://review.opendev.org/c/openstack/neutron/+/978463 as this plugin inheriting from ServicePluginBase","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    __native_pagination_support \u003d True"},{"line_number":65,"context_line":"    __native_sorting_support \u003d True"},{"line_number":66,"context_line":"    __filter_validation_support \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __init__(self):"},{"line_number":69,"context_line":"        super().__init__()"}],"source_content_type":"text/x-python","patch_set":32,"id":"02e1b064_32f5b097","line":66,"in_reply_to":"bb99bc26_d50e8b3e","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    __native_pagination_support \u003d True"},{"line_number":65,"context_line":"    __native_sorting_support \u003d True"},{"line_number":66,"context_line":"    __filter_validation_support \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __init__(self):"},{"line_number":69,"context_line":"        super().__init__()"}],"source_content_type":"text/x-python","patch_set":32,"id":"bb99bc26_d50e8b3e","line":66,"in_reply_to":"dc282d20_51d4db5f","updated":"2026-05-07 07:05:51.000000000","message":"+1","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"01cdc8a888d727bd39a3e5efa0f8835400dbb1cd","unresolved":true,"context_lines":[{"line_number":116,"context_line":"        context \u003d payload.context"},{"line_number":117,"context_line":"        network_id \u003d payload.resource_id"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        LOG.debug(\"Payload data (pvlan): %s\","},{"line_number":120,"context_line":"                  payload.request_body.get(pvlan_const.PVLAN))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        enable_pvlan \u003d payload.request_body.get(pvlan_const.PVLAN)"}],"source_content_type":"text/x-python","patch_set":32,"id":"60a6429a_19c449fd","line":119,"updated":"2026-05-06 10:59:20.000000000","message":"debug here looks duplicate of below so can be get rid of it.","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        context \u003d payload.context"},{"line_number":117,"context_line":"        network_id \u003d payload.resource_id"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        LOG.debug(\"Payload data (pvlan): %s\","},{"line_number":120,"context_line":"                  payload.request_body.get(pvlan_const.PVLAN))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        enable_pvlan \u003d payload.request_body.get(pvlan_const.PVLAN)"}],"source_content_type":"text/x-python","patch_set":32,"id":"a12fc115_0a5c4a9c","line":119,"in_reply_to":"60a6429a_19c449fd","updated":"2026-05-11 09:22:42.000000000","message":"Totally, this is a leftover of my debugging, sorry!","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"01cdc8a888d727bd39a3e5efa0f8835400dbb1cd","unresolved":true,"context_lines":[{"line_number":120,"context_line":"                  payload.request_body.get(pvlan_const.PVLAN))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        enable_pvlan \u003d payload.request_body.get(pvlan_const.PVLAN)"},{"line_number":123,"context_line":"        LOG.debug(\"Handling network %s event for %s: pvlan\u003d%s\","},{"line_number":124,"context_line":"                  event, network_id, enable_pvlan)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if enable_pvlan is None:"}],"source_content_type":"text/x-python","patch_set":32,"id":"4d18e6ca_c84346c4","line":123,"updated":"2026-05-06 10:59:20.000000000","message":"This debug could be added only when enable_pvlan not None?","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                  payload.request_body.get(pvlan_const.PVLAN))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        enable_pvlan \u003d payload.request_body.get(pvlan_const.PVLAN)"},{"line_number":123,"context_line":"        LOG.debug(\"Handling network %s event for %s: pvlan\u003d%s\","},{"line_number":124,"context_line":"                  event, network_id, enable_pvlan)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if enable_pvlan is None:"}],"source_content_type":"text/x-python","patch_set":32,"id":"ecbcbb96_08f1a147","line":123,"in_reply_to":"4d18e6ca_c84346c4","updated":"2026-05-11 09:22:42.000000000","message":"Makes sense :)","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e6437d888e534776af593e01e77d8c73b46a8463","unresolved":true,"context_lines":[{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":130,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":131,"context_line":"        if networkpvlan:"},{"line_number":132,"context_line":"            networkpvlan.update_fields({\u0027pvlan\u0027: enable_pvlan})"},{"line_number":133,"context_line":"            networkpvlan.update()"}],"source_content_type":"text/x-python","patch_set":32,"id":"d23d3f6a_5920ba21","line":130,"updated":"2026-05-07 08:31:07.000000000","message":"I think that if you would add pvlan field as syntetic field of the Network OVO object, it would be loaded automatically from db in joined query so that this extra call here wouldn\u0027t be needed. See how this is done with different attributes of e.g. port OVO: https://github.com/openstack/neutron/blob/master/neutron/objects/ports.py#L402","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":130,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":131,"context_line":"        if networkpvlan:"},{"line_number":132,"context_line":"            networkpvlan.update_fields({\u0027pvlan\u0027: enable_pvlan})"},{"line_number":133,"context_line":"            networkpvlan.update()"}],"source_content_type":"text/x-python","patch_set":32,"id":"e334dd53_5fcf1cfd","line":130,"in_reply_to":"d23d3f6a_5920ba21","updated":"2026-05-11 09:22:42.000000000","message":"I had no idea these existed, thanks :D","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e6437d888e534776af593e01e77d8c73b46a8463","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        context \u003d payload.context"},{"line_number":148,"context_line":"        port_id \u003d payload.resource_id"},{"line_number":149,"context_line":"        portpvlan \u003d pvlan_objects.PortPVLAN.get_object("},{"line_number":150,"context_line":"            context, port_id\u003dport_id)"},{"line_number":151,"context_line":"        if not portpvlan:"},{"line_number":152,"context_line":"            return"},{"line_number":153,"context_line":"        prev_pvlan_type \u003d None"}],"source_content_type":"text/x-python","patch_set":32,"id":"2561a3a7_a3fcc228","line":150,"updated":"2026-05-07 08:31:07.000000000","message":"same comment about synthetic fields applies here as well","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        context \u003d payload.context"},{"line_number":148,"context_line":"        port_id \u003d payload.resource_id"},{"line_number":149,"context_line":"        portpvlan \u003d pvlan_objects.PortPVLAN.get_object("},{"line_number":150,"context_line":"            context, port_id\u003dport_id)"},{"line_number":151,"context_line":"        if not portpvlan:"},{"line_number":152,"context_line":"            return"},{"line_number":153,"context_line":"        prev_pvlan_type \u003d None"}],"source_content_type":"text/x-python","patch_set":32,"id":"644ae8b2_0de3bcb3","line":150,"in_reply_to":"2561a3a7_a3fcc228","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":152,"context_line":"            return"},{"line_number":153,"context_line":"        prev_pvlan_type \u003d None"},{"line_number":154,"context_line":"        prev_pvlan_community \u003d None"},{"line_number":155,"context_line":"        if len(payload.states) \u003e 1:"},{"line_number":156,"context_line":"            original_port \u003d payload.states[0]"},{"line_number":157,"context_line":"            prev_pvlan_type \u003d original_port.get(pvlan_const.PVLAN_TYPE)"},{"line_number":158,"context_line":"            prev_pvlan_community \u003d original_port.get("}],"source_content_type":"text/x-python","patch_set":32,"id":"9bfc121c_d0d5fe8c","line":155,"range":{"start_line":155,"start_character":30,"end_line":155,"end_character":34},"updated":"2026-05-07 07:05:51.000000000","message":"Why \u003e 1? Why not \u003e 0?","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return"},{"line_number":153,"context_line":"        prev_pvlan_type \u003d None"},{"line_number":154,"context_line":"        prev_pvlan_community \u003d None"},{"line_number":155,"context_line":"        if len(payload.states) \u003e 1:"},{"line_number":156,"context_line":"            original_port \u003d payload.states[0]"},{"line_number":157,"context_line":"            prev_pvlan_type \u003d original_port.get(pvlan_const.PVLAN_TYPE)"},{"line_number":158,"context_line":"            prev_pvlan_community \u003d original_port.get("}],"source_content_type":"text/x-python","patch_set":32,"id":"77906a23_e5224126","line":155,"range":{"start_line":155,"start_character":30,"end_line":155,"end_character":34},"in_reply_to":"9bfc121c_d0d5fe8c","updated":"2026-05-11 09:22:42.000000000","message":"I discarded this if completely since I think in AFTER_UPDATE we should always have the .states populated","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1527645bb8a89957d6760a31d17cc737dddc7947","unresolved":true,"context_lines":[{"line_number":157,"context_line":"            prev_pvlan_type \u003d original_port.get(pvlan_const.PVLAN_TYPE)"},{"line_number":158,"context_line":"            prev_pvlan_community \u003d original_port.get("},{"line_number":159,"context_line":"                pvlan_const.PVLAN_COMMUNITY)"},{"line_number":160,"context_line":"        self._driver.update_port(context, portpvlan,"},{"line_number":161,"context_line":"                                 prev_pvlan_type, prev_pvlan_community)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _pvlan_port_update_after_network_update(self, resource, event,"}],"source_content_type":"text/x-python","patch_set":32,"id":"d71e34d9_1686fb86","line":160,"range":{"start_line":160,"start_character":21,"end_line":160,"end_character":32},"updated":"2026-05-07 07:05:51.000000000","message":"This method does nothing","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":true,"context_lines":[{"line_number":157,"context_line":"            prev_pvlan_type \u003d original_port.get(pvlan_const.PVLAN_TYPE)"},{"line_number":158,"context_line":"            prev_pvlan_community \u003d original_port.get("},{"line_number":159,"context_line":"                pvlan_const.PVLAN_COMMUNITY)"},{"line_number":160,"context_line":"        self._driver.update_port(context, portpvlan,"},{"line_number":161,"context_line":"                                 prev_pvlan_type, prev_pvlan_community)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def _pvlan_port_update_after_network_update(self, resource, event,"}],"source_content_type":"text/x-python","patch_set":32,"id":"a31d0862_dd490eb1","line":160,"range":{"start_line":160,"start_character":21,"end_line":160,"end_character":32},"in_reply_to":"d71e34d9_1686fb86","updated":"2026-05-11 09:22:42.000000000","message":"it was a placeholder since right now this function won\u0027t be completed until the follow-up patch with the driver is added","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"01cdc8a888d727bd39a3e5efa0f8835400dbb1cd","unresolved":true,"context_lines":[{"line_number":208,"context_line":"            pvlan_const.PVLAN_TYPE, prev_pvlan_type)"},{"line_number":209,"context_line":"        pvlan_community \u003d request_body.get("},{"line_number":210,"context_line":"            pvlan_const.PVLAN_COMMUNITY, prev_pvlan_community)"},{"line_number":211,"context_line":"        if not network_id:"},{"line_number":212,"context_line":"            LOG.warning(\"Port %s doesn\u0027t have a network_id associated\","},{"line_number":213,"context_line":"                        port_id)"},{"line_number":214,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":32,"id":"64e50e90_b04c6efe","line":211,"updated":"2026-05-06 10:59:20.000000000","message":"just curios on what case this is possible i.e port without network id?\nand if there is such a case why not return in the beggining itself then here?","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            pvlan_const.PVLAN_TYPE, prev_pvlan_type)"},{"line_number":209,"context_line":"        pvlan_community \u003d request_body.get("},{"line_number":210,"context_line":"            pvlan_const.PVLAN_COMMUNITY, prev_pvlan_community)"},{"line_number":211,"context_line":"        if not network_id:"},{"line_number":212,"context_line":"            LOG.warning(\"Port %s doesn\u0027t have a network_id associated\","},{"line_number":213,"context_line":"                        port_id)"},{"line_number":214,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":32,"id":"a076d2ae_7169d01b","line":211,"in_reply_to":"64e50e90_b04c6efe","updated":"2026-05-11 09:22:42.000000000","message":"To be honest I think it should never happen (ports shouldn\u0027t be there with no network associated) but I wondered if there could be an inconsistency ever and if so that maybe I should send a warning. I added it here because it\u0027s were I started using network_id. I will remove this.","commit_id":"127a6106120fad4f75894e62d24cd8cf62ae4577"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5964683412fc445226246718b3f1d5dce7941ef7","unresolved":true,"context_lines":[{"line_number":80,"context_line":"        registry.subscribe(self.pvlan_port_update, resources.PORT,"},{"line_number":81,"context_line":"                           events.PRECOMMIT_UPDATE)"},{"line_number":82,"context_line":"        registry.subscribe(self._pvlan_port_driver_update, resources.PORT,"},{"line_number":83,"context_line":"                           events.AFTER_UPDATE)"},{"line_number":84,"context_line":"        registry.subscribe("},{"line_number":85,"context_line":"            self._pvlan_port_update_after_network_update,"},{"line_number":86,"context_line":"            resources.NETWORK, events.AFTER_UPDATE)"}],"source_content_type":"text/x-python","patch_set":33,"id":"43ac9fcf_87bdf9de","line":83,"updated":"2026-05-07 07:55:09.000000000","message":"why for port update you are subscribing to two events (PRECOMMIT_UPDATE and AFTER_UPDATE) but for port create only to the PRECOMMIT one?","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":true,"context_lines":[{"line_number":80,"context_line":"        registry.subscribe(self.pvlan_port_update, resources.PORT,"},{"line_number":81,"context_line":"                           events.PRECOMMIT_UPDATE)"},{"line_number":82,"context_line":"        registry.subscribe(self._pvlan_port_driver_update, resources.PORT,"},{"line_number":83,"context_line":"                           events.AFTER_UPDATE)"},{"line_number":84,"context_line":"        registry.subscribe("},{"line_number":85,"context_line":"            self._pvlan_port_update_after_network_update,"},{"line_number":86,"context_line":"            resources.NETWORK, events.AFTER_UPDATE)"}],"source_content_type":"text/x-python","patch_set":33,"id":"ea056984_f5addada","line":83,"in_reply_to":"43ac9fcf_87bdf9de","updated":"2026-05-11 09:22:42.000000000","message":"Because when I tried to do the call to the driver with AFTER_CREATE for port creation, nothing would work. This is because until the transaction is finished the LSP won\u0027t be available for Neutron to use. So I ended up having to do this in the follow-up patch:\nin `ovn_client.py`, (following the pattern that QoS uses):\n\n```\nself._qos_driver.create_port(context, txn, port, port_cmd) \n\nif self._pvlan_driver:\n    self._pvlan_driver.create_port(context, txn, port)\n```\nThis is the only way I was able to access the LSP and I could assign it to the respective PG on a single transaction to avoid inconsistencies.","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d2f223c1caae2f2ca2437079f35c0f306c0e71a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        registry.subscribe(self.pvlan_port_update, resources.PORT,"},{"line_number":81,"context_line":"                           events.PRECOMMIT_UPDATE)"},{"line_number":82,"context_line":"        registry.subscribe(self._pvlan_port_driver_update, resources.PORT,"},{"line_number":83,"context_line":"                           events.AFTER_UPDATE)"},{"line_number":84,"context_line":"        registry.subscribe("},{"line_number":85,"context_line":"            self._pvlan_port_update_after_network_update,"},{"line_number":86,"context_line":"            resources.NETWORK, events.AFTER_UPDATE)"}],"source_content_type":"text/x-python","patch_set":33,"id":"922e826b_a60b22d7","line":83,"in_reply_to":"ea056984_f5addada","updated":"2026-05-13 13:05:05.000000000","message":"Acknowledged","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5964683412fc445226246718b3f1d5dce7941ef7","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if enable_pvlan is None:"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":130,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":131,"context_line":"        if networkpvlan:"}],"source_content_type":"text/x-python","patch_set":33,"id":"b8af8604_ce175a19","line":128,"updated":"2026-05-07 07:55:09.000000000","message":"shouldn\u0027t you also check if network\u0027s port_security is set to True or False? In case it is set to False, we should probably return some error instead of configuring pvlan, no?","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"741dfb322653dd2c257b9a64acf23f830b8555f0","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if enable_pvlan is None:"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":130,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":131,"context_line":"        if networkpvlan:"}],"source_content_type":"text/x-python","patch_set":33,"id":"1d25cee8_3f875559","line":128,"in_reply_to":"05779e54_d318748d","updated":"2026-05-14 13:17:37.000000000","message":"You are right!! I got it mixed with the validation in ports, sorry! Now I think it is done","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if enable_pvlan is None:"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":130,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":131,"context_line":"        if networkpvlan:"}],"source_content_type":"text/x-python","patch_set":33,"id":"dea287c8_4291dd01","line":128,"in_reply_to":"b8af8604_ce175a19","updated":"2026-05-11 09:22:42.000000000","message":"I have checked this on openstacksdk, and also on the API, but you are right, it doesn\u0027t hurt to check here too. Done.","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d2f223c1caae2f2ca2437079f35c0f306c0e71a","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if enable_pvlan is None:"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":130,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":131,"context_line":"        if networkpvlan:"}],"source_content_type":"text/x-python","patch_set":33,"id":"05779e54_d318748d","line":128,"in_reply_to":"dea287c8_4291dd01","updated":"2026-05-13 13:05:05.000000000","message":"You shouldn\u0027t rely on the SDK for validation like that ever. SDK is just one way of making requests to API but You can use \"curl\" or any other tool if you want.\n\nYou said it\u0027s \"done\" but I still don\u0027t see that additional validation ever. Am I missing something or did You maybe forgot to push change to gerrit?","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5964683412fc445226246718b3f1d5dce7941ef7","unresolved":true,"context_lines":[{"line_number":149,"context_line":"        portpvlan \u003d pvlan_objects.PortPVLAN.get_object("},{"line_number":150,"context_line":"            context, port_id\u003dport_id)"},{"line_number":151,"context_line":"        if not portpvlan:"},{"line_number":152,"context_line":"            return"},{"line_number":153,"context_line":"        prev_pvlan_type \u003d None"},{"line_number":154,"context_line":"        prev_pvlan_community \u003d None"},{"line_number":155,"context_line":"        if len(payload.states) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":33,"id":"2e1c9b5c_0372f7f0","line":152,"updated":"2026-05-07 07:55:09.000000000","message":"same here? I think we should check if port security is enabled for that port","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":true,"context_lines":[{"line_number":149,"context_line":"        portpvlan \u003d pvlan_objects.PortPVLAN.get_object("},{"line_number":150,"context_line":"            context, port_id\u003dport_id)"},{"line_number":151,"context_line":"        if not portpvlan:"},{"line_number":152,"context_line":"            return"},{"line_number":153,"context_line":"        prev_pvlan_type \u003d None"},{"line_number":154,"context_line":"        prev_pvlan_community \u003d None"},{"line_number":155,"context_line":"        if len(payload.states) \u003e 1:"}],"source_content_type":"text/x-python","patch_set":33,"id":"2e2e3c84_3fb49c74","line":152,"in_reply_to":"2e1c9b5c_0372f7f0","updated":"2026-05-11 09:22:42.000000000","message":"This function is executed after update, so if we already checked on the precommit I don\u0027t see the utility for checking it AFTER_UPDATE too, at least from what I see? I have added it though just in case I\u0027m missing something, it doesn\u0027t hurt to double check either.","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5964683412fc445226246718b3f1d5dce7941ef7","unresolved":true,"context_lines":[{"line_number":166,"context_line":"        context \u003d payload.context"},{"line_number":167,"context_line":"        network_id \u003d payload.resource_id"},{"line_number":168,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":169,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":170,"context_line":"        for port in port_object.Port.get_objects("},{"line_number":171,"context_line":"                context, network_id\u003dnetwork_id):"},{"line_number":172,"context_line":"            portpvlan \u003d pvlan_objects.PortPVLAN.get_object("}],"source_content_type":"text/x-python","patch_set":33,"id":"36e3a392_1b636eea","line":169,"updated":"2026-05-07 07:55:09.000000000","message":"you should probably first check if pvlan was actually updated and if not exit from that method quickly, otherwise you will iterate over all ports for every network, even if e.g. network\u0027s description will be changed","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6257db1e37e109b3b04f4674d443cb540daed8a2","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        context \u003d payload.context"},{"line_number":167,"context_line":"        network_id \u003d payload.resource_id"},{"line_number":168,"context_line":"        networkpvlan \u003d pvlan_objects.NetworkPVLAN.get_object("},{"line_number":169,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":170,"context_line":"        for port in port_object.Port.get_objects("},{"line_number":171,"context_line":"                context, network_id\u003dnetwork_id):"},{"line_number":172,"context_line":"            portpvlan \u003d pvlan_objects.PortPVLAN.get_object("}],"source_content_type":"text/x-python","patch_set":33,"id":"452a1e9f_7519c7ad","line":169,"in_reply_to":"36e3a392_1b636eea","updated":"2026-05-11 09:22:42.000000000","message":"Done","commit_id":"145c02e20c96749adf2341eb044938c35da6f352"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86dea0fb3618bec491f3bc871a177e269b1f879d","unresolved":true,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"PVLAN_PLUGIN \u003d \u0027pvlan_plugin\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"@resource_extend.has_resource_extenders"}],"source_content_type":"text/x-python","patch_set":43,"id":"4b190ff6_f889bcd4","line":36,"updated":"2026-05-20 09:51:38.000000000","message":"nit: to add\n```# TODO(elvira): Move PVLAN_PLUGIN to neutron_lib.callbacks.resources```","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"PVLAN_PLUGIN \u003d \u0027pvlan_plugin\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"@resource_extend.has_resource_extenders"}],"source_content_type":"text/x-python","patch_set":43,"id":"b2526e6e_02bdb677","line":36,"in_reply_to":"4b190ff6_f889bcd4","updated":"2026-05-20 15:31:23.000000000","message":"Done","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86dea0fb3618bec491f3bc871a177e269b1f879d","unresolved":true,"context_lines":[{"line_number":152,"context_line":"            prev_pvlan_type \u003d original_port.get(pvlan_const.PVLAN_TYPE)"},{"line_number":153,"context_line":"            prev_pvlan_community \u003d original_port.get("},{"line_number":154,"context_line":"                pvlan_const.PVLAN_COMMUNITY)"},{"line_number":155,"context_line":"        self._driver.update_port(context, port,"},{"line_number":156,"context_line":"                                 prev_pvlan_type, prev_pvlan_community)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _pvlan_port_update_after_network_update(self, resource, event,"}],"source_content_type":"text/x-python","patch_set":43,"id":"ffeed4e5_d767dac7","line":155,"range":{"start_line":155,"start_character":8,"end_line":155,"end_character":47},"updated":"2026-05-20 09:51:38.000000000","message":"This call must be done checking if `self._driver` is not None","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":true,"context_lines":[{"line_number":152,"context_line":"            prev_pvlan_type \u003d original_port.get(pvlan_const.PVLAN_TYPE)"},{"line_number":153,"context_line":"            prev_pvlan_community \u003d original_port.get("},{"line_number":154,"context_line":"                pvlan_const.PVLAN_COMMUNITY)"},{"line_number":155,"context_line":"        self._driver.update_port(context, port,"},{"line_number":156,"context_line":"                                 prev_pvlan_type, prev_pvlan_community)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _pvlan_port_update_after_network_update(self, resource, event,"}],"source_content_type":"text/x-python","patch_set":43,"id":"13705bdb_bf59449b","line":155,"range":{"start_line":155,"start_character":8,"end_line":155,"end_character":47},"in_reply_to":"ffeed4e5_d767dac7","updated":"2026-05-20 15:31:23.000000000","message":"Solved! Shouldn\u0027t we always have a _driver in order to pvlan to correctly work, though?","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86dea0fb3618bec491f3bc871a177e269b1f879d","unresolved":true,"context_lines":[{"line_number":173,"context_line":"            updated_portpvlan \u003d self._pvlan_port_update("},{"line_number":174,"context_line":"                port\u003dport, network\u003dnetwork, context\u003dcontext)"},{"line_number":175,"context_line":"            if updated_portpvlan:"},{"line_number":176,"context_line":"                self._driver.update_port(context, port,"},{"line_number":177,"context_line":"                                         prev_pvlan_type,"},{"line_number":178,"context_line":"                                         prev_pvlan_community)"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"e59b0ba2_3bbff6d0","line":176,"range":{"start_line":176,"start_character":16,"end_line":176,"end_character":28},"updated":"2026-05-20 09:51:38.000000000","message":"This call must be done checking if `self._driver` is not None","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            updated_portpvlan \u003d self._pvlan_port_update("},{"line_number":174,"context_line":"                port\u003dport, network\u003dnetwork, context\u003dcontext)"},{"line_number":175,"context_line":"            if updated_portpvlan:"},{"line_number":176,"context_line":"                self._driver.update_port(context, port,"},{"line_number":177,"context_line":"                                         prev_pvlan_type,"},{"line_number":178,"context_line":"                                         prev_pvlan_community)"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"3dd9edba_1446b448","line":176,"range":{"start_line":176,"start_character":16,"end_line":176,"end_character":28},"in_reply_to":"e59b0ba2_3bbff6d0","updated":"2026-05-20 15:31:23.000000000","message":"Done","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86dea0fb3618bec491f3bc871a177e269b1f879d","unresolved":true,"context_lines":[{"line_number":216,"context_line":"        if not pvlan_type:"},{"line_number":217,"context_line":"            pvlan_type \u003d pvlan_const.PROMISCUOUS_TYPE"},{"line_number":218,"context_line":"        if pvlan_type !\u003d pvlan_const.COMMUNITY_TYPE:"},{"line_number":219,"context_line":"            if prev_pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE:"},{"line_number":220,"context_line":"                pvlan_community \u003d None"},{"line_number":221,"context_line":"            if pvlan_community:"},{"line_number":222,"context_line":"                raise pvlan_exc.PVLANCannotSetCommunityName("},{"line_number":223,"context_line":"                    port_id\u003dport_id)"},{"line_number":224,"context_line":"        if (not pvlan_community and"},{"line_number":225,"context_line":"                pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE):"},{"line_number":226,"context_line":"            raise pvlan_exc.PVLANCommunityNameRequired("}],"source_content_type":"text/x-python","patch_set":43,"id":"dbd95bbb_9c810726","line":223,"range":{"start_line":219,"start_character":12,"end_line":223,"end_character":36},"updated":"2026-05-20 09:51:38.000000000","message":"This is hiding an input error: if the user sets both community_type and a community name, it should fail. The logic here should be different:\n\n```\nif pvlan_type !\u003d pvlan_const.COMMUNITY_TYPE:\n    if pvlan_community:\n        raise pvlan_exc.PVLANCannotSetCommunityName(port_id\u003dport_id)\n    if prev_pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE:\n        pvlan_community \u003d None\n```","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        if not pvlan_type:"},{"line_number":217,"context_line":"            pvlan_type \u003d pvlan_const.PROMISCUOUS_TYPE"},{"line_number":218,"context_line":"        if pvlan_type !\u003d pvlan_const.COMMUNITY_TYPE:"},{"line_number":219,"context_line":"            if prev_pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE:"},{"line_number":220,"context_line":"                pvlan_community \u003d None"},{"line_number":221,"context_line":"            if pvlan_community:"},{"line_number":222,"context_line":"                raise pvlan_exc.PVLANCannotSetCommunityName("},{"line_number":223,"context_line":"                    port_id\u003dport_id)"},{"line_number":224,"context_line":"        if (not pvlan_community and"},{"line_number":225,"context_line":"                pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE):"},{"line_number":226,"context_line":"            raise pvlan_exc.PVLANCommunityNameRequired("}],"source_content_type":"text/x-python","patch_set":43,"id":"e1c4453c_4a74aabe","line":223,"range":{"start_line":219,"start_character":12,"end_line":223,"end_character":36},"in_reply_to":"dbd95bbb_9c810726","updated":"2026-05-20 15:31:23.000000000","message":"The intent of this was to set to None the community if someone updated from pvlan_type\u003dcommunity to a different pvlan_type (promiscuous or isolated)\n\nI have done the change you proposed and also changed how I assign the value to pvlan_community in order to solve this.","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86dea0fb3618bec491f3bc871a177e269b1f879d","unresolved":true,"context_lines":[{"line_number":239,"context_line":"        return True"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def _check_port_security(self, network, port_data):"},{"line_number":242,"context_line":"        if (network.pvlan and port_data.security and"},{"line_number":243,"context_line":"                not port_data.security.port_security_enabled and"},{"line_number":244,"context_line":"                not network.security.port_security_enabled):"},{"line_number":245,"context_line":"            raise pvlan_exc.PVLANPortSecurityDisabled(port_id\u003dport_data.id)"}],"source_content_type":"text/x-python","patch_set":43,"id":"2a1b313c_4a947b63","line":244,"range":{"start_line":242,"start_character":8,"end_line":244,"end_character":60},"updated":"2026-05-20 09:51:38.000000000","message":"This should be:\n```\nif (network.pvlan and\n    port_data.security and\n    (not port_data.security.port_security_enabled or\n     not network.security.port_security_enabled)\n    ):\n```\n\nThe last 2 conditions should be inclusive: if one of them is true, the condition will be valid","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"9b08306f9fff7275fe5e2a14bbbdbac1cd43dc27","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return True"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def _check_port_security(self, network, port_data):"},{"line_number":242,"context_line":"        if (network.pvlan and port_data.security and"},{"line_number":243,"context_line":"                not port_data.security.port_security_enabled and"},{"line_number":244,"context_line":"                not network.security.port_security_enabled):"},{"line_number":245,"context_line":"            raise pvlan_exc.PVLANPortSecurityDisabled(port_id\u003dport_data.id)"}],"source_content_type":"text/x-python","patch_set":43,"id":"4a14e91a_dd6d2403","line":244,"range":{"start_line":242,"start_character":8,"end_line":244,"end_character":60},"in_reply_to":"2a1b313c_4a947b63","updated":"2026-05-20 15:31:23.000000000","message":"Done","commit_id":"cada104769fdcc6a6f0477c2c01e8f56b3ec1970"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ae10168636094413a322b65dadf715e47a89b771","unresolved":true,"context_lines":[{"line_number":247,"context_line":"    def _check_port_security(self, network, port_data):"},{"line_number":248,"context_line":"        # OVN Metadata ports always have port_security disabled"},{"line_number":249,"context_line":"        # and work differently to usual ports."},{"line_number":250,"context_line":"        if self._driver:"},{"line_number":251,"context_line":"            mech_name \u003d type(self._driver._mech_driver).__name__"},{"line_number":252,"context_line":"            if (mech_name \u003d\u003d \u0027OVNMechanismDriver\u0027 and"},{"line_number":253,"context_line":"                    self._driver.is_metadata_port(port_data)):"},{"line_number":254,"context_line":"                return"},{"line_number":255,"context_line":"        # Default port_security_enabled is True so if no security is set,"},{"line_number":256,"context_line":"        # it means we are enforcing port security."},{"line_number":257,"context_line":"        # Same goes for network."}],"source_content_type":"text/x-python","patch_set":45,"id":"53f4ea03_bfa12694","line":254,"range":{"start_line":250,"start_character":8,"end_line":254,"end_character":22},"updated":"2026-05-25 08:14:21.000000000","message":"This can be done with:\n`if ovn_utils.is_ovn_metadata_port(port_data):`","commit_id":"aa3124e44edb8e443299035e17aeb6275af90557"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"ecef9ad858e2fa41d17d4fb6f6caa01be2c7f191","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    def _check_port_security(self, network, port_data):"},{"line_number":248,"context_line":"        # OVN Metadata ports always have port_security disabled"},{"line_number":249,"context_line":"        # and work differently to usual ports."},{"line_number":250,"context_line":"        if self._driver:"},{"line_number":251,"context_line":"            mech_name \u003d type(self._driver._mech_driver).__name__"},{"line_number":252,"context_line":"            if (mech_name \u003d\u003d \u0027OVNMechanismDriver\u0027 and"},{"line_number":253,"context_line":"                    self._driver.is_metadata_port(port_data)):"},{"line_number":254,"context_line":"                return"},{"line_number":255,"context_line":"        # Default port_security_enabled is True so if no security is set,"},{"line_number":256,"context_line":"        # it means we are enforcing port security."},{"line_number":257,"context_line":"        # Same goes for network."}],"source_content_type":"text/x-python","patch_set":45,"id":"0759550c_50675b04","line":254,"range":{"start_line":250,"start_character":8,"end_line":254,"end_character":22},"in_reply_to":"53f4ea03_bfa12694","updated":"2026-05-26 07:47:10.000000000","message":"Done","commit_id":"aa3124e44edb8e443299035e17aeb6275af90557"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ae10168636094413a322b65dadf715e47a89b771","unresolved":true,"context_lines":[{"line_number":261,"context_line":"            port_security \u003d port_data.security.port_security_enabled"},{"line_number":262,"context_line":"        if network.security:"},{"line_number":263,"context_line":"            network_security \u003d network.security.port_security_enabled"},{"line_number":264,"context_line":"        if (network.pvlan and not network_security or not port_security):"},{"line_number":265,"context_line":"            raise pvlan_exc.PVLANPortSecurityDisabled(port_id\u003dport_data.id)"}],"source_content_type":"text/x-python","patch_set":45,"id":"e054f65c_8eec26b0","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":73},"updated":"2026-05-25 08:14:21.000000000","message":"Due to Python\u0027s operator precedence, this is evaluated as\n`if ((network.pvlan and (not network_security)) or (not port_security)):`","commit_id":"aa3124e44edb8e443299035e17aeb6275af90557"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"ecef9ad858e2fa41d17d4fb6f6caa01be2c7f191","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            port_security \u003d port_data.security.port_security_enabled"},{"line_number":262,"context_line":"        if network.security:"},{"line_number":263,"context_line":"            network_security \u003d network.security.port_security_enabled"},{"line_number":264,"context_line":"        if (network.pvlan and not network_security or not port_security):"},{"line_number":265,"context_line":"            raise pvlan_exc.PVLANPortSecurityDisabled(port_id\u003dport_data.id)"}],"source_content_type":"text/x-python","patch_set":45,"id":"8032bb17_41f7851d","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":73},"in_reply_to":"e054f65c_8eec26b0","updated":"2026-05-26 07:47:10.000000000","message":"Done","commit_id":"aa3124e44edb8e443299035e17aeb6275af90557"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d8f55b4ce5ba7fec6ab3f05eb98cf0765f8c7f32","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    def _check_port_security(self, network, port_data):"},{"line_number":249,"context_line":"        # OVN Metadata ports always have port_security disabled"},{"line_number":250,"context_line":"        # and work differently to usual ports."},{"line_number":251,"context_line":"        if ovn_utils.is_ovn_metadata_port(port_data.to_dict()):"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        # Default port_security_enabled is True so if no security is set,"},{"line_number":254,"context_line":"        # it means we are enforcing port security."}],"source_content_type":"text/x-python","patch_set":47,"id":"ec20b15b_8fb9662d","line":251,"range":{"start_line":251,"start_character":51,"end_line":251,"end_character":61},"updated":"2026-05-26 14:08:42.000000000","message":"Not strictly necessary, an OVO has dict access too.","commit_id":"4d177401b51fe230f77b2a5d54d4817266c1f284"}],"neutron/tests/functional/services/pvlan/test_pvlan_plugin.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                         \u0027admin_state_up\u0027: True,"},{"line_number":50,"context_line":"                         \u0027shared\u0027: False,"},{"line_number":51,"context_line":"                         \u0027project_id\u0027: self._project_id}})"},{"line_number":52,"context_line":"        return net"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _create_port(self, network_id, pvlan_type\u003dNone,"},{"line_number":55,"context_line":"                     pvlan_community\u003dNone):"}],"source_content_type":"text/x-python","patch_set":18,"id":"027805c2_d5ae121c","line":52,"updated":"2026-04-10 13:32:41.000000000","message":"do we need really this wrapper for \"self.core_plugin.create_network\"? IMHO that and the method above (_create_pvlan_network) aren\u0027t really needed probably","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                         \u0027admin_state_up\u0027: True,"},{"line_number":50,"context_line":"                         \u0027shared\u0027: False,"},{"line_number":51,"context_line":"                         \u0027project_id\u0027: self._project_id}})"},{"line_number":52,"context_line":"        return net"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _create_port(self, network_id, pvlan_type\u003dNone,"},{"line_number":55,"context_line":"                     pvlan_community\u003dNone):"}],"source_content_type":"text/x-python","patch_set":18,"id":"5befb25f_3526b040","line":52,"in_reply_to":"027805c2_d5ae121c","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    def _get_networkpvlan_db(self, network_id):"},{"line_number":72,"context_line":"        return self.context.session.query("},{"line_number":73,"context_line":"            pvlan_models.NetworkPVLAN).filter_by("},{"line_number":74,"context_line":"                network_id\u003dnetwork_id).first()"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _get_portpvlan_db(self, port_id):"},{"line_number":77,"context_line":"        return self.context.session.query("}],"source_content_type":"text/x-python","patch_set":18,"id":"82df9728_01e5ebda","line":74,"updated":"2026-04-10 13:32:41.000000000","message":"I think you should use simply plugin methods which provides that information instead of making additional method which directly calls DB.","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def _get_networkpvlan_db(self, network_id):"},{"line_number":72,"context_line":"        return self.context.session.query("},{"line_number":73,"context_line":"            pvlan_models.NetworkPVLAN).filter_by("},{"line_number":74,"context_line":"                network_id\u003dnetwork_id).first()"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _get_portpvlan_db(self, port_id):"},{"line_number":77,"context_line":"        return self.context.session.query("}],"source_content_type":"text/x-python","patch_set":18,"id":"5186f287_080ec422","line":74,"in_reply_to":"82df9728_01e5ebda","updated":"2026-04-13 18:27:30.000000000","message":"Acknowledged","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    def test_create_network_with_pvlan_enabled(self):"},{"line_number":85,"context_line":"        net \u003d self._create_pvlan_network()"},{"line_number":86,"context_line":"        db_entry \u003d self._get_networkpvlan_db(net[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.assertIsNotNone(db_entry)"},{"line_number":88,"context_line":"        self.assertTrue(db_entry.pvlan)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_create_network_without_pvlan(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"0aaecd83_a770acc4","line":87,"updated":"2026-04-10 13:32:41.000000000","message":"in current implementation this \"assertIsNotNone\" is actually testing only if the _get_networkpvlan_db() method defined above in the PVLANPluginTestCase works as expected. I don\u0027t think we need this really","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_create_network_with_pvlan_enabled(self):"},{"line_number":85,"context_line":"        net \u003d self._create_pvlan_network()"},{"line_number":86,"context_line":"        db_entry \u003d self._get_networkpvlan_db(net[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.assertIsNotNone(db_entry)"},{"line_number":88,"context_line":"        self.assertTrue(db_entry.pvlan)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_create_network_without_pvlan(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"68d04b6d_4cc20697","line":87,"in_reply_to":"0aaecd83_a770acc4","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":98,"context_line":"            self.context, net[\u0027id\u0027],"},{"line_number":99,"context_line":"            {\u0027network\u0027: {pvlan_const.PVLAN: True}})"},{"line_number":100,"context_line":"        db_entry \u003d self._get_networkpvlan_db(net[\u0027id\u0027])"},{"line_number":101,"context_line":"        self.assertIsNotNone(db_entry)"},{"line_number":102,"context_line":"        self.assertTrue(db_entry.pvlan)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def test_update_network_disable_pvlan(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"8a9bde71_d83c424c","line":101,"updated":"2026-04-10 13:32:41.000000000","message":"same here","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            self.context, net[\u0027id\u0027],"},{"line_number":99,"context_line":"            {\u0027network\u0027: {pvlan_const.PVLAN: True}})"},{"line_number":100,"context_line":"        db_entry \u003d self._get_networkpvlan_db(net[\u0027id\u0027])"},{"line_number":101,"context_line":"        self.assertIsNotNone(db_entry)"},{"line_number":102,"context_line":"        self.assertTrue(db_entry.pvlan)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def test_update_network_disable_pvlan(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"45a4b706_06060c63","line":101,"in_reply_to":"8a9bde71_d83c424c","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"40d5b74e8c5a4d41c23eded2031d9ea4577422ec","unresolved":true,"context_lines":[{"line_number":107,"context_line":"            self.context, net[\u0027id\u0027],"},{"line_number":108,"context_line":"            {\u0027network\u0027: {pvlan_const.PVLAN: False}})"},{"line_number":109,"context_line":"        db_entry \u003d self._get_networkpvlan_db(net[\u0027id\u0027])"},{"line_number":110,"context_line":"        self.assertIsNotNone(db_entry)"},{"line_number":111,"context_line":"        self.assertFalse(db_entry.pvlan)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"88ef6f2e_ac41c723","line":110,"updated":"2026-04-10 13:32:41.000000000","message":"and here (and in other places below)","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"a215c9f22f36bdb3b4acb61af7e1a61ee6a71833","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            self.context, net[\u0027id\u0027],"},{"line_number":108,"context_line":"            {\u0027network\u0027: {pvlan_const.PVLAN: False}})"},{"line_number":109,"context_line":"        db_entry \u003d self._get_networkpvlan_db(net[\u0027id\u0027])"},{"line_number":110,"context_line":"        self.assertIsNotNone(db_entry)"},{"line_number":111,"context_line":"        self.assertFalse(db_entry.pvlan)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"853adda7_dff6af3e","line":110,"in_reply_to":"88ef6f2e_ac41c723","updated":"2026-04-13 18:27:30.000000000","message":"Done","commit_id":"4fa6504e2c2f88b0fec9b712ecba63c28b05feb9"}]}
