)]}'
{"/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"}],"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":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":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":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":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"}],"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"}],"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/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":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"}],"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":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":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":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":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":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":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":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":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":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":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":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":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":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":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"}],"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"}]}
