)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"68c61c681eeb5c5b5fe21caca6964a858da4fd70","unresolved":true,"context_lines":[{"line_number":21,"context_line":"Related-Bug: #2144617"},{"line_number":22,"context_line":"Assisted-By: Claude Opus 4.6"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Related-Bug: #2144617"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I5cfd15a363480ccb37796ec83ef2559b4bcaadce"},{"line_number":27,"context_line":"Signed-off-by: Jakub Libosvar \u003clibosvar@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"bfbf2e6b_e53ffba2","line":24,"updated":"2026-05-19 15:28:20.000000000","message":"if someone wonders, this patch is related to bug 2144617 :)","commit_id":"66ff8bb981d1e82db3d4c8768751ae9d162dd470"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Related-Bug: #2144617"},{"line_number":22,"context_line":"Assisted-By: Claude Opus 4.6"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Related-Bug: #2144617"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I5cfd15a363480ccb37796ec83ef2559b4bcaadce"},{"line_number":27,"context_line":"Signed-off-by: Jakub Libosvar \u003clibosvar@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"b2c9641d_54c55c56","line":24,"in_reply_to":"bfbf2e6b_e53ffba2","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"66ff8bb981d1e82db3d4c8768751ae9d162dd470"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7d8e8a8faba303cf8e125ca076769cb65b851784","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1de652ed_15553dc3","updated":"2026-05-07 22:59:24.000000000","message":"I’m against this VNI allocation implementation. It’s not expandable at all. This is what I’ve been saying on the spec and others where you worked on the BGP. I’ve been saying over and over that there are multiple pools of VNIs that’s why I created the VXLAN-EVPN spec at first. But really would like to see the VXLAN type support multiple pools. I discussed multiple pools being needed at the PTG. During the spec for this feature it was mentioned that multiple pools will be needed. This patch even says multiple pools will be needed in the future. This week on IRC and the mailing list another user showed up saying they needed multiple pools.\n\nThe way this is done is hardcoded to one pool via a config file entry and not via the API. This will not be an easy upgrade to support that.\n\nThe thing that makes neutron so great are generically designed interfaces with extensibility possible. So let’s do that for this.","commit_id":"1d98d3aabc5df31751a77b157d68349d40010501"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c5b6ec3c87f9dd8d29eebd8c67c27687483b9867","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ffdd3dbc_ca6d70e3","in_reply_to":"1de652ed_15553dc3","updated":"2026-05-19 15:33:06.000000000","message":"@cardoe@cardoe.com would this new model fit your needs?","commit_id":"1d98d3aabc5df31751a77b157d68349d40010501"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"bc58f2bd_ef8d765b","updated":"2026-05-21 09:10:01.000000000","message":"NOTE:\n* This patch requires a release note\n* This patch requires documentation, in particular related to the `ondelete\u003d\u0027RESTRICT\u0027` constraints. The user needs to know why there could be limitations removing some elements. This documentation can be pushed in a follow up patch.","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"ef93e2f54231257bdaaa65edc783367ebbc8ad13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1b27c381_716e4204","updated":"2026-05-26 09:18:07.000000000","message":"please address Rodolfo\u0027s comments and LGTM for me","commit_id":"924e71f6cfec349537025e174d755c8b25852425"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8382cc0971829a96b3ee71f1a09f51fde5836c49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"273963c1_dc39e25d","updated":"2026-05-26 14:38:12.000000000","message":"the pending comments are just cosmetic, I usually prefer the column definition in one single line (basically add the primary key constraints in the column definition)","commit_id":"924e71f6cfec349537025e174d755c8b25852425"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f2d3a13926ab5f268829d1a49a94d9ba269295c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"c8d3b914_4ae91976","updated":"2026-06-03 06:52:13.000000000","message":"-1 for the PS11-PS15 change in the DB definitions. If both conditions I explain are true, there is no need to have 3 tables that will increase the query complexity.","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"abe8b566_874b38f2","updated":"2026-06-04 09:17:50.000000000","message":"recheck neutron-ovs-tempest-multinode-full","commit_id":"9df8c29b90aff07b5130770fff62c0d9db10ab4f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"2659349607c442e3f3401c3c24d677af844cf3c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"25bcc358_f400bd2c","updated":"2026-06-05 04:00:41.000000000","message":"Only +1 from me since I\u0027m technically a co-author.","commit_id":"fe7d37a018e8aa92e6c33204babd2e2037e05d24"}],"neutron/db/evpn_db.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"96a88c5badfb447559965f02185436623b2567aa","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            LOG.debug(\"No EVPN VNI allocation found for router %s\", router_id)"},{"line_number":116,"context_line":"            return False"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        allocation_id \u003d instance.allocation_id"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        context.session.query("},{"line_number":121,"context_line":"            vxlan_models.VXLANVNIAllocation"}],"source_content_type":"text/x-python","patch_set":6,"id":"ec1cd4b5_1142f044","line":118,"updated":"2026-05-19 20:04:28.000000000","message":"nit, is there any reason for not just using instance.allocation_id in the one place below?","commit_id":"5f7961ea4717aa849f01e9f91670dc63b2dd8b24"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dce73a3b428f8fbf4b90635e7eaa59f3d1c2b100","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            LOG.debug(\"No EVPN VNI allocation found for router %s\", router_id)"},{"line_number":116,"context_line":"            return False"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        allocation_id \u003d instance.allocation_id"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        context.session.query("},{"line_number":121,"context_line":"            vxlan_models.VXLANVNIAllocation"}],"source_content_type":"text/x-python","patch_set":6,"id":"8a604a42_cdd6f589","line":118,"in_reply_to":"175b992c_3a5d60b3","updated":"2026-05-20 22:00:44.000000000","message":"Done","commit_id":"5f7961ea4717aa849f01e9f91670dc63b2dd8b24"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6a139e6b319379aa03bfc168c7f1f15fffca53c1","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            LOG.debug(\"No EVPN VNI allocation found for router %s\", router_id)"},{"line_number":116,"context_line":"            return False"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        allocation_id \u003d instance.allocation_id"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        context.session.query("},{"line_number":121,"context_line":"            vxlan_models.VXLANVNIAllocation"}],"source_content_type":"text/x-python","patch_set":6,"id":"175b992c_3a5d60b3","line":118,"in_reply_to":"ec1cd4b5_1142f044","updated":"2026-05-19 20:14:53.000000000","message":"no reason, AI generated and I didn\u0027t care :)","commit_id":"5f7961ea4717aa849f01e9f91670dc63b2dd8b24"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        :raises EVPNVNIInUse: If VNI is already allocated"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        try:"},{"line_number":65,"context_line":"            with context.session.begin_nested():"},{"line_number":66,"context_line":"                allocation \u003d vxlan_models.VXLANVNIAllocation("},{"line_number":67,"context_line":"                    vni\u003dvni, physnet\u003d_EVPN_PHYSNET)"},{"line_number":68,"context_line":"                context.session.add(allocation)"}],"source_content_type":"text/x-python","patch_set":7,"id":"02d95754_95a93526","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":48},"updated":"2026-05-21 09:10:01.000000000","message":"We no longer support nested transactions.\n\nWe usually wrap the method inside a writer/reader decorator or we use a context:\n```\nwith db_api.CONTEXT_WRITER.using(context):\n```\n\nIn any case, in Neutron we usually wrap the public methods. In this case, I would wrap `allocate_vni_for_router`","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        :raises EVPNVNIInUse: If VNI is already allocated"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        try:"},{"line_number":65,"context_line":"            with context.session.begin_nested():"},{"line_number":66,"context_line":"                allocation \u003d vxlan_models.VXLANVNIAllocation("},{"line_number":67,"context_line":"                    vni\u003dvni, physnet\u003d_EVPN_PHYSNET)"},{"line_number":68,"context_line":"                context.session.add(allocation)"}],"source_content_type":"text/x-python","patch_set":7,"id":"928e22fe_67ffba51","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":48},"in_reply_to":"02d95754_95a93526","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":90,"context_line":"            _(\"EVPN VNI auto-allocation not yet implemented. \""},{"line_number":91,"context_line":"              \"Specify an explicit VNI.\"))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def deallocate_vni_for_router(self, context, router_id):"},{"line_number":94,"context_line":"        \"\"\"Remove VNI allocation for a router."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        Call this when user explicitly removes VNI from a router."}],"source_content_type":"text/x-python","patch_set":7,"id":"90b61067_ff81335e","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":33},"updated":"2026-05-21 09:10:01.000000000","message":"This method is doing a query. It must be wrapped inside a writer context:\n```\n@db_api.CONTEXT_WRITER\ndef deallocate_vni_for_router(self, context, router_id):\n```","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            _(\"EVPN VNI auto-allocation not yet implemented. \""},{"line_number":91,"context_line":"              \"Specify an explicit VNI.\"))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def deallocate_vni_for_router(self, context, router_id):"},{"line_number":94,"context_line":"        \"\"\"Remove VNI allocation for a router."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        Call this when user explicitly removes VNI from a router."}],"source_content_type":"text/x-python","patch_set":7,"id":"87672cc6_7f73dcf0","line":93,"range":{"start_line":93,"start_character":8,"end_line":93,"end_character":33},"in_reply_to":"90b61067_ff81335e","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        :param context: Neutron request context (with active session)"},{"line_number":102,"context_line":"        :param router_id: UUID of the router"},{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        instance \u003d context.session.query("},{"line_number":105,"context_line":"            evpn_models.EVPNL3Instance"},{"line_number":106,"context_line":"        ).filter_by(router_id\u003drouter_id).first()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if not instance:"},{"line_number":109,"context_line":"            return"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        context.session.query("},{"line_number":112,"context_line":"            vxlan_models.VXLANVNIAllocation"},{"line_number":113,"context_line":"        ).filter_by(id\u003dinstance.allocation_id).delete()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        LOG.debug(\"Deallocated EVPN VNI for router %s\", router_id)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"d6285663_d57fc0ad","line":113,"range":{"start_line":104,"start_character":9,"end_line":113,"end_character":55},"updated":"2026-05-21 09:10:01.000000000","message":"This could be done in one query:\n```\ncontext.session.query(\n    vxlan_models.VXLANVNIAllocation\n).filter(\n    vxlan_models.VXLANVNIAllocation.id \u003d\u003d context.session.query(\n        evpn_models.EVPNL3Instance.allocation_id\n    ).filter_by(router_id\u003drouter_id).correlate(None).scalar_subquery()\n).delete()\n```","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        :param context: Neutron request context (with active session)"},{"line_number":102,"context_line":"        :param router_id: UUID of the router"},{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        instance \u003d context.session.query("},{"line_number":105,"context_line":"            evpn_models.EVPNL3Instance"},{"line_number":106,"context_line":"        ).filter_by(router_id\u003drouter_id).first()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        if not instance:"},{"line_number":109,"context_line":"            return"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        context.session.query("},{"line_number":112,"context_line":"            vxlan_models.VXLANVNIAllocation"},{"line_number":113,"context_line":"        ).filter_by(id\u003dinstance.allocation_id).delete()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        LOG.debug(\"Deallocated EVPN VNI for router %s\", router_id)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"46576463_65a341c4","line":113,"range":{"start_line":104,"start_character":9,"end_line":113,"end_character":55},"in_reply_to":"d6285663_d57fc0ad","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        :param context: Neutron request context"},{"line_number":128,"context_line":"        :param subnet_id: UUID of the subnet being detached"},{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        network_id_subq \u003d context.session.query("},{"line_number":131,"context_line":"            models_v2.Subnet.network_id"},{"line_number":132,"context_line":"        ).filter(models_v2.Subnet.id \u003d\u003d subnet_id).scalar_subquery()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        deleted \u003d context.session.query("},{"line_number":135,"context_line":"            evpn_models.EVPNNetwork"},{"line_number":136,"context_line":"        ).filter("},{"line_number":137,"context_line":"            evpn_models.EVPNNetwork.network_id \u003d\u003d network_id_subq"},{"line_number":138,"context_line":"        ).delete(synchronize_session\u003dFalse)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        if deleted:"},{"line_number":141,"context_line":"            LOG.debug(\"Removed EVPN network entry for subnet %s\", subnet_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"54f2831b_ab620870","line":138,"range":{"start_line":130,"start_character":8,"end_line":138,"end_character":43},"updated":"2026-05-21 09:10:01.000000000","message":"context.session.query(\n    evpn_models.EVPNNetwork\n).filter(\n    evpn_models.EVPNNetwork.network_id \u003d\u003d context.session.query(\n        models_v2.Subnet.network_id\n    ).filter(models_v2.Subnet.id \u003d\u003d subnet_id).correlate(None).scalar_subquery()\n).delete()","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        :param context: Neutron request context"},{"line_number":128,"context_line":"        :param subnet_id: UUID of the subnet being detached"},{"line_number":129,"context_line":"        \"\"\""},{"line_number":130,"context_line":"        network_id_subq \u003d context.session.query("},{"line_number":131,"context_line":"            models_v2.Subnet.network_id"},{"line_number":132,"context_line":"        ).filter(models_v2.Subnet.id \u003d\u003d subnet_id).scalar_subquery()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        deleted \u003d context.session.query("},{"line_number":135,"context_line":"            evpn_models.EVPNNetwork"},{"line_number":136,"context_line":"        ).filter("},{"line_number":137,"context_line":"            evpn_models.EVPNNetwork.network_id \u003d\u003d network_id_subq"},{"line_number":138,"context_line":"        ).delete(synchronize_session\u003dFalse)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        if deleted:"},{"line_number":141,"context_line":"            LOG.debug(\"Removed EVPN network entry for subnet %s\", subnet_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"12962064_247edab1","line":138,"range":{"start_line":130,"start_character":8,"end_line":138,"end_character":43},"in_reply_to":"54f2831b_ab620870","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"}],"neutron/db/migration/alembic_migrations/versions/2026.2/expand/a00aa97899c0_add_l3_evpn_tables.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    op.create_table("},{"line_number":36,"context_line":"        \u0027vxlan_vni_allocations\u0027,"},{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027vni\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027physnet\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fe04a702_6210f56e","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":74},"updated":"2026-05-21 09:10:01.000000000","message":"We don\u0027t use integers as IDs, but UUIDs. This should be:\n`sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),`","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8382cc0971829a96b3ee71f1a09f51fde5836c49","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    op.create_table("},{"line_number":36,"context_line":"        \u0027vxlan_vni_allocations\u0027,"},{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027vni\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027physnet\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"68a2c0dd_2bad9f49","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":74},"in_reply_to":"4a8665c9_91905844","updated":"2026-05-26 14:38:12.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    op.create_table("},{"line_number":36,"context_line":"        \u0027vxlan_vni_allocations\u0027,"},{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027vni\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027physnet\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"4a8665c9_91905844","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":74},"in_reply_to":"fe04a702_6210f56e","updated":"2026-05-21 16:08:35.000000000","message":"No, it should be an Integer as it\u0027s auto incremented and serves only to fulfill the FK from evpn_l3_instances in order to avoid having a constraint on \"vni-physnet\".\n\nhttps://review.opendev.org/c/openstack/neutron/+/987250/7/neutron/db/models/evpn.py#35","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027vni\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027physnet\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":41,"context_line":"        sa.UniqueConstraint(\u0027vni\u0027, \u0027physnet\u0027,"},{"line_number":42,"context_line":"                            name\u003d\u0027uniq_vxlan_vni_allocations0vni0physnet\u0027),"},{"line_number":43,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"edc4e970_39bbd35e","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":38},"updated":"2026-05-21 09:10:01.000000000","message":"Add this in the ID definition:\n`sa.Column(\u0027id\u0027, sa.String(length\u003d36), primary_key\u003dTrue),`\n\nThere is not need to set `nullable\u003dFalse` if `primary_key\u003dTrue`","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027vni\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027physnet\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":41,"context_line":"        sa.UniqueConstraint(\u0027vni\u0027, \u0027physnet\u0027,"},{"line_number":42,"context_line":"                            name\u003d\u0027uniq_vxlan_vni_allocations0vni0physnet\u0027),"},{"line_number":43,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"cb69db36_679fc362","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":38},"in_reply_to":"d2b65818_6a6ecad4","updated":"2026-06-04 09:17:50.000000000","message":"That was to make easier to read the DB definition, at least that\u0027s my opinion.","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":true,"context_lines":[{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027vni\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027physnet\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":41,"context_line":"        sa.UniqueConstraint(\u0027vni\u0027, \u0027physnet\u0027,"},{"line_number":42,"context_line":"                            name\u003d\u0027uniq_vxlan_vni_allocations0vni0physnet\u0027),"},{"line_number":43,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"d2b65818_6a6ecad4","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":38},"in_reply_to":"edc4e970_39bbd35e","updated":"2026-05-21 16:08:35.000000000","message":"This was generated by Alembic with `neutron-db-manage revision`","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":50,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":51,"context_line":"        sa.ForeignKeyConstraint([\u0027router_id\u0027], [\u0027routers.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027allocation_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027router_id\u0027),"},{"line_number":55,"context_line":"    )"},{"line_number":56,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":7,"id":"a4ff4dec_8a5f9d09","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":49},"updated":"2026-05-21 09:10:01.000000000","message":"add this in the column definition\n`sa.Column(\u0027allocation_id\u0027, sa.Integer(), primary_key\u003dTrue),`","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c53bea0238d96fc2e96c0fcf9f2b9bb735fc4443","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":51,"context_line":"        sa.ForeignKeyConstraint([\u0027router_id\u0027], [\u0027routers.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027allocation_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027router_id\u0027),"},{"line_number":55,"context_line":"    )"},{"line_number":56,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":7,"id":"fe28f7ed_2853036a","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":49},"in_reply_to":"a4ff4dec_8a5f9d09","updated":"2026-06-04 22:29:41.000000000","message":"Acknowledged","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":51,"context_line":"        sa.ForeignKeyConstraint([\u0027router_id\u0027], [\u0027routers.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027allocation_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027router_id\u0027),"},{"line_number":55,"context_line":"    )"},{"line_number":56,"context_line":"    op.create_table("},{"line_number":57,"context_line":"        \u0027evpn_networks\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"52a7a1e1_7c9063b7","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":41},"updated":"2026-05-21 09:10:01.000000000","message":"add this in the column definition:\n`sa.Column(\u0027router_id\u0027, sa.String(length\u003d36), nullable\u003dFalse, unique\u003dTrue),`","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c53bea0238d96fc2e96c0fcf9f2b9bb735fc4443","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        sa.ForeignKeyConstraint([\u0027router_id\u0027], [\u0027routers.id\u0027],"},{"line_number":52,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":53,"context_line":"        sa.PrimaryKeyConstraint(\u0027allocation_id\u0027),"},{"line_number":54,"context_line":"        sa.UniqueConstraint(\u0027router_id\u0027),"},{"line_number":55,"context_line":"    )"},{"line_number":56,"context_line":"    op.create_table("},{"line_number":57,"context_line":"        \u0027evpn_networks\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"08782aed_2db2eb19","line":54,"range":{"start_line":54,"start_character":8,"end_line":54,"end_character":41},"in_reply_to":"52a7a1e1_7c9063b7","updated":"2026-06-04 22:29:41.000000000","message":"Acknowledged","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        sa.ForeignKeyConstraint([\u0027router_id\u0027],"},{"line_number":63,"context_line":"                                [\u0027evpn_l3_instances.router_id\u0027],"},{"line_number":64,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":65,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027),"},{"line_number":66,"context_line":"    )"},{"line_number":67,"context_line":"    op.create_table("},{"line_number":68,"context_line":"        \u0027evpn_advertised_ports\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"a26bf075_0ef3e46e","line":65,"range":{"start_line":65,"start_character":7,"end_line":65,"end_character":46},"updated":"2026-05-21 09:10:01.000000000","message":"ditto","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        sa.ForeignKeyConstraint([\u0027router_id\u0027],"},{"line_number":63,"context_line":"                                [\u0027evpn_l3_instances.router_id\u0027],"},{"line_number":64,"context_line":"                                ondelete\u003d\u0027RESTRICT\u0027),"},{"line_number":65,"context_line":"        sa.PrimaryKeyConstraint(\u0027network_id\u0027),"},{"line_number":66,"context_line":"    )"},{"line_number":67,"context_line":"    op.create_table("},{"line_number":68,"context_line":"        \u0027evpn_advertised_ports\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"318ffc11_9b424968","line":65,"range":{"start_line":65,"start_character":7,"end_line":65,"end_character":46},"in_reply_to":"a26bf075_0ef3e46e","updated":"2026-06-04 09:17:50.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":75,"context_line":"                                [\u0027evpn_networks.network_id\u0027],"},{"line_number":76,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":77,"context_line":"        sa.PrimaryKeyConstraint(\u0027port_id\u0027),"},{"line_number":78,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"35235e2b_9ba8b8a9","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":43},"updated":"2026-05-21 09:10:01.000000000","message":"ditto","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        sa.ForeignKeyConstraint([\u0027network_id\u0027],"},{"line_number":75,"context_line":"                                [\u0027evpn_networks.network_id\u0027],"},{"line_number":76,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":77,"context_line":"        sa.PrimaryKeyConstraint(\u0027port_id\u0027),"},{"line_number":78,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"2b2aba13_3e1ca42c","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":43},"in_reply_to":"35235e2b_9ba8b8a9","updated":"2026-06-04 09:17:50.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f2d3a13926ab5f268829d1a49a94d9ba269295c3","unresolved":true,"context_lines":[{"line_number":57,"context_line":"                            name\u003d\u0027uniq_vlan_allocations0vlan_id0physnet\u0027),"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":"    migration.create_table_if_not_exists("},{"line_number":60,"context_line":"        \u0027vni_vlan_mapping\u0027,"},{"line_number":61,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":62,"context_line":"        sa.Column(\u0027vni_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":63,"context_line":"        sa.Column(\u0027vlan_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"01eb9bec_ae31fe2e","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":27},"updated":"2026-06-03 06:52:13.000000000","message":"I gave a +2 for PS11 but now I see 3 different tables: vni, vlan and vni_vlan.\n\nIf I\u0027m not wrong:\n1) there is a 1:1 association between vni:vlan, according to the `sa.UniqueConstraint(\u0027vni_allocation_id\u0027)` and `sa.UniqueConstraint(\u0027vlan_allocation_id\u0027)`\n2) the physnet for both registers is the same.\n\nThen, there is not need then to create 3 tables, just one with the (vni, vlan, physnet) tuple.","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"436c48d85ee7c9a57ee96355fc94e86894c90c36","unresolved":true,"context_lines":[{"line_number":57,"context_line":"                            name\u003d\u0027uniq_vlan_allocations0vlan_id0physnet\u0027),"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":"    migration.create_table_if_not_exists("},{"line_number":60,"context_line":"        \u0027vni_vlan_mapping\u0027,"},{"line_number":61,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":62,"context_line":"        sa.Column(\u0027vni_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":63,"context_line":"        sa.Column(\u0027vlan_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"5b6e4ded_f9efa52d","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":27},"in_reply_to":"01eb9bec_ae31fe2e","updated":"2026-06-03 16:52:01.000000000","message":"1) there is for the vni_vlan_mapping but not if you use the RangeAllocator for a VXLAN or VLAN ID allocation in general\n2) The physnet is the same for the evpn plugin but it is not the same for https://review.opendev.org/c/openstack/neutron/+/965415/4/doc/source/admin/data-center-networks.rst#146 where each cabinet has its own name and it\u0027s different for VLAN and VXLAN.","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4bb19ace0a7b2c77caa6b17064679aedf37cf8a6","unresolved":true,"context_lines":[{"line_number":57,"context_line":"                            name\u003d\u0027uniq_vlan_allocations0vlan_id0physnet\u0027),"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":"    migration.create_table_if_not_exists("},{"line_number":60,"context_line":"        \u0027vni_vlan_mapping\u0027,"},{"line_number":61,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":62,"context_line":"        sa.Column(\u0027vni_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":63,"context_line":"        sa.Column(\u0027vlan_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"26ffcbd5_05b8ff5a","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":27},"in_reply_to":"01eb9bec_ae31fe2e","updated":"2026-06-03 17:02:25.000000000","message":"Here was my thinking.\n\nA generally useful Allocator that allocate at the db atomic insert an unused vni, vlan, etc. This requires having unique objects to allocate. Give me a vxlan, give me a vni, etc. Allocating two different things doesn\u0027t seem as generally useful.\n\nFor this specific use, there is a 1:1 vlan to vxlan mapping. If we want these tables to be generally useful to neutron and other plugins/models, I thought they should be useful to things that did not require a 1:1 mapping. For example, ml2_vxlan_allocations currently doesn\u0027t support physnet and does the \"allocated\" column thing which doesn\u0027t make a lot of sense for large ranges, etc. It seemed like having general tables made sense.","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                            name\u003d\u0027uniq_vlan_allocations0vlan_id0physnet\u0027),"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":"    migration.create_table_if_not_exists("},{"line_number":60,"context_line":"        \u0027vni_vlan_mapping\u0027,"},{"line_number":61,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), autoincrement\u003dTrue, nullable\u003dFalse),"},{"line_number":62,"context_line":"        sa.Column(\u0027vni_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":63,"context_line":"        sa.Column(\u0027vlan_allocation_id\u0027, sa.Integer(), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"f89891ad_d10d2505","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":27},"in_reply_to":"26ffcbd5_05b8ff5a","updated":"2026-06-04 09:17:50.000000000","message":"Done","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"}],"neutron/db/models/evpn.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"79c93ac9178c57ffce756a5205ae47c97d463bc7","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        backref\u003dorm.backref(\u0027evpn_networks\u0027, viewonly\u003dTrue))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class EVPNAdvertisedPort(model_base.BASEV2):"},{"line_number":100,"context_line":"    \"\"\"Ports marked for EVPN advertisement."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    Tracks which ports should have their subnets advertised via EVPN."}],"source_content_type":"text/x-python","patch_set":5,"id":"9b3e3f12_0e984be1","line":99,"updated":"2026-05-19 16:21:04.000000000","message":"The only issue I see after a quick review is that to ensure that network_id is the network_id of the port_id that we are referencing, we need a compound foreign key here from (port_id, network_id) to (ports.id, ports.network_id) (and correspondingly modify Ports to have a unique constraint on that combination, which should be trivial).","commit_id":"66ff8bb981d1e82db3d4c8768751ae9d162dd470"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"976b1f919ac6a7dec02884d18b501359015d440e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        backref\u003dorm.backref(\u0027evpn_networks\u0027, viewonly\u003dTrue))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class EVPNAdvertisedPort(model_base.BASEV2):"},{"line_number":100,"context_line":"    \"\"\"Ports marked for EVPN advertisement."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    Tracks which ports should have their subnets advertised via EVPN."}],"source_content_type":"text/x-python","patch_set":5,"id":"548e8d9a_190d6668","line":99,"in_reply_to":"9b3e3f12_0e984be1","updated":"2026-05-19 18:15:00.000000000","message":"Done","commit_id":"66ff8bb981d1e82db3d4c8768751ae9d162dd470"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        viewonly\u003dTrue,"},{"line_number":51,"context_line":"        backref\u003dorm.backref("},{"line_number":52,"context_line":"            \u0027evpn_instance\u0027,"},{"line_number":53,"context_line":"            lazy\u003d\u0027joined\u0027,"},{"line_number":54,"context_line":"            uselist\u003dFalse,"},{"line_number":55,"context_line":"            viewonly\u003dTrue))"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9ce9095f_8be73da9","line":53,"range":{"start_line":53,"start_character":12,"end_line":53,"end_character":26},"updated":"2026-05-21 09:10:01.000000000","message":"This is an unnecessary overhead. Most of the deployments won\u0027t use the EVPN extension. This should be the default `lazy\u003d\u0027select\u0027`\n\nThis applies for all the lazy loading methods in this file.","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        viewonly\u003dTrue,"},{"line_number":51,"context_line":"        backref\u003dorm.backref("},{"line_number":52,"context_line":"            \u0027evpn_instance\u0027,"},{"line_number":53,"context_line":"            lazy\u003d\u0027joined\u0027,"},{"line_number":54,"context_line":"            uselist\u003dFalse,"},{"line_number":55,"context_line":"            viewonly\u003dTrue))"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"87838500_a242f2ad","line":53,"range":{"start_line":53,"start_character":12,"end_line":53,"end_character":26},"in_reply_to":"9ce9095f_8be73da9","updated":"2026-05-21 16:08:35.000000000","message":"Done but does it make sense elsewhere? This is the only backref in the models. In other words, the other \"JOIN\" clauses will happen only when we query EVPN related models.","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"3ed05c8ba2940fa63f33d6f4172a14dfb493d71d","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":118,"context_line":"            [\u0027network_id\u0027],"},{"line_number":119,"context_line":"            [\u0027evpn_networks.network_id\u0027],"},{"line_number":120,"context_line":"            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":121,"context_line":"    )"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    port \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":12,"id":"e983055d_eb331107","line":120,"updated":"2026-05-29 17:32:37.000000000","message":"I think we need the `model_base.BASSEV2.__table_args__` here.","commit_id":"2b6cd20b264db8d83540dbc7657fcd4ccc71a8e8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c1ed81b7249b6b2461db3733f17ec64aa7a10b95","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        sa.ForeignKeyConstraint("},{"line_number":118,"context_line":"            [\u0027network_id\u0027],"},{"line_number":119,"context_line":"            [\u0027evpn_networks.network_id\u0027],"},{"line_number":120,"context_line":"            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":121,"context_line":"    )"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    port \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":12,"id":"221904e9_4c97a191","line":120,"in_reply_to":"e983055d_eb331107","updated":"2026-06-02 17:34:27.000000000","message":"Done","commit_id":"2b6cd20b264db8d83540dbc7657fcd4ccc71a8e8"}],"neutron/db/models/vxlan.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"194c6954_6383077f","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"updated":"2026-05-21 09:10:01.000000000","message":"I would rename this file to vxlanvni.\n\nI would also add this definition inside the previous evpn.py file","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"01597868_54ef4171","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"in_reply_to":"194c6954_6383077f","updated":"2026-05-21 16:08:35.000000000","message":"Done, not sure what you mean with the second sentence, you want to move the model to evpn.py? The reason it\u0027s separated is to create an allocator for VXLAN VNI outside of the EVPN scope for the baremetal usecase discussed at https://etherpad.opendev.org/p/evpnvniranges#L33","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"}],"neutron/db/models/vxlan_vlan_allocations.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f2d3a13926ab5f268829d1a49a94d9ba269295c3","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":15,"id":"11c81c6e_3d3f993f","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"updated":"2026-06-03 06:52:13.000000000","message":"I don\u0027t see the need of creating a new file for these models. Everything could be defined all together in the models/evpn.py file. It will be easier to find in the future.","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"436c48d85ee7c9a57ee96355fc94e86894c90c36","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":15,"id":"422d1ac6_f11c4c72","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"in_reply_to":"11c81c6e_3d3f993f","updated":"2026-06-03 16:52:01.000000000","message":"Moving the allocator to the evpn would defeat the purpose of a generic vxlan vlan allocator as requested by https://review.opendev.org/c/openstack/neutron/+/965415/4/doc/source/admin/data-center-networks.rst#146","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":15,"id":"0a1d81de_79978f65","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":2},"in_reply_to":"422d1ac6_f11c4c72","updated":"2026-06-04 09:17:50.000000000","message":"Done","commit_id":"47b9b055ab6fcfd4cf1b72a9bd307d9dc86cef67"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f1ce609a0e0bae6e0abb8159548e9aa27d5b6d42","unresolved":true,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    __tablename__ \u003d \u0027vni_allocations\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    id \u003d sa.Column(sa.String(36), primary_key\u003dTrue,"},{"line_number":33,"context_line":"               default\u003duuidutils.generate_uuid)"},{"line_number":34,"context_line":"    vni \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":35,"context_line":"    physnet \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"596f253a_92b2632f","line":33,"range":{"start_line":32,"start_character":4,"end_line":33,"end_character":47},"updated":"2026-06-04 09:17:50.000000000","message":"nit: there is a `model_base.HasId` mixin for that","commit_id":"9df8c29b90aff07b5130770fff62c0d9db10ab4f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c53bea0238d96fc2e96c0fcf9f2b9bb735fc4443","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    __tablename__ \u003d \u0027vni_allocations\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    id \u003d sa.Column(sa.String(36), primary_key\u003dTrue,"},{"line_number":33,"context_line":"               default\u003duuidutils.generate_uuid)"},{"line_number":34,"context_line":"    vni \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":35,"context_line":"    physnet \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"62466b36_a03ffd0a","line":33,"range":{"start_line":32,"start_character":4,"end_line":33,"end_character":47},"in_reply_to":"596f253a_92b2632f","updated":"2026-06-04 22:29:41.000000000","message":"Done","commit_id":"9df8c29b90aff07b5130770fff62c0d9db10ab4f"}],"neutron/db/models/vxlanvni.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"dfdbda499e8b69607a7f8fe11cf14f17d4d378c6","unresolved":true,"context_lines":[{"line_number":17,"context_line":"import sqlalchemy as sa"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class VXLANVNIAllocation(model_base.BASEV2):"},{"line_number":21,"context_line":"    \"\"\"VXLAN VNI allocation table scoped by physical network."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    Ensures VNI uniqueness per physical network. The surrogate \u0027id\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"4a8cf82e_db617993","line":20,"range":{"start_line":20,"start_character":6,"end_line":20,"end_character":24},"updated":"2026-05-28 20:13:58.000000000","message":"Now I feel like this should be even more generic and be just an \"Integer allocator\"","commit_id":"2b6cd20b264db8d83540dbc7657fcd4ccc71a8e8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"906f22faaec4c6b66ebcbe6815ea6f154eccbff7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import sqlalchemy as sa"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class VXLANVNIAllocation(model_base.BASEV2):"},{"line_number":21,"context_line":"    \"\"\"VXLAN VNI allocation table scoped by physical network."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    Ensures VNI uniqueness per physical network. The surrogate \u0027id\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"3eb3a460_5e0581d1","line":20,"range":{"start_line":20,"start_character":6,"end_line":20,"end_character":24},"in_reply_to":"4a8cf82e_db617993","updated":"2026-06-04 12:11:06.000000000","message":"Done","commit_id":"2b6cd20b264db8d83540dbc7657fcd4ccc71a8e8"}],"neutron/db/models_v2.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":153,"context_line":"        sa.UniqueConstraint("},{"line_number":154,"context_line":"            network_id, mac_address,"},{"line_number":155,"context_line":"            name\u003d\u0027uniq_ports0network_id0mac_address\u0027),"},{"line_number":156,"context_line":"        sa.UniqueConstraint("},{"line_number":157,"context_line":"            \u0027id\u0027, \u0027network_id\u0027,"},{"line_number":158,"context_line":"            name\u003d\u0027uniq_ports0id0network_id\u0027),"},{"line_number":159,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":160,"context_line":"    )"},{"line_number":161,"context_line":"    api_collections \u003d [port_def.COLLECTION_NAME]"}],"source_content_type":"text/x-python","patch_set":7,"id":"6a6340c1_d8f15737","line":158,"range":{"start_line":156,"start_character":8,"end_line":158,"end_character":45},"updated":"2026-05-21 09:10:01.000000000","message":"WARNING: You can\u0027t change an existing DB model without changing the DDL.\n\nWhy do you really need this?","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8382cc0971829a96b3ee71f1a09f51fde5836c49","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        sa.UniqueConstraint("},{"line_number":154,"context_line":"            network_id, mac_address,"},{"line_number":155,"context_line":"            name\u003d\u0027uniq_ports0network_id0mac_address\u0027),"},{"line_number":156,"context_line":"        sa.UniqueConstraint("},{"line_number":157,"context_line":"            \u0027id\u0027, \u0027network_id\u0027,"},{"line_number":158,"context_line":"            name\u003d\u0027uniq_ports0id0network_id\u0027),"},{"line_number":159,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":160,"context_line":"    )"},{"line_number":161,"context_line":"    api_collections \u003d [port_def.COLLECTION_NAME]"}],"source_content_type":"text/x-python","patch_set":7,"id":"63868b00_35d27e97","line":158,"range":{"start_line":156,"start_character":8,"end_line":158,"end_character":45},"in_reply_to":"0bd76e22_3054a87f","updated":"2026-05-26 14:38:12.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":true,"context_lines":[{"line_number":153,"context_line":"        sa.UniqueConstraint("},{"line_number":154,"context_line":"            network_id, mac_address,"},{"line_number":155,"context_line":"            name\u003d\u0027uniq_ports0network_id0mac_address\u0027),"},{"line_number":156,"context_line":"        sa.UniqueConstraint("},{"line_number":157,"context_line":"            \u0027id\u0027, \u0027network_id\u0027,"},{"line_number":158,"context_line":"            name\u003d\u0027uniq_ports0id0network_id\u0027),"},{"line_number":159,"context_line":"        model_base.BASEV2.__table_args__"},{"line_number":160,"context_line":"    )"},{"line_number":161,"context_line":"    api_collections \u003d [port_def.COLLECTION_NAME]"}],"source_content_type":"text/x-python","patch_set":7,"id":"0bd76e22_3054a87f","line":158,"range":{"start_line":156,"start_character":8,"end_line":158,"end_character":45},"in_reply_to":"6a6340c1_d8f15737","updated":"2026-05-21 16:08:35.000000000","message":"It\u0027s changed here: https://review.opendev.org/c/openstack/neutron/+/987250/7/neutron/db/migration/alembic_migrations/versions/2026.2/expand/a00aa97899c0_add_l3_evpn_tables.py#32\n\nI need it to keep db integrity for the composite key here https://review.opendev.org/c/openstack/neutron/+/987250/7/neutron/db/migration/alembic_migrations/versions/2026.2/expand/a00aa97899c0_add_l3_evpn_tables.py#71","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"}],"neutron/services/evpn/plugin.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        router_id \u003d payload.resource_id"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        LOG.debug(\"Deallocating EVPN VNI for router %s\", router_id)"},{"line_number":107,"context_line":"        self._evpn_db.deallocate_vni_for_router(context, router_id)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @registry.receives(resources.ROUTER_INTERFACE, [events.BEFORE_CREATE])"},{"line_number":110,"context_line":"    def _process_router_interface_create(self, resource, event, trigger,"}],"source_content_type":"text/x-python","patch_set":7,"id":"d87457b8_d6f62235","line":107,"range":{"start_line":107,"start_character":0,"end_line":107,"end_character":2},"updated":"2026-05-21 09:10:01.000000000","message":"I would be consistent in the logging process: the INFO logs should be written at the end of the execution, once the call has been done and returned correctly.","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        router_id \u003d payload.resource_id"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        LOG.debug(\"Deallocating EVPN VNI for router %s\", router_id)"},{"line_number":107,"context_line":"        self._evpn_db.deallocate_vni_for_router(context, router_id)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @registry.receives(resources.ROUTER_INTERFACE, [events.BEFORE_CREATE])"},{"line_number":110,"context_line":"    def _process_router_interface_create(self, resource, event, trigger,"}],"source_content_type":"text/x-python","patch_set":7,"id":"f98a0ee7_38533612","line":107,"range":{"start_line":107,"start_character":0,"end_line":107,"end_character":2},"in_reply_to":"d87457b8_d6f62235","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bb231fad75a40a7141697557d1fb0c1cd0c1cbe1","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        context \u003d payload.context"},{"line_number":144,"context_line":"        subnet_id \u003d payload.metadata[\u0027subnet_id\u0027]"},{"line_number":145,"context_line":"        LOG.info(\"Removing EVPN network entry for subnet %s\", subnet_id)"},{"line_number":146,"context_line":"        self._evpn_db.remove_evpn_network_by_subnet(context, subnet_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"86b59cef_5c7c9d43","line":146,"range":{"start_line":146,"start_character":8,"end_line":146,"end_character":71},"updated":"2026-05-21 09:10:01.000000000","message":"I would be consistent in the logging process: the INFO logs should be written at the end of the execution, once the call has been done and returned correctly.","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e336e2681dd75221242ed90d46dbab226498e8b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        context \u003d payload.context"},{"line_number":144,"context_line":"        subnet_id \u003d payload.metadata[\u0027subnet_id\u0027]"},{"line_number":145,"context_line":"        LOG.info(\"Removing EVPN network entry for subnet %s\", subnet_id)"},{"line_number":146,"context_line":"        self._evpn_db.remove_evpn_network_by_subnet(context, subnet_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"477b151f_32745513","line":146,"range":{"start_line":146,"start_character":8,"end_line":146,"end_character":71},"in_reply_to":"86b59cef_5c7c9d43","updated":"2026-05-21 16:08:35.000000000","message":"Done","commit_id":"693f17eb94ffc832debcb76d047bf78ed2920572"}]}
