)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"50d83380df657463710684d031c59701a3535510","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"89968f15_9c99af7b","updated":"2025-10-20 20:58:40.000000000","message":"I\u0027m going to split this big patch into two so it\u0027s easier to review.","commit_id":"3c2b2faa675f5640531acd1baa31244d0224a3f7"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"df88bffacec613adb55a4e40eee5e2ebf844da58","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3df6e58e_a08df878","updated":"2025-10-02 19:19:07.000000000","message":"recheck bug/2126685","commit_id":"3c2b2faa675f5640531acd1baa31244d0224a3f7"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ff4f8611e7675727f5e9fe6b339e93b073b80e7e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"7a1c0b79_939e1f3e","updated":"2025-10-23 00:07:36.000000000","message":"recheck bug 2129284","commit_id":"01db7c69527dfa4eb169d63844c33698a74a046c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e4d4c2f65556b70ccd56c7e9e881f974ad71643","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"dc1e9837_9651d01f","updated":"2026-01-06 14:07:06.000000000","message":"recheck - openvswitch job ran out of memory and multiple processes were killed by the oom-killer","commit_id":"e697a82321cc8a2bda5bebaab7b60e26eb6d83ab"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"39ab741abe161a5c04ec943ed67d685da2b0ffc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"7dcdcbcd_dfdb0751","updated":"2026-01-23 20:57:17.000000000","message":"just some test comments. thanks","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"bdb42a27d73a4fc9ee5027a52db7ce42d1ecf9d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"6f0c27c5_e2a63fe5","updated":"2026-01-26 20:07:26.000000000","message":"LGTM, one more nit comment","commit_id":"687d0c3f24f45d7438f1288da4450baa8d0a4ae0"}],"neutron/services/bgp/events.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"90ba830850b4c0916f55d187f28a8af42c99dc58","unresolved":true,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.services.bgp import constants"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BGPChassisEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5bf8ebb4_9d319e5d","line":21,"updated":"2026-01-23 08:36:14.000000000","message":"nit: You don\u0027t need it to be here as you don\u0027t log anything in this file","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"fa990bcc566d377ecc06f852eea9db32dfdd4b83","unresolved":true,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.services.bgp import constants"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BGPChassisEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":15,"id":"ca7fc388_240b21ef","line":21,"in_reply_to":"5bf8ebb4_9d319e5d","updated":"2026-01-23 14:24:49.000000000","message":"yeah, it\u0027s most likely an artifact, sharp eyes :)","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d8833975754df7e97f9741a19d27ba0f1aa715a5","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.services.bgp import constants"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BGPChassisEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":15,"id":"e34be24f_7263adc0","line":21,"in_reply_to":"ca7fc388_240b21ef","updated":"2026-01-23 18:01:13.000000000","message":"Done","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"}],"neutron/services/bgp/reconciler.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"a3c26b61680686849cbf66957b42afcd4f68d753","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        self.nb_api.stop()"},{"line_number":51,"context_line":"        self.sb_api.stop()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def reset_connections(self):"},{"line_number":54,"context_line":"        self.nb_api.restart_connection()"},{"line_number":55,"context_line":"        self.sb_api.restart_connection()"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"0e8224b6_d4daab05","line":53,"updated":"2026-01-23 16:08:00.000000000","message":"I am curious what led to the inclusion of this, and it being called in the BGPWorker.reset. From what I can tell, it might be called when a SIGHUP happens? Seems like most things I see just do some config reloads, but nothing with connections.","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d8833975754df7e97f9741a19d27ba0f1aa715a5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.nb_api.stop()"},{"line_number":51,"context_line":"        self.sb_api.stop()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def reset_connections(self):"},{"line_number":54,"context_line":"        self.nb_api.restart_connection()"},{"line_number":55,"context_line":"        self.sb_api.restart_connection()"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ed4d79db_91c6f6bd","line":53,"in_reply_to":"0e8224b6_d4daab05","updated":"2026-01-23 18:01:13.000000000","message":"Done","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"1062f9ae1ff6b19f6352caf9c3090da472b09c23","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        self.nb_api \u003d ovn.OvnNbIdl("},{"line_number":39,"context_line":"            ovn_conf.get_ovn_nb_connection(),"},{"line_number":40,"context_line":"            self.nb_events).start("},{"line_number":41,"context_line":"                timeout\u003dovn_conf.get_ovn_ovsdb_timeout())"},{"line_number":42,"context_line":"        self.nb_api.set_lock()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.sb_api \u003d ovn.OvnSbIdl("},{"line_number":45,"context_line":"            ovn_conf.get_ovn_sb_connection(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"16f60bca_c4d41904","line":42,"range":{"start_line":40,"start_character":27,"end_line":42,"end_character":30},"updated":"2026-01-23 19:31:25.000000000","message":"Just thinking out loud... should we just initialize DBs in `__init__` and then have a dedicated `start` method for starting them? This would also then map nicely into `BGPWorker` methods","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"bdb42a27d73a4fc9ee5027a52db7ce42d1ecf9d5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        self.nb_api \u003d ovn.OvnNbIdl("},{"line_number":39,"context_line":"            ovn_conf.get_ovn_nb_connection(),"},{"line_number":40,"context_line":"            self.nb_events).start("},{"line_number":41,"context_line":"                timeout\u003dovn_conf.get_ovn_ovsdb_timeout())"},{"line_number":42,"context_line":"        self.nb_api.set_lock()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.sb_api \u003d ovn.OvnSbIdl("},{"line_number":45,"context_line":"            ovn_conf.get_ovn_sb_connection(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"ca95f63a_92c54a18","line":42,"range":{"start_line":40,"start_character":27,"end_line":42,"end_character":30},"in_reply_to":"1132dca6_aa0c8d26","updated":"2026-01-26 20:07:26.000000000","message":"Acknowledged","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81a987f45d7f433d3662073198a56d7f2b21ff13","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    def __init__(self):"},{"line_number":38,"context_line":"        self.nb_api \u003d ovn.OvnNbIdl("},{"line_number":39,"context_line":"            ovn_conf.get_ovn_nb_connection(),"},{"line_number":40,"context_line":"            self.nb_events).start("},{"line_number":41,"context_line":"                timeout\u003dovn_conf.get_ovn_ovsdb_timeout())"},{"line_number":42,"context_line":"        self.nb_api.set_lock()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        self.sb_api \u003d ovn.OvnSbIdl("},{"line_number":45,"context_line":"            ovn_conf.get_ovn_sb_connection(),"}],"source_content_type":"text/x-python","patch_set":16,"id":"1132dca6_aa0c8d26","line":42,"range":{"start_line":40,"start_character":27,"end_line":42,"end_character":30},"in_reply_to":"16f60bca_c4d41904","updated":"2026-01-26 18:33:20.000000000","message":"I have no strong opinion on this and can change it if you want. However, the Reconciler is created in the `start()` method of the worker and the \"start of reconciler\" is the `full_sync()`. Maybe you could consider instantiating the IDLs as a side-effect but given that it\u0027s the only Reconciler instance attributes and hence its state and the Reconciler is instantiated within the `start()` method then I think this is the right choice.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"}],"neutron/tests/functional/services/bgp/__init__.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"1062f9ae1ff6b19f6352caf9c3090da472b09c23","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def is_policy_output_port_column_supported(idl):"},{"line_number":61,"context_line":"    return idlutils.table_has_column("},{"line_number":62,"context_line":"        idl, \u0027Logical_Router_Policy\u0027, \u0027output_port\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class BaseBgpIDLTestCase(n_base.BaseLoggingTestCase):"}],"source_content_type":"text/x-python","patch_set":16,"id":"0f7705af_9144921f","line":62,"range":{"start_line":61,"start_character":0,"end_line":62,"end_character":52},"updated":"2026-01-23 19:31:25.000000000","message":"Can you add a doc string comment with OVN version which added this support? This way we can can easily remove it in the future if it is safe to do so.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81a987f45d7f433d3662073198a56d7f2b21ff13","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def is_policy_output_port_column_supported(idl):"},{"line_number":61,"context_line":"    return idlutils.table_has_column("},{"line_number":62,"context_line":"        idl, \u0027Logical_Router_Policy\u0027, \u0027output_port\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class BaseBgpIDLTestCase(n_base.BaseLoggingTestCase):"}],"source_content_type":"text/x-python","patch_set":16,"id":"8c43cb5f_1951143f","line":62,"range":{"start_line":61,"start_character":0,"end_line":62,"end_character":52},"in_reply_to":"0f7705af_9144921f","updated":"2026-01-26 18:33:20.000000000","message":"Done","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"}],"neutron/tests/functional/services/bgp/test_reconciler.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"a3c26b61680686849cbf66957b42afcd4f68d753","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        self.nb_api \u003d self.reconciler.nb_api"},{"line_number":46,"context_line":"        self.sb_api \u003d self.reconciler.sb_api"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.test_sb_idl \u003d self._create_additional_sb_idl()"},{"line_number":49,"context_line":"        self.chassis_bgp_networks \u003d (\u0027bgp-net-1\u0027, \u0027bgp-net-2\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"b10bdbf3_e08dbf3f","line":48,"updated":"2026-01-23 16:08:00.000000000","message":"What does creating the additional_sb_idl give us? All clients should basically get the same ovsdb monitor updates.","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d8833975754df7e97f9741a19d27ba0f1aa715a5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.nb_api \u003d self.reconciler.nb_api"},{"line_number":46,"context_line":"        self.sb_api \u003d self.reconciler.sb_api"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.test_sb_idl \u003d self._create_additional_sb_idl()"},{"line_number":49,"context_line":"        self.chassis_bgp_networks \u003d (\u0027bgp-net-1\u0027, \u0027bgp-net-2\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"0a5cd56c_13343701","line":48,"in_reply_to":"b10bdbf3_e08dbf3f","updated":"2026-01-23 18:01:13.000000000","message":"It is to be able to create a chassis since that requires a Encap table. I\u0027ll leave a comment about it.","commit_id":"fbddcb6d6d8a693384d370ff2392e7e633726b57"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"39ab741abe161a5c04ec943ed67d685da2b0ffc2","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        return self.sb_api.db_list_rows("},{"line_number":86,"context_line":"            \u0027Chassis_Private\u0027, [chassis_name]).execute(check_error\u003dTrue)[0]"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_all_chassis(self):"},{"line_number":89,"context_line":"        return self.sb_api.db_list_rows(\u0027Chassis_Private\u0027).execute("},{"line_number":90,"context_line":"            check_error\u003dTrue)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"d80e16c0_0f20d373","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":24},"updated":"2026-01-23 20:57:17.000000000","message":"nit: Its technically `_get_all_private_chassis` since the `Chassis_Private` is hardcoded.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81a987f45d7f433d3662073198a56d7f2b21ff13","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return self.sb_api.db_list_rows("},{"line_number":86,"context_line":"            \u0027Chassis_Private\u0027, [chassis_name]).execute(check_error\u003dTrue)[0]"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_all_chassis(self):"},{"line_number":89,"context_line":"        return self.sb_api.db_list_rows(\u0027Chassis_Private\u0027).execute("},{"line_number":90,"context_line":"            check_error\u003dTrue)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"6a26dd91_98261b58","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":24},"in_reply_to":"d80e16c0_0f20d373","updated":"2026-01-26 18:33:20.000000000","message":"Done","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"39ab741abe161a5c04ec943ed67d685da2b0ffc2","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            try:"},{"line_number":104,"context_line":"                ha_chassis \u003d lrp.ha_chassis_group[0].ha_chassis[0]"},{"line_number":105,"context_line":"                lrp_chassis \u003d ha_chassis.chassis_name"},{"line_number":106,"context_line":"            except (IndexError, AttributeError):"},{"line_number":107,"context_line":"                self.fail("},{"line_number":108,"context_line":"                    f\"LRP {lrp.name} on the main BGP router has wrong chassis \""},{"line_number":109,"context_line":"                    f\"binding: {lrp.ha_chassis_group}\")"},{"line_number":110,"context_line":"            try:"},{"line_number":111,"context_line":"                all_chassis.remove(lrp_chassis)"},{"line_number":112,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"6868fa81_8f88426c","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":55},"updated":"2026-01-23 20:57:17.000000000","message":"This is not clear to me... how is index or attribute error determining that BGP router has wrong chassis. It simply tells you that it is not there. \nI was expecting some value check here to  determine that BGP router has wrong chassis","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"fa4c2b907be404cf47563569196f17feaecf20b6","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            try:"},{"line_number":104,"context_line":"                ha_chassis \u003d lrp.ha_chassis_group[0].ha_chassis[0]"},{"line_number":105,"context_line":"                lrp_chassis \u003d ha_chassis.chassis_name"},{"line_number":106,"context_line":"            except (IndexError, AttributeError):"},{"line_number":107,"context_line":"                self.fail("},{"line_number":108,"context_line":"                    f\"LRP {lrp.name} on the main BGP router has wrong chassis \""},{"line_number":109,"context_line":"                    f\"binding: {lrp.ha_chassis_group}\")"},{"line_number":110,"context_line":"            try:"},{"line_number":111,"context_line":"                all_chassis.remove(lrp_chassis)"},{"line_number":112,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"dba0c424_dec46d4e","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":55},"in_reply_to":"5653d294_dfadae96","updated":"2026-01-26 21:20:20.000000000","message":"It\u0027s a good point. Maybe I should think how to make it more robust. My thinking was that we have N chassis and hence we should have N LRPs. So maybe I should approach it from the other direction - list the chassis and then make sure that each chassis router is connected to the main one.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81a987f45d7f433d3662073198a56d7f2b21ff13","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            try:"},{"line_number":104,"context_line":"                ha_chassis \u003d lrp.ha_chassis_group[0].ha_chassis[0]"},{"line_number":105,"context_line":"                lrp_chassis \u003d ha_chassis.chassis_name"},{"line_number":106,"context_line":"            except (IndexError, AttributeError):"},{"line_number":107,"context_line":"                self.fail("},{"line_number":108,"context_line":"                    f\"LRP {lrp.name} on the main BGP router has wrong chassis \""},{"line_number":109,"context_line":"                    f\"binding: {lrp.ha_chassis_group}\")"},{"line_number":110,"context_line":"            try:"},{"line_number":111,"context_line":"                all_chassis.remove(lrp_chassis)"},{"line_number":112,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"8bc3ad99_04e07fdf","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":55},"in_reply_to":"6868fa81_8f88426c","updated":"2026-01-26 18:33:20.000000000","message":"The IndexError means either the LRP has no ha_chassis_group set or the ha_chassis_group has no ha_chassis in it. Both is wrong since the LRPs must be bound and hence have the ha_chassis_group correctly configured.\n\nThe AttributeError is probably a pebkac - it would mean the used schema is wrong.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"bdb42a27d73a4fc9ee5027a52db7ce42d1ecf9d5","unresolved":true,"context_lines":[{"line_number":103,"context_line":"            try:"},{"line_number":104,"context_line":"                ha_chassis \u003d lrp.ha_chassis_group[0].ha_chassis[0]"},{"line_number":105,"context_line":"                lrp_chassis \u003d ha_chassis.chassis_name"},{"line_number":106,"context_line":"            except (IndexError, AttributeError):"},{"line_number":107,"context_line":"                self.fail("},{"line_number":108,"context_line":"                    f\"LRP {lrp.name} on the main BGP router has wrong chassis \""},{"line_number":109,"context_line":"                    f\"binding: {lrp.ha_chassis_group}\")"},{"line_number":110,"context_line":"            try:"},{"line_number":111,"context_line":"                all_chassis.remove(lrp_chassis)"},{"line_number":112,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5653d294_dfadae96","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":55},"in_reply_to":"8bc3ad99_04e07fdf","updated":"2026-01-26 20:07:26.000000000","message":"I know what you mean and maybe I am overcomplicating it :) But technically this just tells you that there is no ha_chassis chassis which is implicitly wrong, but what about if there was a HA chassis set and it is not the one you expected.\nMaybe just updating the message would make me feel better :) \n```\nf\"LRP {lrp.name} on the main BGP router has no HA chassis \"\nf\"binding: {lrp.ha_chassis_group}\"","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e36004a736004d196e2d52f496b3258eb7be8111","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            try:"},{"line_number":104,"context_line":"                ha_chassis \u003d lrp.ha_chassis_group[0].ha_chassis[0]"},{"line_number":105,"context_line":"                lrp_chassis \u003d ha_chassis.chassis_name"},{"line_number":106,"context_line":"            except (IndexError, AttributeError):"},{"line_number":107,"context_line":"                self.fail("},{"line_number":108,"context_line":"                    f\"LRP {lrp.name} on the main BGP router has wrong chassis \""},{"line_number":109,"context_line":"                    f\"binding: {lrp.ha_chassis_group}\")"},{"line_number":110,"context_line":"            try:"},{"line_number":111,"context_line":"                all_chassis.remove(lrp_chassis)"},{"line_number":112,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"fac6f288_f84ca6d5","line":109,"range":{"start_line":106,"start_character":0,"end_line":109,"end_character":55},"in_reply_to":"dba0c424_dec46d4e","updated":"2026-01-26 21:47:26.000000000","message":"Done","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"39ab741abe161a5c04ec943ed67d685da2b0ffc2","unresolved":true,"context_lines":[{"line_number":151,"context_line":"                            constants.LRP_NETWORK_NAME_EXT_ID_KEY])"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def test_full_sync(self):"},{"line_number":154,"context_line":"        for i in range(0, 6):"},{"line_number":155,"context_line":"            chassis_name \u003d f\u0027chassis{i+1}\u0027"},{"line_number":156,"context_line":"            self._create_chassis("},{"line_number":157,"context_line":"                chassis_name, f\u0027192.168.1.10{i+1}\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"4e4e1241_65ced8ad","line":154,"updated":"2026-01-23 20:57:17.000000000","message":"nit: why not just `range(1,7)` and then you dont need to `+1` everywhere","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81a987f45d7f433d3662073198a56d7f2b21ff13","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                            constants.LRP_NETWORK_NAME_EXT_ID_KEY])"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def test_full_sync(self):"},{"line_number":154,"context_line":"        for i in range(0, 6):"},{"line_number":155,"context_line":"            chassis_name \u003d f\u0027chassis{i+1}\u0027"},{"line_number":156,"context_line":"            self._create_chassis("},{"line_number":157,"context_line":"                chassis_name, f\u0027192.168.1.10{i+1}\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"c92796b2_a54dfc59","line":154,"in_reply_to":"4e4e1241_65ced8ad","updated":"2026-01-26 18:33:20.000000000","message":"Good catch, it could be some dependency on the Chassis Indexing that was removed - now I do not need to +1 anymore it seems.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"39ab741abe161a5c04ec943ed67d685da2b0ffc2","unresolved":true,"context_lines":[{"line_number":153,"context_line":"    def test_full_sync(self):"},{"line_number":154,"context_line":"        for i in range(0, 6):"},{"line_number":155,"context_line":"            chassis_name \u003d f\u0027chassis{i+1}\u0027"},{"line_number":156,"context_line":"            self._create_chassis("},{"line_number":157,"context_line":"                chassis_name, f\u0027192.168.1.10{i+1}\u0027,"},{"line_number":158,"context_line":"                bgp_bridges\u003dself.chassis_bgp_networks)"},{"line_number":159,"context_line":"        self.reconciler.full_sync()"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f337fb5_b3d16d49","line":156,"updated":"2026-01-23 20:57:17.000000000","message":"Should this test first start with an assert that there no prexisting chassis? this way you are starting from a clean state","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"bdb42a27d73a4fc9ee5027a52db7ce42d1ecf9d5","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    def test_full_sync(self):"},{"line_number":154,"context_line":"        for i in range(0, 6):"},{"line_number":155,"context_line":"            chassis_name \u003d f\u0027chassis{i+1}\u0027"},{"line_number":156,"context_line":"            self._create_chassis("},{"line_number":157,"context_line":"                chassis_name, f\u0027192.168.1.10{i+1}\u0027,"},{"line_number":158,"context_line":"                bgp_bridges\u003dself.chassis_bgp_networks)"},{"line_number":159,"context_line":"        self.reconciler.full_sync()"}],"source_content_type":"text/x-python","patch_set":16,"id":"4a570252_5e00b061","line":156,"in_reply_to":"2d9fec0c_a2342ddc","updated":"2026-01-26 20:07:26.000000000","message":"If clean up is doing that, then I think this is ok.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81a987f45d7f433d3662073198a56d7f2b21ff13","unresolved":true,"context_lines":[{"line_number":153,"context_line":"    def test_full_sync(self):"},{"line_number":154,"context_line":"        for i in range(0, 6):"},{"line_number":155,"context_line":"            chassis_name \u003d f\u0027chassis{i+1}\u0027"},{"line_number":156,"context_line":"            self._create_chassis("},{"line_number":157,"context_line":"                chassis_name, f\u0027192.168.1.10{i+1}\u0027,"},{"line_number":158,"context_line":"                bgp_bridges\u003dself.chassis_bgp_networks)"},{"line_number":159,"context_line":"        self.reconciler.full_sync()"}],"source_content_type":"text/x-python","patch_set":16,"id":"2d9fec0c_a2342ddc","line":156,"in_reply_to":"9f337fb5_b3d16d49","updated":"2026-01-26 18:33:20.000000000","message":"Every test should start with its own set of dedicated DBs. I don\u0027t think we need to check that but if you think it\u0027s needed then I can add it. But I don\u0027t think we do it anywhere. we just rely on the setup to provide isolated resources.","commit_id":"223a8b4741bd5efcb2769b3fe970ae2c6581a184"}]}
