)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"f8728f72dc3239abcdeebb85e0f91c6858c2bcd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"90da80ff_8a467957","updated":"2025-08-15 16:11:01.000000000","message":"recheck","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"884b1fd34fa7563032d8c9c995768566507c5f85","unresolved":true,"context_lines":[{"line_number":949,"context_line":"            else:"},{"line_number":950,"context_line":"                LOG.debug(f\"LSP for port {floatingip[\u0027port_id\u0027]} \""},{"line_number":951,"context_line":"                          \"is not up, not setting external_mac for the \""},{"line_number":952,"context_line":"                          \"NAT entry.\")"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        # TODO(mjozefcz): Remove this workaround when OVN LB"},{"line_number":955,"context_line":"        # will support both decentralized FIPs on LB and member."}],"source_content_type":"text/x-python","patch_set":1,"id":"7e9e7522_05a7a37e","line":952,"updated":"2025-06-30 20:33:45.000000000","message":"I think this, and all the below LOG calls, should use %s and not f-strings, as it will defer things to call time. I thought we had a pep8 rule for that.","commit_id":"77b85a62cec009bb8812532680e55840d76f55a1"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"6dd413e3b1a66b525f5eccd3735bc81f5ffb5579","unresolved":false,"context_lines":[{"line_number":949,"context_line":"            else:"},{"line_number":950,"context_line":"                LOG.debug(f\"LSP for port {floatingip[\u0027port_id\u0027]} \""},{"line_number":951,"context_line":"                          \"is not up, not setting external_mac for the \""},{"line_number":952,"context_line":"                          \"NAT entry.\")"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        # TODO(mjozefcz): Remove this workaround when OVN LB"},{"line_number":955,"context_line":"        # will support both decentralized FIPs on LB and member."}],"source_content_type":"text/x-python","patch_set":1,"id":"efe7ca0f_41f2a2de","line":952,"in_reply_to":"7e9e7522_05a7a37e","updated":"2025-08-25 16:18:06.000000000","message":"Done","commit_id":"77b85a62cec009bb8812532680e55840d76f55a1"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"884b1fd34fa7563032d8c9c995768566507c5f85","unresolved":true,"context_lines":[{"line_number":1012,"context_line":"            if (nat.get(\u0027external_mac\u0027) !\u003d expected_ext_mac and"},{"line_number":1013,"context_line":"                    self._nb_idl.lsp_get_up(floatingip[\u0027port_id\u0027]).execute()):"},{"line_number":1014,"context_line":"                LOG.warning(f\"Updating NAT for {floatingip[\u0027id\u0027]} as the port \""},{"line_number":1015,"context_line":"                            \"LSP is now up\")"},{"line_number":1016,"context_line":"                self._nb_idl.db_set("},{"line_number":1017,"context_line":"                    \u0027NAT\u0027, nat[\u0027_uuid\u0027],"},{"line_number":1018,"context_line":"                    (\u0027external_mac\u0027, port_db[\u0027mac_address\u0027])).execute("}],"source_content_type":"text/x-python","patch_set":1,"id":"8d2215f4_1976669a","line":1015,"updated":"2025-06-30 20:33:45.000000000","message":"Seems a little odd to have this at warning level as it\u0027s making NAT work, maybe debug?","commit_id":"77b85a62cec009bb8812532680e55840d76f55a1"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"6dd413e3b1a66b525f5eccd3735bc81f5ffb5579","unresolved":false,"context_lines":[{"line_number":1012,"context_line":"            if (nat.get(\u0027external_mac\u0027) !\u003d expected_ext_mac and"},{"line_number":1013,"context_line":"                    self._nb_idl.lsp_get_up(floatingip[\u0027port_id\u0027]).execute()):"},{"line_number":1014,"context_line":"                LOG.warning(f\"Updating NAT for {floatingip[\u0027id\u0027]} as the port \""},{"line_number":1015,"context_line":"                            \"LSP is now up\")"},{"line_number":1016,"context_line":"                self._nb_idl.db_set("},{"line_number":1017,"context_line":"                    \u0027NAT\u0027, nat[\u0027_uuid\u0027],"},{"line_number":1018,"context_line":"                    (\u0027external_mac\u0027, port_db[\u0027mac_address\u0027])).execute("}],"source_content_type":"text/x-python","patch_set":1,"id":"0ec50166_f1e42b6c","line":1015,"in_reply_to":"8d2215f4_1976669a","updated":"2025-08-25 16:18:06.000000000","message":"Done","commit_id":"77b85a62cec009bb8812532680e55840d76f55a1"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"                (\u0027type\u0027, \u0027\u003d\u0027, \u0027dnat_and_snat\u0027)).execute()"},{"line_number":1010,"context_line":"            if not nat:"},{"line_number":1011,"context_line":"                LOG.warning("},{"line_number":1012,"context_line":"                    f\"NAT for {floatingip[\u0027id\u0027]} has not been found\")"},{"line_number":1013,"context_line":"                return"},{"line_number":1014,"context_line":"            # One port can only have one FIP."},{"line_number":1015,"context_line":"            nat \u003d nat[0]"}],"source_content_type":"text/x-python","patch_set":3,"id":"cdbfa70e_3f708b97","line":1012,"updated":"2025-08-15 20:14:02.000000000","message":"This needs to use %s semantics as well.","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"                (\u0027type\u0027, \u0027\u003d\u0027, \u0027dnat_and_snat\u0027)).execute()"},{"line_number":1010,"context_line":"            if not nat:"},{"line_number":1011,"context_line":"                LOG.warning("},{"line_number":1012,"context_line":"                    f\"NAT for {floatingip[\u0027id\u0027]} has not been found\")"},{"line_number":1013,"context_line":"                return"},{"line_number":1014,"context_line":"            # One port can only have one FIP."},{"line_number":1015,"context_line":"            nat \u003d nat[0]"}],"source_content_type":"text/x-python","patch_set":3,"id":"b36608dc_f2c5cf81","line":1012,"in_reply_to":"cdbfa70e_3f708b97","updated":"2025-08-25 08:09:50.000000000","message":"Acknowledged","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6eb9ffb40e67ee4d5d72ae81e7b5b61d3f09f7cc","unresolved":true,"context_lines":[{"line_number":998,"context_line":"                        floatingip[\u0027id\u0027])"},{"line_number":999,"context_line":"        self._transaction(commands, txn\u003dtxn)"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"        # Once the NAT transaction is committed, the port status needs to be"},{"line_number":1002,"context_line":"        # rechecked because it might have become ACTIVE in parallel which could"},{"line_number":1003,"context_line":"        # happen after the same check above but before the transaction commit."},{"line_number":1004,"context_line":"        # Not doing that results in never setting the external_mac."},{"line_number":1005,"context_line":"        if ovn_conf.is_ovn_distributed_floating_ip():"}],"source_content_type":"text/x-python","patch_set":4,"id":"b87acd77_bf511f5e","line":1002,"range":{"start_line":1001,"start_character":9,"end_line":1002,"end_character":79},"updated":"2025-08-27 12:50:36.000000000","message":"What guarantees that the LSP will be UP at this point?\n\nIn any case, my concern with this patch and bug is related to the current code. In the ``set_port_status_up`` method we call ``_update_dnat_entry_if_needed`` [1]. This method should update the \"NAT\" register MAC with the port one when it goes UP [2]. So why you are having the issue reported in the bug? Even if the port has not been set to UP when the \"NAT\" register is created, this method should later update it with the MAC value.\n\nWhen the issue reported in the LP bug is happening? How can I reproduce it locally? Is a race condition?\n\n[1]https://github.com/openstack/neutron/blob/f9067a719084710ee4f46fa31edb6a938e0dbbb0/neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py#L1305\n[2]https://github.com/openstack/neutron/blob/f9067a719084710ee4f46fa31edb6a938e0dbbb0/neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py#L1275-L1282","commit_id":"e7520e03fd59a1264fb2b021495f39810416d62c"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"24e0bf2968804dd9d9426def59b3d568889cfd81","unresolved":true,"context_lines":[{"line_number":998,"context_line":"                        floatingip[\u0027id\u0027])"},{"line_number":999,"context_line":"        self._transaction(commands, txn\u003dtxn)"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"        # Once the NAT transaction is committed, the port status needs to be"},{"line_number":1002,"context_line":"        # rechecked because it might have become ACTIVE in parallel which could"},{"line_number":1003,"context_line":"        # happen after the same check above but before the transaction commit."},{"line_number":1004,"context_line":"        # Not doing that results in never setting the external_mac."},{"line_number":1005,"context_line":"        if ovn_conf.is_ovn_distributed_floating_ip():"}],"source_content_type":"text/x-python","patch_set":4,"id":"3ccfd2c9_24cbe891","line":1002,"range":{"start_line":1001,"start_character":9,"end_line":1002,"end_character":79},"in_reply_to":"b87acd77_bf511f5e","updated":"2026-03-19 15:36:02.000000000","message":"\u003e When the issue reported in the LP bug is happening? How can I reproduce it locally? Is a race condition?\n\nIt\u0027s a race condition: I found it in production when I was hitting hitting it on a large estate quite often.\n\nApologies for the lack of response for a while - had to find time to rework this and include test coverage and functional tests.\n\nI hope the tests illustrate the race window more clearly because it\u0027s quite subtle but I had consistent reproducers.","commit_id":"e7520e03fd59a1264fb2b021495f39810416d62c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"45a0063399c5f30ad05d49f1166b0fe820541c72","unresolved":true,"context_lines":[{"line_number":991,"context_line":"        self._transaction(commands, txn\u003dtxn)"},{"line_number":992,"context_line":"        return needs_post_commit_ext_mac_check"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"    def _post_commit_check_fip_external_mac(self, port_id, floatingip_id):"},{"line_number":995,"context_line":"        \"\"\"Re-check the LSP state after a NAT entry is committed."},{"line_number":996,"context_line":""},{"line_number":997,"context_line":"        When creating a distributed FIP, the port LSP state is checked before"}],"source_content_type":"text/x-python","patch_set":5,"id":"36d490fd_f2a28c06","line":994,"updated":"2026-03-20 21:42:58.000000000","message":"I\u0027ll be honest: this thing about `needs_post_commit_ext_mac_check` is intrusive. We have the advantage of using an event aware connection to the OVN database. My suggestion, that makes this implementation more elegant is to use a NAT register creation event: when we create a NAT register for a FIP, we register a creation event. When the event is received, we execute the code in this method that checks if the external port LSP is UP and updates the external MAC if not present.","commit_id":"81bccc5a2412f79f5ab31c416fd4a037b198fb2c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"49c9eb39996f61650de78c3e313eaa081a6fe034","unresolved":true,"context_lines":[{"line_number":991,"context_line":"        self._transaction(commands, txn\u003dtxn)"},{"line_number":992,"context_line":"        return needs_post_commit_ext_mac_check"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"    def _post_commit_check_fip_external_mac(self, port_id, floatingip_id):"},{"line_number":995,"context_line":"        \"\"\"Re-check the LSP state after a NAT entry is committed."},{"line_number":996,"context_line":""},{"line_number":997,"context_line":"        When creating a distributed FIP, the port LSP state is checked before"}],"source_content_type":"text/x-python","patch_set":5,"id":"47933d7e_a37e471d","line":994,"in_reply_to":"36d490fd_f2a28c06","updated":"2026-04-30 14:22:41.000000000","message":"I\u0027ve proposed https://review.opendev.org/c/openstack/neutron/+/986805. Please check this patch.","commit_id":"81bccc5a2412f79f5ab31c416fd4a037b198fb2c"}],"neutron/tests/unit/services/ovn_l3/test_plugin.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1171,"context_line":"            True)"},{"line_number":1172,"context_line":""},{"line_number":1173,"context_line":"        fake_nat_uuid \u003d uuidutils.generate_uuid()"},{"line_number":1174,"context_line":"        # Pretend that the external_mac has not been set when returning the"},{"line_number":1175,"context_line":"        # NAT entry."},{"line_number":1176,"context_line":"        nat_row \u003d fake_resources.FakeOvsdbRow.create_one_ovsdb_row("},{"line_number":1177,"context_line":"            attrs\u003d{\u0027_uuid\u0027: fake_nat_uuid, \u0027external_ids\u0027: {"}],"source_content_type":"text/x-python","patch_set":3,"id":"881be765_aaec4a6e","line":1174,"range":{"start_line":1174,"start_character":40,"end_line":1174,"end_character":52},"updated":"2025-08-15 20:14:02.000000000","message":"s/has been\n\nAt least it looks like we are returning a value with the mac set","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"            True)"},{"line_number":1172,"context_line":""},{"line_number":1173,"context_line":"        fake_nat_uuid \u003d uuidutils.generate_uuid()"},{"line_number":1174,"context_line":"        # Pretend that the external_mac has not been set when returning the"},{"line_number":1175,"context_line":"        # NAT entry."},{"line_number":1176,"context_line":"        nat_row \u003d fake_resources.FakeOvsdbRow.create_one_ovsdb_row("},{"line_number":1177,"context_line":"            attrs\u003d{\u0027_uuid\u0027: fake_nat_uuid, \u0027external_ids\u0027: {"}],"source_content_type":"text/x-python","patch_set":3,"id":"e6278b20_63838148","line":1174,"range":{"start_line":1174,"start_character":40,"end_line":1174,"end_character":52},"in_reply_to":"881be765_aaec4a6e","updated":"2025-08-25 08:09:50.000000000","message":"I suppose I can rephrase it better because there are two separate places where the MAC is represented:\n\n1) nat[\u0027external_mac\u0027] (which is what we are pretending is not set)\nhttps://www.ovn.org/support/dist-docs/ovn-nb.5.html (under the NAT table)\n\n2) nat.external_ids[\u0027neutron:fip_external_mac\u0027] (AKA OVN_FIP_EXT_MAC_KEY) which IS being set.\n\nI\u0027ll make it clear that I am talking about the external_mac column itself rather than the external_id here.","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1179,"context_line":"            }})"},{"line_number":1180,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1181,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1182,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1183,"context_line":""},{"line_number":1184,"context_line":"        config.cfg.CONF.set_override("},{"line_number":1185,"context_line":"            \u0027enable_distributed_floating_ip\u0027, True, group\u003d\u0027ovn\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"461fa4c3_c7064b2e","line":1182,"updated":"2025-08-15 20:14:02.000000000","message":"I don\u0027t think you need the temp variable, something like this works directly (from L1046 above):\n\nself.nb_idl().db_find.return_value.execute.return_value \u003d [nat_row]\n\nActually looking  at this again and all my below comments, it seems like we can just move this to happen by default in setUp() after self.nb_idl is mocked. That way the changes are more contained. I actually just quickly coded this up and can push, there were some other tweaks necessary as well, just let me know.","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"            }})"},{"line_number":1180,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1181,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1182,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1183,"context_line":""},{"line_number":1184,"context_line":"        config.cfg.CONF.set_override("},{"line_number":1185,"context_line":"            \u0027enable_distributed_floating_ip\u0027, True, group\u003d\u0027ovn\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fbc3c1f2_b5505d55","line":1182,"in_reply_to":"461fa4c3_c7064b2e","updated":"2025-08-25 08:09:50.000000000","message":"Done","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1197,"context_line":"                self.fake_floating_ip[\u0027port_id\u0027],"},{"line_number":1198,"context_line":"            ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY: utils.ovn_name("},{"line_number":1199,"context_line":"                self.fake_floating_ip[\u0027router_id\u0027]),"},{"line_number":1200,"context_line":"            ovn_const.OVN_FIP_EXT_MAC_KEY: \u002700:01:02:03:04:05\u0027,"},{"line_number":1201,"context_line":"            ovn_const.OVN_FIP_NET_ID:"},{"line_number":1202,"context_line":"                self.fake_floating_ip[\u0027floating_network_id\u0027]}"},{"line_number":1203,"context_line":"        self.l3_inst._nb_ovn.add_nat_rule_in_lrouter.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":3,"id":"9e87236e_0192b8e1","line":1200,"range":{"start_line":1200,"start_character":43,"end_line":1200,"end_character":62},"updated":"2025-08-15 20:14:02.000000000","message":"s/fip_port_mac","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"                self.fake_floating_ip[\u0027port_id\u0027],"},{"line_number":1198,"context_line":"            ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY: utils.ovn_name("},{"line_number":1199,"context_line":"                self.fake_floating_ip[\u0027router_id\u0027]),"},{"line_number":1200,"context_line":"            ovn_const.OVN_FIP_EXT_MAC_KEY: \u002700:01:02:03:04:05\u0027,"},{"line_number":1201,"context_line":"            ovn_const.OVN_FIP_NET_ID:"},{"line_number":1202,"context_line":"                self.fake_floating_ip[\u0027floating_network_id\u0027]}"},{"line_number":1203,"context_line":"        self.l3_inst._nb_ovn.add_nat_rule_in_lrouter.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":3,"id":"a91df4d3_5693f7ea","line":1200,"range":{"start_line":1200,"start_character":43,"end_line":1200,"end_character":62},"in_reply_to":"9e87236e_0192b8e1","updated":"2025-08-25 08:09:50.000000000","message":"Acknowledged","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1233,"context_line":"            }})"},{"line_number":1234,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1235,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1236,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1237,"context_line":""},{"line_number":1238,"context_line":"        config.cfg.CONF.set_override("},{"line_number":1239,"context_line":"            \u0027enable_distributed_floating_ip\u0027, True, group\u003d\u0027ovn\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"60c4a3c1_fe8d9a8f","line":1236,"updated":"2025-08-15 20:14:02.000000000","message":"Same comment","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"            }})"},{"line_number":1234,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1235,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1236,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1237,"context_line":""},{"line_number":1238,"context_line":"        config.cfg.CONF.set_override("},{"line_number":1239,"context_line":"            \u0027enable_distributed_floating_ip\u0027, True, group\u003d\u0027ovn\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e1cb87f7_f7e03ed5","line":1236,"in_reply_to":"60c4a3c1_fe8d9a8f","updated":"2025-08-25 08:09:50.000000000","message":"Acknowledged","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1414,"context_line":"            }})"},{"line_number":1415,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1416,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1417,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":1420,"context_line":"            self.context, states\u003d(self.fake_floating_ip,),"}],"source_content_type":"text/x-python","patch_set":3,"id":"be096e6d_3037df5b","line":1417,"updated":"2025-08-15 20:14:02.000000000","message":"Same comment","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1414,"context_line":"            }})"},{"line_number":1415,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1416,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1417,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":1420,"context_line":"            self.context, states\u003d(self.fake_floating_ip,),"}],"source_content_type":"text/x-python","patch_set":3,"id":"b6a6e971_7e01e306","line":1417,"in_reply_to":"be096e6d_3037df5b","updated":"2025-08-25 08:09:50.000000000","message":"Acknowledged","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1465,"context_line":"            }})"},{"line_number":1466,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1467,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1468,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":1471,"context_line":"            self.context, states\u003d(self.fake_floating_ip,),"}],"source_content_type":"text/x-python","patch_set":3,"id":"35fe44e0_8658abd9","line":1468,"updated":"2025-08-15 20:14:02.000000000","message":"Same comment","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1465,"context_line":"            }})"},{"line_number":1466,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1467,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1468,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":1471,"context_line":"            self.context, states\u003d(self.fake_floating_ip,),"}],"source_content_type":"text/x-python","patch_set":3,"id":"40cad0a8_be7f259d","line":1468,"in_reply_to":"35fe44e0_8658abd9","updated":"2025-08-25 08:09:50.000000000","message":"Acknowledged","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4db13c390f0afe44dcd2e32f18812e78b0c1e880","unresolved":true,"context_lines":[{"line_number":1765,"context_line":"            }})"},{"line_number":1766,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1767,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1768,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1769,"context_line":""},{"line_number":1770,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":1771,"context_line":"            self.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"6a87f1cb_b8630491","line":1768,"updated":"2025-08-15 20:14:02.000000000","message":"Same comment","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a11562938742a1786b06106f286d354218610b2c","unresolved":false,"context_lines":[{"line_number":1765,"context_line":"            }})"},{"line_number":1766,"context_line":"        fake_db_find \u003d mock.Mock()"},{"line_number":1767,"context_line":"        fake_db_find.execute.return_value \u003d [nat_row]"},{"line_number":1768,"context_line":"        self.nb_idl().db_find.return_value \u003d fake_db_find"},{"line_number":1769,"context_line":""},{"line_number":1770,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":1771,"context_line":"            self.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3de2383a_8f0c6fee","line":1768,"in_reply_to":"6a87f1cb_b8630491","updated":"2025-08-25 08:09:50.000000000","message":"Acknowledged","commit_id":"f828065be7daaa6bfc657c21a3fb0eda025d0e79"}]}
