)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"389719f13cd607716f42ceb8a5092eb227a1dec4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b8384f40_5d440be6","updated":"2026-06-03 04:18:56.000000000","message":"I don\u0027t think the MySQL tests are actually using MySQL, need to investigate in the morning.","commit_id":"957e6d383dc7681e5d81ea6d5fa1f219d0e4b26c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"baa2bfc74a1cfe840f6ed6ca4177502dc5f4edc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"415ae610_e52f6c0b","updated":"2026-06-08 13:23:07.000000000","message":"recheck - LP BUG 2155789 was fixed","commit_id":"d2732d3fc0a0f74005f5eb7cc90bbdca9aadab36"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"a279a1ab0f0b4fc9b906350e089cc18a4361ce3c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"f83181e0_269f9fe1","updated":"2026-06-05 02:19:53.000000000","message":"recheck - looks like possibly a slow response waiting for a WaitForChassisPrivateCreateEvent, obviously unrelated to the patch.","commit_id":"d2732d3fc0a0f74005f5eb7cc90bbdca9aadab36"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"28f5f676648caff552170dcdd23ad84c6330654b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0b818af2_4cb84b87","updated":"2026-06-06 03:22:51.000000000","message":"recheck dsvm-functional testing against other recent failures","commit_id":"d2732d3fc0a0f74005f5eb7cc90bbdca9aadab36"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"5153ea2ca26af2e3086f7d3e277c06e49ba09b45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"8ff0537a_9d110431","updated":"2026-06-09 03:56:23.000000000","message":"recheck due to server timeout https://bugs.launchpad.net/neutron/+bug/2155883","commit_id":"d2732d3fc0a0f74005f5eb7cc90bbdca9aadab36"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"b01f151cd945c33c505402872efd2ee29e2a916b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"cd472697_627ff034","updated":"2026-06-09 03:54:51.000000000","message":"recheck neutron-ovs-tempest-multinode-full which I don\u0027t think this could break.","commit_id":"d2732d3fc0a0f74005f5eb7cc90bbdca9aadab36"}],"neutron/db/evpn_db.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        LOG.debug(\"Auto-allocated EVPN VNI %s for router %s\", vni, router_id)"},{"line_number":105,"context_line":"        return vni"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @db_api.CONTEXT_WRITER"},{"line_number":108,"context_line":"    def deallocate_vni_for_router(self, context, router_id):"},{"line_number":109,"context_line":"        \"\"\"Remove VNI/VLAN allocation for a router."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"533aad19_47b665e7","line":107,"range":{"start_line":107,"start_character":4,"end_line":107,"end_character":26},"updated":"2026-06-04 09:44:35.000000000","message":"Just asking: why this method is missing the `retry_if_session_inactive` decorator?","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0d57df0cd5c1f7a7b5c6fe5f745c51c80c83b257","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        LOG.debug(\"Auto-allocated EVPN VNI %s for router %s\", vni, router_id)"},{"line_number":105,"context_line":"        return vni"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @db_api.CONTEXT_WRITER"},{"line_number":108,"context_line":"    def deallocate_vni_for_router(self, context, router_id):"},{"line_number":109,"context_line":"        \"\"\"Remove VNI/VLAN allocation for a router."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"8c1e67d2_23daf5b4","line":107,"range":{"start_line":107,"start_character":4,"end_line":107,"end_character":26},"in_reply_to":"533aad19_47b665e7","updated":"2026-06-04 20:30:08.000000000","message":"I guess it\u0027s just because I overlooked it. Thanks for spotting it.","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"}],"neutron/db/rangeallocator.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _gap_subquery(self):"},{"line_number":79,"context_line":"        \"\"\"Subquery returning the minimum unoccupied value in the range.\"\"\""},{"line_number":80,"context_line":"        range_start \u003d sa.select(self._min_val.label(\u0027candidate\u0027))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        after_existing \u003d sa.select("}],"source_content_type":"text/x-python","patch_set":7,"id":"4d122470_a494d3c3","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":75},"updated":"2026-06-04 09:44:35.000000000","message":"Do we need always the first (minimum) unoccupied value? This is prone to race conditions if 2 requests are executed in parallel. Both will compete for the same ID. Instead, we can choose a random number there and that will prevent this race condition.\n\nWe had the same issue with the network creation is rally tests (https://bugs.launchpad.net/neutron/+bug/1920923). I added this random selector and that reduced to almost none the possibility to have 2 concurrent operations requesting the same ID (https://review.opendev.org/c/openstack/neutron/+/808160/2/neutron/objects/plugins/ml2/base.py)","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"694fe6625182b15b30d070104cdc422bea973eec","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _gap_subquery(self):"},{"line_number":79,"context_line":"        \"\"\"Subquery returning the minimum unoccupied value in the range.\"\"\""},{"line_number":80,"context_line":"        range_start \u003d sa.select(self._min_val.label(\u0027candidate\u0027))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        after_existing \u003d sa.select("}],"source_content_type":"text/x-python","patch_set":7,"id":"f1e640f8_7d1459c0","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":75},"in_reply_to":"4d122470_a494d3c3","updated":"2026-06-04 13:00:46.000000000","message":"There won\u0027t be a a problem in that case other than a retry, which for vlan/vxlan allocation I would expect to be fine. But the solution to that is the RandomRangeAllocator patch that is on top of this. :-) This minimum available version exists primarily because it is very cheap, and if you are allocating something that you don\u0027t expect super high concurrency on, it is the way to go.\n\nBut if it is something that is going to be in high contention, the RandomRangeAllocator will work. It\u0027s more complex that the one you linked, because that one has the benefit of pre-allocated rows and an allocated flag. We can\u0027t do that with potentially 16M rows. And w/o an allocated flag, to use the same ORDER BY random() trick, you\u0027d have to use a CTE to generate those 16M rows, do a  NOT IN allocations query, which is expensive every time. So I went with a window function approach which has O(k) complexity on *taken* values. If we had 10M rows, it\u0027d take like 30 seconds to run, but we\u0027d fall over *way* before that. It takes a few ms at the scale we would actually use. A recursive CTE approach I rejected that was cheap by doing random calls until it found a value, because it fails at too high a rate on small or densely packed tables (and MySQL has recursion limits that were annoying). https://gist.github.com/otherwiseguy/1ec4223a5f7fbb1f5fe318e389c1494d for an overview of the random allocator.","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"718784f0536a32f453e1e0e2bd3674001165e482","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _gap_subquery(self):"},{"line_number":79,"context_line":"        \"\"\"Subquery returning the minimum unoccupied value in the range.\"\"\""},{"line_number":80,"context_line":"        range_start \u003d sa.select(self._min_val.label(\u0027candidate\u0027))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        after_existing \u003d sa.select("}],"source_content_type":"text/x-python","patch_set":7,"id":"911e9142_782299be","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":75},"in_reply_to":"f1e640f8_7d1459c0","updated":"2026-06-04 13:49:08.000000000","message":"Right, if we have a good retry and we don\u0027t expect high concurrency, it is useless to make this code more complex.","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        if result.rowcount \u003d\u003d 0:"},{"line_number":124,"context_line":"            raise self._exception_class(min_val, max_val)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        row \u003d context.session.execute("},{"line_number":127,"context_line":"            sa.select(self._table.c[self._value_col_name])"},{"line_number":128,"context_line":"            .where(self._table.c.id \u003d\u003d allocation_id)"},{"line_number":129,"context_line":"        ).fetchone()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return allocation_id, getattr(row, self._value_col_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"b8201133_9fee0c77","line":129,"range":{"start_line":126,"start_character":8,"end_line":129,"end_character":20},"updated":"2026-06-04 09:44:35.000000000","message":"That was Claude, not me, who found this: what about is `row` is None?\n\n(blame Claude if this question is stupid)","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0d57df0cd5c1f7a7b5c6fe5f745c51c80c83b257","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        if result.rowcount \u003d\u003d 0:"},{"line_number":124,"context_line":"            raise self._exception_class(min_val, max_val)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        row \u003d context.session.execute("},{"line_number":127,"context_line":"            sa.select(self._table.c[self._value_col_name])"},{"line_number":128,"context_line":"            .where(self._table.c.id \u003d\u003d allocation_id)"},{"line_number":129,"context_line":"        ).fetchone()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return allocation_id, getattr(row, self._value_col_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"f7e67d46_f0f7fc2a","line":129,"range":{"start_line":126,"start_character":8,"end_line":129,"end_character":20},"in_reply_to":"090009da_4cd0a935","updated":"2026-06-04 20:30:08.000000000","message":"Do your Claudes think we should fix it here or is it fine with Terry\u0027s followup patch? And what do you think? :)","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c30b60a6aa0cdaafe091f19c96393fdd3a6b356b","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        if result.rowcount \u003d\u003d 0:"},{"line_number":124,"context_line":"            raise self._exception_class(min_val, max_val)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        row \u003d context.session.execute("},{"line_number":127,"context_line":"            sa.select(self._table.c[self._value_col_name])"},{"line_number":128,"context_line":"            .where(self._table.c.id \u003d\u003d allocation_id)"},{"line_number":129,"context_line":"        ).fetchone()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return allocation_id, getattr(row, self._value_col_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ad9c5765_04deb8e4","line":129,"range":{"start_line":126,"start_character":8,"end_line":129,"end_character":20},"in_reply_to":"45b2e201_ab5fdf31","updated":"2026-06-04 20:42:20.000000000","message":"Done","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5ade74ce0587638dd5b3c2cc0135b9a921ba006c","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        if result.rowcount \u003d\u003d 0:"},{"line_number":124,"context_line":"            raise self._exception_class(min_val, max_val)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        row \u003d context.session.execute("},{"line_number":127,"context_line":"            sa.select(self._table.c[self._value_col_name])"},{"line_number":128,"context_line":"            .where(self._table.c.id \u003d\u003d allocation_id)"},{"line_number":129,"context_line":"        ).fetchone()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return allocation_id, getattr(row, self._value_col_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"090009da_4cd0a935","line":129,"range":{"start_line":126,"start_character":8,"end_line":129,"end_character":20},"in_reply_to":"b8201133_9fee0c77","updated":"2026-06-04 18:30:57.000000000","message":"Funnily enough *my* Claude caught this and fixed it in the RandomRangeAllocator patch. 😂 https://review.opendev.org/c/openstack/neutron/+/991515/2/neutron/db/rangeallocator.py#149 So close, Claude. So close.","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d60305aecb99b6d8e7ea960e1cc1dfa9944a3f91","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        if result.rowcount \u003d\u003d 0:"},{"line_number":124,"context_line":"            raise self._exception_class(min_val, max_val)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        row \u003d context.session.execute("},{"line_number":127,"context_line":"            sa.select(self._table.c[self._value_col_name])"},{"line_number":128,"context_line":"            .where(self._table.c.id \u003d\u003d allocation_id)"},{"line_number":129,"context_line":"        ).fetchone()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return allocation_id, getattr(row, self._value_col_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"45b2e201_ab5fdf31","line":129,"range":{"start_line":126,"start_character":8,"end_line":129,"end_character":20},"in_reply_to":"f7e67d46_f0f7fc2a","updated":"2026-06-04 20:34:21.000000000","message":"I have a fix ready to go, but don\u0027t want to mess up your patch. 😉","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"}],"neutron/db/vni_vlan_allocator.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d303a4493bec4e24f9182bb8c07f13f6bf00434b","unresolved":true,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class VNIVLANAllocator:"},{"line_number":28,"context_line":"    \"\"\"Allocates paired VNI + VLAN IDs and manages their mapping."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This is a generic allocator that can be used by any component needing"}],"source_content_type":"text/x-python","patch_set":3,"id":"904e79b9_f4eb21c1","line":27,"updated":"2026-06-01 21:42:14.000000000","message":"@cardoe@cardoe.com would this be what you had in mind to create allocations between VXLAN overlay and the per cabinet VLANs?","commit_id":"5daa64e112898cea42d80cb008af3e8291f08019"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        :param physnet: Physical network scope"},{"line_number":75,"context_line":"        :returns: (mapping_id, vni, vlan_id)"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        context.session.flush()"},{"line_number":78,"context_line":"        vni_alloc_id, vni \u003d self._vni_allocator.allocate("},{"line_number":79,"context_line":"            context, min_vni, max_vni, physnet)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"d973880b_ba451cda","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":31},"updated":"2026-06-04 09:44:35.000000000","message":"nit: it could be useful to have a short comment about this flush. If I\u0027m not wrong, we expect the vlan allocation here","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0d57df0cd5c1f7a7b5c6fe5f745c51c80c83b257","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :param physnet: Physical network scope"},{"line_number":75,"context_line":"        :returns: (mapping_id, vni, vlan_id)"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        context.session.flush()"},{"line_number":78,"context_line":"        vni_alloc_id, vni \u003d self._vni_allocator.allocate("},{"line_number":79,"context_line":"            context, min_vni, max_vni, physnet)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"036d3ba4_f851048a","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":31},"in_reply_to":"d973880b_ba451cda","updated":"2026-06-04 20:30:08.000000000","message":"I actually don\u0027t think we need to flush here. We do need on L107","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        context.session.add(vni_allocation)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        try:"},{"line_number":107,"context_line":"            context.session.flush()"},{"line_number":108,"context_line":"        except os_db_exc.DBDuplicateEntry:"},{"line_number":109,"context_line":"            raise self._vni_in_use_exc(vni\u003dvni)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"93f80c3d_ce9a77a9","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":35},"updated":"2026-06-04 09:44:35.000000000","message":"ditto","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0d57df0cd5c1f7a7b5c6fe5f745c51c80c83b257","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        context.session.add(vni_allocation)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        try:"},{"line_number":107,"context_line":"            context.session.flush()"},{"line_number":108,"context_line":"        except os_db_exc.DBDuplicateEntry:"},{"line_number":109,"context_line":"            raise self._vni_in_use_exc(vni\u003dvni)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"2b9c7c8b_26bf944b","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":35},"in_reply_to":"93f80c3d_ce9a77a9","updated":"2026-06-04 20:30:08.000000000","message":"Done","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"}],"neutron/services/evpn/exceptions.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    message \u003d _(\"EVPN VNI not found for router %(router_id)s.\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class EVPNNoVniAvailable(exceptions.NeutronException):"},{"line_number":29,"context_line":"    message \u003d _(\"No EVPN VNI available in range [%(min_vni)s, %(max_vni)s].\")"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, min_val, max_val):"}],"source_content_type":"text/x-python","patch_set":7,"id":"d97ebda7_6865d457","line":28,"range":{"start_line":28,"start_character":36,"end_line":28,"end_character":52},"updated":"2026-06-04 09:44:35.000000000","message":"nit: For not available resource, we should raise 409 Conflict","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0d57df0cd5c1f7a7b5c6fe5f745c51c80c83b257","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    message \u003d _(\"EVPN VNI not found for router %(router_id)s.\")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class EVPNNoVniAvailable(exceptions.NeutronException):"},{"line_number":29,"context_line":"    message \u003d _(\"No EVPN VNI available in range [%(min_vni)s, %(max_vni)s].\")"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, min_val, max_val):"}],"source_content_type":"text/x-python","patch_set":7,"id":"0144f436_aaf5778e","line":28,"range":{"start_line":28,"start_character":36,"end_line":28,"end_character":52},"in_reply_to":"d97ebda7_6865d457","updated":"2026-06-04 20:30:08.000000000","message":"Done","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7472cb7006f910dfd94a4a173e0f8382bb77d88a","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        super().__init__(min_vni\u003dmin_val, max_vni\u003dmax_val)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class EVPNNoVlanAvailable(exceptions.NeutronException):"},{"line_number":36,"context_line":"    message \u003d _(\"No EVPN VLAN ID available in range \""},{"line_number":37,"context_line":"                \"[%(min_vlan)s, %(max_vlan)s].\")"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"239f3947_80e85c0c","line":35,"range":{"start_line":35,"start_character":37,"end_line":35,"end_character":53},"updated":"2026-06-04 09:44:35.000000000","message":"ditto","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0d57df0cd5c1f7a7b5c6fe5f745c51c80c83b257","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        super().__init__(min_vni\u003dmin_val, max_vni\u003dmax_val)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class EVPNNoVlanAvailable(exceptions.NeutronException):"},{"line_number":36,"context_line":"    message \u003d _(\"No EVPN VLAN ID available in range \""},{"line_number":37,"context_line":"                \"[%(min_vlan)s, %(max_vlan)s].\")"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"b71c1558_763a77f2","line":35,"range":{"start_line":35,"start_character":37,"end_line":35,"end_character":53},"in_reply_to":"239f3947_80e85c0c","updated":"2026-06-04 20:30:08.000000000","message":"Done","commit_id":"136ddf25bcb201907e6d12c742cba988148bc05c"}]}
