)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"c32e52307d2898b193a450164ff6878c6743818d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"caf8d93d_b52a9ecc","updated":"2023-02-17 10:06:17.000000000","message":"After updating the test case to consume the core multi-gw support the current scheduling code fails because apparently its view of the transaction is before any of the ports are committed to the DB, will look into how to address this.\n\nExample instrumented output from `OVNGatewayLeastLoadedScheduler.select` method:\nHELLO gateway_name\u003dlrp-7c68b36a-eb80-431d-af8b-4fadb1377eef target_lr\u003dLogical_Router(copp\u003d[], enabled\u003d[True], external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:gw_network_id\u0027: \u0027\u0027, \u0027neutron:gw_port_id\u0027: \u0027\u0027, \u0027neutron:revision_number\u0027: \u00271\u0027, \u0027neutron:router_name\u0027: \u0027router-multi-gw1\u0027}, load_balancer\u003d[], load_balancer_group\u003d[], name\u003dneutron-f24f1740-c5df-42f3-bb60-84f99394c4fc, nat\u003d[], options\u003d{\u0027always_learn_from_arp_request\u0027: \u0027false\u0027, \u0027dynamic_neigh_routers\u0027: \u0027true\u0027}, policies\u003d[], ports\u003d[], static_routes\u003d[])\nHELLO gateway_name\u003dlrp-cfaf8543-ea4c-4d73-a3a2-8b17dbb76575 target_lr\u003dLogical_Router(copp\u003d[], enabled\u003d[True], external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:gw_network_id\u0027: \u0027\u0027, \u0027neutron:gw_port_id\u0027: \u0027\u0027, \u0027neutron:revision_number\u0027: \u00271\u0027, \u0027neutron:router_name\u0027: \u0027router-multi-gw1\u0027}, load_balancer\u003d[], load_balancer_group\u003d[], name\u003dneutron-f24f1740-c5df-42f3-bb60-84f99394c4fc, nat\u003d[], options\u003d{\u0027always_learn_from_arp_request\u0027: \u0027false\u0027, \u0027dynamic_neigh_routers\u0027: \u0027true\u0027}, policies\u003d[], ports\u003d[], static_routes\u003d[])\nHELLO gateway_name\u003dlrp-f4da2ed1-7d8c-47a5-9721-53bfb405915e target_lr\u003dLogical_Router(copp\u003d[], enabled\u003d[True], external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:gw_network_id\u0027: \u0027\u0027, \u0027neutron:gw_port_id\u0027: \u0027\u0027, \u0027neutron:revision_number\u0027: \u00271\u0027, \u0027neutron:router_name\u0027: \u0027router-multi-gw1\u0027}, load_balancer\u003d[], load_balancer_group\u003d[], name\u003dneutron-f24f1740-c5df-42f3-bb60-84f99394c4fc, nat\u003d[], options\u003d{\u0027always_learn_from_arp_request\u0027: \u0027false\u0027, \u0027dynamic_neigh_routers\u0027: \u0027true\u0027}, policies\u003d[], ports\u003d[], static_routes\u003d[])\nHELLO gateway_name\u003dlrp-313e7a0f-339c-4491-a244-dd3fd35b2b14 target_lr\u003dLogical_Router(copp\u003d[], enabled\u003d[True], external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:gw_network_id\u0027: \u0027\u0027, \u0027neutron:gw_port_id\u0027: \u0027\u0027, \u0027neutron:revision_number\u0027: \u00271\u0027, \u0027neutron:router_name\u0027: \u0027router-multi-gw2\u0027}, load_balancer\u003d[], load_balancer_group\u003d[], name\u003dneutron-cd4e33a4-3bc7-4876-a588-7cab6693f902, nat\u003d[], options\u003d{\u0027always_learn_from_arp_request\u0027: \u0027false\u0027, \u0027dynamic_neigh_routers\u0027: \u0027true\u0027}, policies\u003d[], ports\u003d[], static_routes\u003d[])\nHELLO gateway_name\u003dlrp-9ab92f12-ef32-45ab-a2fc-aaef87544a1a target_lr\u003dLogical_Router(copp\u003d[], enabled\u003d[True], external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:gw_network_id\u0027: \u0027\u0027, \u0027neutron:gw_port_id\u0027: \u0027\u0027, \u0027neutron:revision_number\u0027: \u00271\u0027, \u0027neutron:router_name\u0027: \u0027router-multi-gw2\u0027}, load_balancer\u003d[], load_balancer_group\u003d[], name\u003dneutron-cd4e33a4-3bc7-4876-a588-7cab6693f902, nat\u003d[], options\u003d{\u0027always_learn_from_arp_request\u0027: \u0027false\u0027, \u0027dynamic_neigh_routers\u0027: \u0027true\u0027}, policies\u003d[], ports\u003d[], static_routes\u003d[])\nHELLO gateway_name\u003dlrp-c19d52c7-0bc3-4156-a9d8-c9b7083209dc target_lr\u003dLogical_Router(copp\u003d[], enabled\u003d[True], external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:gw_network_id\u0027: \u0027\u0027, \u0027neutron:gw_port_id\u0027: \u0027\u0027, \u0027neutron:revision_number\u0027: \u00271\u0027, \u0027neutron:router_name\u0027: \u0027router-multi-gw2\u0027}, load_balancer\u003d[], load_balancer_group\u003d[], name\u003dneutron-cd4e33a4-3bc7-4876-a588-7cab6693f902, nat\u003d[], options\u003d{\u0027always_learn_from_arp_request\u0027: \u0027false\u0027, \u0027dynamic_neigh_routers\u0027: \u0027true\u0027}, policies\u003d[], ports\u003d[], static_routes\u003d[])\n","commit_id":"83687b3e297f9c5eb3b88a526e7816feb405f905"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"c6359e37c8e69a7cacb5416c33867cdc518d118f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d46f6dc8_4680465e","updated":"2023-02-17 15:32:48.000000000","message":"Looking further into this, the IDL does contain the actual LRP rows, but they are not linked on the LR while in-transaction.\n\nI know that the UUIDs of new rows are not finalized until commit, so the delayed linkage could be an artifact of that.\n\nI\u0027ll do a quick comparison with what this would look like in the C IDL to check whether this is just the way it is or if something is awry with the Python IDL.","commit_id":"83687b3e297f9c5eb3b88a526e7816feb405f905"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"8fffeec33c44ddb48f2e0603c8d155803bf2c02f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c04bbb08_ce11762d","in_reply_to":"922eefa6_a3945bac","updated":"2023-02-20 09:30:06.000000000","message":"After playing more with approaches to this, I believe this would actually be a general issue with the way scheduling is currently done. Let\u0027s say an event triggers (re-)scheduling of many already existing ports. All of the port updates would be made on the basis of stale data, and as such the least loaded algorithm would not get to do its job.\n\nI see current committed code attempts to deal with this by creating the port in separate transactions [0], however having tried that, it does not actually work, at least not when updating a router from `ovn_client.py`.\n\nWhat does appear to work is to pass the scheduler `select` function as a callback parameter to the `AddLRouterPortCommand`. Its `run_idl` method can then call the scheduler function, passing in a real live IDL object which is kept up to date during the course of applying the transaction.\n\nI\u0027ll propose a separate patch to fix this and then rebase this series on top of that.\n\n0: https://github.com/openstack/neutron/blob/7471b8590c6455dec61cc050a4201ca669d30d2c/neutron/services/ovn_l3/plugin.py#L455-L459","commit_id":"83687b3e297f9c5eb3b88a526e7816feb405f905"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"b60811a3c9b738b4597360ede9d108a5b19c4c1f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8aa8a47e_b36f931e","in_reply_to":"c04bbb08_ce11762d","updated":"2023-02-22 10:56:18.000000000","message":"This problem has been addressed in https://review.opendev.org/c/openstack/neutron/+/874760","commit_id":"83687b3e297f9c5eb3b88a526e7816feb405f905"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"cbc419cb259b1bbf284a666e252b37e122a1bea9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"debcd080_ea25aaaf","in_reply_to":"d46f6dc8_4680465e","updated":"2023-02-17 16:26:45.000000000","message":"The C IDL does appear to behave the same way.\n\nOK so we need some other way of identifying this across multiple calls to the OVNGatewayLeastLoadedScheduler.select method within the same transaction.\n\nSince the uncommitted LRPs is visible to the IDL as regular rows, apart for the linkage on the LR, I guess one alternative could be to count the number of LRPs with external_ids:neutron:router_name matching the router we are currently scheduling a port for.","commit_id":"83687b3e297f9c5eb3b88a526e7816feb405f905"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"410b839e6decb80bb5d3e95331d65371f17bdfff","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"922eefa6_a3945bac","in_reply_to":"debcd080_ea25aaaf","updated":"2023-02-17 20:26:22.000000000","message":"Oh, ovsdbapp puts a wrapper around the OVS IDL without retaining the behavior stated in the last paragraph in the comment above.\n\nOK, so we either need to fix that or some other way to approach this.","commit_id":"83687b3e297f9c5eb3b88a526e7816feb405f905"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"1d03c85d551e854edc142415852567406b261d24","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"d93b9afe_0ba345e0","updated":"2023-04-30 14:13:00.000000000","message":"recheck vexxhost nested virt hosts disabled","commit_id":"c9e9479d05d940255e6ffa07b60f647d4803d8e5"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"7b0faaf906ccf977dc07aa7835c95c7c668c40ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"c8611d33_e3c1cf53","updated":"2023-05-19 14:14:54.000000000","message":"recheck","commit_id":"881046d0288f22f990766a5a06927d67ab864d65"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"4e5b531e96dd4a2ef9601c12a4374f1597abebee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"a9ca4ed0_a5c9b4fa","updated":"2023-06-23 13:56:19.000000000","message":"recheck no bug job timed out","commit_id":"2ca4673058b5fb011a3119bce7156a3a56fd0489"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"fc084a6aaa4bf57e7653954a5de927c31ad376a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"1a6e8613_08a4f704","updated":"2023-06-23 10:10:25.000000000","message":"recheck no bug timed out","commit_id":"2ca4673058b5fb011a3119bce7156a3a56fd0489"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"a5c126b0b1a1bdb39dfd30fdd4b1899789fed25e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"83acc0e1_2edf0ed5","updated":"2023-06-27 14:52:40.000000000","message":"recheck bug 2020643","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"353be9a2896a91a1a7c870c2ab0d7b6981458902","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"23447dd9_dab208bc","updated":"2023-06-27 06:04:01.000000000","message":"recheck no bug failure in tox-cover job looks like a fluke?","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"d73cd83eb8deb4d21227e8d155cb49a364ba7bd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"d40da052_7a0ae247","updated":"2023-07-03 22:48:50.000000000","message":"recheck","commit_id":"be0e19f483b71a0ee10a5c968197f973f2aad992"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"cf83bdb4e3f4a5fc5533859ed82441bdfc152d87","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"a21cd874_d1078d9f","updated":"2023-07-03 17:08:03.000000000","message":"recheck no bug","commit_id":"be0e19f483b71a0ee10a5c968197f973f2aad992"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"626b53b4d2f8d409ad5211f595053dd8a7fb7ce4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"8fee4377_841db7e3","updated":"2023-07-12 13:49:04.000000000","message":"I think this is as good as it can be right now. The behavior difference between newly inserted and committed `Row` objects worries me a bit--anything that tries to access an attribute of a new `Row` that we don\u0027t explicitly set ourselves will raise an AttributeError. So we need to be very sure that any `Row` we access that may possibly be uncommitted, does not do this (this would be especially problematic if there are fields similar to `Logical_Switch_Port.up` which are set outside of neutron, but whose value we read and would no longer have default values).","commit_id":"9be9009683fa926588efdb12b7c0090cfa07e68b"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"f7ff7001fb6c7a45eafaabade5790132604a65c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":45,"id":"0248aec3_b718a35d","updated":"2023-08-23 06:27:26.000000000","message":"recheck","commit_id":"700efe63968a8957cb47dbe2514e8ffcebbe017b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"11908417e4eba1407425a50d3404786bcbfb6ae2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":52,"id":"f189afbc_9c46cc7f","updated":"2024-01-09 17:33:19.000000000","message":"Just trying to get back to reviewing this series.","commit_id":"a991ea9dab1c0bc91e1e46e17ed8e2b82eff4fda"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fddcb4b4a3abcf686e340a4744ca78fe570cca56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":61,"id":"2b68961c_99c8f603","updated":"2024-02-27 15:58:00.000000000","message":"NOTE: please explain the anti affinity filter in https://github.com/openstack/neutron/blob/491fbc890bd6a22e77570982dea9c37786ea412f/doc/source/admin/ovn/l3_scheduler.rst","commit_id":"8df5ee61d980e955a46381ff9745b0585d846ef5"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"d0f8c57d9163f1aee0378668ecaa116a3938f5b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":61,"id":"0decefb7_ea0984b3","updated":"2024-02-27 19:02:53.000000000","message":"Thanks a lot for reviews, much appreciated!","commit_id":"8df5ee61d980e955a46381ff9745b0585d846ef5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"174c6be3606e2d82c3a205629afc4bdd8b6a31ca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":61,"id":"f2aefa32_af1385ca","updated":"2024-02-28 01:29:35.000000000","message":"recheck dependent patch failure","commit_id":"8df5ee61d980e955a46381ff9745b0585d846ef5"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"6ba2f15d9a0eae29b0c2fffa1e9c43b898d58376","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":61,"id":"9a098c6c_b983c64d","in_reply_to":"12afc5e5_d931dffb","updated":"2024-02-27 19:39:37.000000000","message":"Done: https://review.opendev.org/c/openstack/neutron/+/910435","commit_id":"8df5ee61d980e955a46381ff9745b0585d846ef5"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"d0f8c57d9163f1aee0378668ecaa116a3938f5b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":61,"id":"12afc5e5_d931dffb","in_reply_to":"2b68961c_99c8f603","updated":"2024-02-27 19:02:53.000000000","message":"Ack","commit_id":"8df5ee61d980e955a46381ff9745b0585d846ef5"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/api.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"11908417e4eba1407425a50d3404786bcbfb6ae2","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @abc.abstractmethod"},{"line_number":172,"context_line":"    def schedule_new_gateway(self, g_name, lrouter_name, physnet, az_hints,"},{"line_number":173,"context_line":"                             plugin):"},{"line_number":174,"context_line":"        \"\"\"Schedule new gateway"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        :param g_name:       The unique name of the lrouter port"}],"source_content_type":"text/x-python","patch_set":52,"id":"4bf475cf_9b084412","line":173,"range":{"start_line":173,"start_character":29,"end_line":173,"end_character":35},"updated":"2024-01-09 17:33:19.000000000","message":"nit: should plugin should be third position to match what is done in previous definition?","commit_id":"a991ea9dab1c0bc91e1e46e17ed8e2b82eff4fda"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"8d8718b19fcd4c81ae9b88cbe2a1433fd2b8d185","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @abc.abstractmethod"},{"line_number":172,"context_line":"    def schedule_new_gateway(self, g_name, lrouter_name, physnet, az_hints,"},{"line_number":173,"context_line":"                             plugin):"},{"line_number":174,"context_line":"        \"\"\"Schedule new gateway"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        :param g_name:       The unique name of the lrouter port"}],"source_content_type":"text/x-python","patch_set":52,"id":"a47655f8_cdd6ff17","line":173,"range":{"start_line":173,"start_character":29,"end_line":173,"end_character":35},"in_reply_to":"4bf475cf_9b084412","updated":"2024-01-31 19:23:00.000000000","message":"Done","commit_id":"a991ea9dab1c0bc91e1e46e17ed8e2b82eff4fda"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5f58ce1510e17e2cbac6a5fb81b657c7f27ea0f1","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        \"\"\"Schedule new gateway"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        :param sb_api:                IDL for the OVN SB API"},{"line_number":181,"context_line":"        :type class:                  :class:`OvsdbSbOvnIdl`"},{"line_number":182,"context_line":"        :param g_name:       The unique name of the lrouter port"},{"line_number":183,"context_line":"        :type g_name:        string"},{"line_number":184,"context_line":"        :param lrouter_name: The unique name of the lrouter"}],"source_content_type":"text/x-python","patch_set":56,"id":"e7e360fc_83fba086","line":181,"updated":"2024-02-07 22:55:23.000000000","message":"nit on indentation, and same question as other review about argument order","commit_id":"dd2b73b8fee9bc18d57de1b7f11b7b92f7feeddc"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"9f5fa86400fa86cb346b153289504cc39c3b0567","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        \"\"\"Schedule new gateway"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        :param sb_api:                IDL for the OVN SB API"},{"line_number":181,"context_line":"        :type class:                  :class:`OvsdbSbOvnIdl`"},{"line_number":182,"context_line":"        :param g_name:       The unique name of the lrouter port"},{"line_number":183,"context_line":"        :type g_name:        string"},{"line_number":184,"context_line":"        :param lrouter_name: The unique name of the lrouter"}],"source_content_type":"text/x-python","patch_set":56,"id":"334149c2_ba5d7ee0","line":181,"in_reply_to":"e7e360fc_83fba086","updated":"2024-02-16 16:45:22.000000000","message":"Done","commit_id":"dd2b73b8fee9bc18d57de1b7f11b7b92f7feeddc"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"389cfb49822493d8262d947d3b8b8a037d94820f","unresolved":true,"context_lines":[{"line_number":180,"context_line":"        :param g_name:       The unique name of the lrouter port"},{"line_number":181,"context_line":"        :type g_name:        string"},{"line_number":182,"context_line":"        :param sb_api:                IDL for the OVN SB API"},{"line_number":183,"context_line":"        :type class:                  :class:`OvsdbSbOvnIdl`"},{"line_number":184,"context_line":"        :param lrouter_name: The unique name of the lrouter"},{"line_number":185,"context_line":"        :type lrouter_name:  string"},{"line_number":186,"context_line":"        :param plugin:       The L3 plugin to call back to for lookups"}],"source_content_type":"text/x-python","patch_set":58,"id":"8bd6fbd4_5df46ed0","line":183,"updated":"2024-02-16 20:21:51.000000000","message":"I\u0027m just going to fix the bad indent here, no functional change.","commit_id":"cab0622a56375105a19eaa5611196c925e696333"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8d7cdfa4eaf0c30666b31e668c091947d5512282","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        :param g_name:       The unique name of the lrouter port"},{"line_number":181,"context_line":"        :type g_name:        string"},{"line_number":182,"context_line":"        :param sb_api:                IDL for the OVN SB API"},{"line_number":183,"context_line":"        :type class:                  :class:`OvsdbSbOvnIdl`"},{"line_number":184,"context_line":"        :param lrouter_name: The unique name of the lrouter"},{"line_number":185,"context_line":"        :type lrouter_name:  string"},{"line_number":186,"context_line":"        :param plugin:       The L3 plugin to call back to for lookups"}],"source_content_type":"text/x-python","patch_set":58,"id":"bc034b8a_0283838d","line":183,"in_reply_to":"8bd6fbd4_5df46ed0","updated":"2024-02-16 20:23:43.000000000","message":"Done","commit_id":"cab0622a56375105a19eaa5611196c925e696333"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0513aba5b82963e8bbfa4a23419a467dee817560","unresolved":true,"context_lines":[{"line_number":419,"context_line":"        self.scheduler \u003d plugin.scheduler"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def run_idl(self, txn):"},{"line_number":422,"context_line":"        lrouter \u003d self.api.lookup(\"Logical_Router\", self.lrouter_name)"},{"line_number":423,"context_line":"        lrouter_port \u003d self.api.lookup(\"Logical_Router_Port\", self.g_name)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        candidates \u003d self.ovn_client.get_candidates_for_scheduling("},{"line_number":426,"context_line":"            self.physnet, availability_zone_hints\u003dself.az_hints)"},{"line_number":427,"context_line":"        chassis \u003d self.scheduler.select("}],"source_content_type":"text/x-python","patch_set":39,"id":"026481bd_d37af898","line":424,"range":{"start_line":422,"start_character":0,"end_line":424,"end_character":0},"updated":"2023-06-30 16:11:59.000000000","message":"Do we need any handling for if the router/port don\u0027t exist like an if_exists option, or is raising RowNotFound and canceling the multi-command transaction acceptable? (I\u0027m not that familiar with this code, so I really don\u0027t know.)","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"d6e8e14bc4adf4c7dced6993b9d3bff83ed65b7d","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        self.scheduler \u003d plugin.scheduler"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def run_idl(self, txn):"},{"line_number":422,"context_line":"        lrouter \u003d self.api.lookup(\"Logical_Router\", self.lrouter_name)"},{"line_number":423,"context_line":"        lrouter_port \u003d self.api.lookup(\"Logical_Router_Port\", self.g_name)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        candidates \u003d self.ovn_client.get_candidates_for_scheduling("},{"line_number":426,"context_line":"            self.physnet, availability_zone_hints\u003dself.az_hints)"},{"line_number":427,"context_line":"        chassis \u003d self.scheduler.select("}],"source_content_type":"text/x-python","patch_set":39,"id":"63049d59_91d8b6ff","line":424,"range":{"start_line":422,"start_character":0,"end_line":424,"end_character":0},"in_reply_to":"026481bd_d37af898","updated":"2023-07-03 14:42:24.000000000","message":"In its current use, this command is appended to the transaction straight after the command creating the LRP. That command will raise if the router does not exist.\n\nSomething would be very wrong if LR/LRP does not exist once we get here, so I think it would be safe to raise in that situation ref:\nhttps://review.opendev.org/c/openstack/neutron/+/873699/39/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py#1561","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0513aba5b82963e8bbfa4a23419a467dee817560","unresolved":true,"context_lines":[{"line_number":492,"context_line":"        # getting gateway_chassis"},{"line_number":493,"context_line":"        chassis \u003d []"},{"line_number":494,"context_line":"        if self._tables.get(\u0027Gateway_Chassis\u0027):"},{"line_number":495,"context_line":"            if getattr(lrp, \u0027gateway_chassis\u0027, None):"},{"line_number":496,"context_line":"                for gwc in lrp.gateway_chassis:"},{"line_number":497,"context_line":"                    chassis.append((gwc.chassis_name, gwc.priority))"},{"line_number":498,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":39,"id":"62b3f26f_d9cc1344","line":495,"updated":"2023-06-30 16:11:59.000000000","message":"nit: Is it possible for the Gateway_Chassis table to exist but there not be a gateway_chassis column on the LRP? It looks like both were added in the same commit, and gateway_chassis is a set type, so will be [] by default.","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"d6e8e14bc4adf4c7dced6993b9d3bff83ed65b7d","unresolved":true,"context_lines":[{"line_number":492,"context_line":"        # getting gateway_chassis"},{"line_number":493,"context_line":"        chassis \u003d []"},{"line_number":494,"context_line":"        if self._tables.get(\u0027Gateway_Chassis\u0027):"},{"line_number":495,"context_line":"            if getattr(lrp, \u0027gateway_chassis\u0027, None):"},{"line_number":496,"context_line":"                for gwc in lrp.gateway_chassis:"},{"line_number":497,"context_line":"                    chassis.append((gwc.chassis_name, gwc.priority))"},{"line_number":498,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":39,"id":"fef234b1_6d62e86c","line":495,"in_reply_to":"62b3f26f_d9cc1344","updated":"2023-07-03 14:42:24.000000000","message":"Without this check I get a Traceback when executing the functional test:\n```\nneutron.tests.functional.services.ovn_l3.test_plugin.TestRouter.test_gateway_chassis_least_loaded_scheduler_anti_affinity\n-------------------------------------------------------------------------------------------------------------------------\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    Traceback (most recent call last):\n\n      File \"/home/ubuntu/src/neutron/neutron/tests/base.py\", line 178, in func\n    return f(self, *args, **kwargs)\n\n      File \"/home/ubuntu/src/neutron/neutron/tests/functional/services/ovn_l3/test_plugin.py\", line 308, in test_gateway_chassis_least_loaded_scheduler_anti_affinity\n    router \u003d self._create_router(\u0027router%d\u0027 % i, gw_info\u003dgw_info)\n\n      File \"/home/ubuntu/src/neutron/neutron/tests/functional/services/ovn_l3/test_plugin.py\", line 56, in _create_router\n    return self.l3_plugin.create_router(self.context, router)\n\n      File \"/home/ubuntu/src/neutron/neutron/services/ovn_l3/plugin.py\", line 188, in create_router\n    with excutils.save_and_reraise_exception():\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/oslo_utils/excutils.py\", line 227, in __exit__\n    self.force_reraise()\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/oslo_utils/excutils.py\", line 200, in force_reraise\n    raise self.value\n\n      File \"/home/ubuntu/src/neutron/neutron/services/ovn_l3/plugin.py\", line 186, in create_router\n    self._ovn_client.create_router(context, router)\n\n      File \"/home/ubuntu/src/neutron/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py\", line 1280, in create_router\n    with self._nb_idl.transaction(check_error\u003dTrue) as txn:\n\n      File \"/usr/lib/python3.10/contextlib.py\", line 142, in __exit__\n    next(self.gen)\n\n      File \"/home/ubuntu/src/neutron/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py\", line 268, in transaction\n    with super(OvsdbNbOvnIdl, self).transaction(*args, **kwargs) as t:\n\n      File \"/usr/lib/python3.10/contextlib.py\", line 142, in __exit__\n    next(self.gen)\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/ovsdbapp/api.py\", line 114, in transaction\n    with self.create_transaction(\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/ovsdbapp/api.py\", line 71, in __exit__\n    self.result \u003d self.commit()\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/ovsdbapp/backend/ovs_idl/transaction.py\", line 64, in commit\n    raise result.ex\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/ovsdbapp/backend/ovs_idl/connection.py\", line 118, in run\n    txn.results.put(txn.do_commit())\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/ovsdbapp/backend/ovs_idl/transaction.py\", line 92, in do_commit\n    command.run_idl(txn)\n\n      File \"/home/ubuntu/src/neutron/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py\", line 427, in run_idl\n    chassis \u003d self.scheduler.select(\n\n      File \"/home/ubuntu/src/neutron/neutron/scheduler/l3_ovn_scheduler.py\", line 118, in select\n    return self._schedule_gateway(nb_idl, gateway_name,\n\n      File \"/home/ubuntu/src/neutron/neutron/scheduler/l3_ovn_scheduler.py\", line 80, in _schedule_gateway\n    chassis \u003d self._select_gateway_chassis(\n\n      File \"/home/ubuntu/src/neutron/neutron/scheduler/l3_ovn_scheduler.py\", line 159, in _select_gateway_chassis\n    chassis_bindings \u003d nb_idl.get_all_chassis_gateway_bindings(candidates)\n\n      File \"/home/ubuntu/src/neutron/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py\", line 512, in get_all_chassis_gateway_bindings\n    chassis \u003d self._get_logical_router_port_gateway_chassis(lrp)\n\n      File \"/home/ubuntu/src/neutron/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py\", line 495, in _get_logical_router_port_gateway_chassis\n    for gwc in lrp.gateway_chassis:\n\n      File \"/home/ubuntu/src/neutron/.tox/functional/lib/python3.10/site-packages/ovs/db/idl.py\", line 1330, in __getattr__\n    raise AttributeError(\"%s instance has no attribute \u0027%s\u0027\" %\n\n    AttributeError: Row instance has no attribute \u0027gateway_chassis\u0027\n```\n\nWill update the call to `getattr` to provide an appropriate default value, although it is not currently used by the calling code.","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ce6a8e408563235df00998ed58b4d25834319236","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        # getting gateway_chassis"},{"line_number":493,"context_line":"        chassis \u003d []"},{"line_number":494,"context_line":"        if self._tables.get(\u0027Gateway_Chassis\u0027):"},{"line_number":495,"context_line":"            if getattr(lrp, \u0027gateway_chassis\u0027, None):"},{"line_number":496,"context_line":"                for gwc in lrp.gateway_chassis:"},{"line_number":497,"context_line":"                    chassis.append((gwc.chassis_name, gwc.priority))"},{"line_number":498,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":39,"id":"424a1a58_8a5b3101","line":495,"in_reply_to":"fef234b1_6d62e86c","updated":"2023-07-12 13:27:19.000000000","message":"Ok, so it seems like what is happening is that a newly inserted, but not yet committed `Row` does not have attributes that have not yet been set. I\u0027m not a huge fan of `Row` having different properties depending on how they show up, especially since that would expose backend-specific behavior.\n\nIt feels kind of like a bug in python-ovs, but maybe it is by design (for instance, `Row` objects created for the `old` row in `UPDATE` events only have fields set that have been changed, making it easy to see if an update changed something you care about).\n\nIn any case, it\u0027s probably something we can fix down the line by not accessing `tables` directly and `using db_list_rows()` and then having the `__getattr__` on a `RowView` fill in default values for columns that aren\u0027t set (after making `RowView` an official part of the API).","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fddcb4b4a3abcf686e340a4744ca78fe570cca56","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self._qos_driver \u003d qos_extension.OVNClientQosExtension(driver\u003dself)"},{"line_number":107,"context_line":"        self.placement_extension \u003d ("},{"line_number":108,"context_line":"            placement_extension.OVNClientPlacementExtension(self))"},{"line_number":109,"context_line":"        self._ovn_scheduler \u003d l3_ovn_scheduler.get_scheduler()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @property"},{"line_number":112,"context_line":"    def _plugin(self):"},{"line_number":113,"context_line":"        if self._plugin_property is None:"}],"source_content_type":"text/x-python","patch_set":61,"id":"84b698b5_27f8d9ba","side":"PARENT","line":110,"range":{"start_line":109,"start_character":7,"end_line":110,"end_character":1},"updated":"2024-02-27 15:58:00.000000000","message":"Nice to see this removed from here. That should be only in the L3 plugin.","commit_id":"898498ca3ba268122dd5de43f2a0dbf2eb3c4058"}],"neutron/scheduler/l3_ovn_scheduler.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0513aba5b82963e8bbfa4a23419a467dee817560","unresolved":true,"context_lines":[{"line_number":131,"context_line":"        :rtype:          Optional[int]"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        if self.target_lrouter:"},{"line_number":134,"context_line":"            # We may be exposed to a real OVS IDL object where all attributes"},{"line_number":135,"context_line":"            # are not populated yet."},{"line_number":136,"context_line":"            lrouter_ports \u003d getattr(self.target_lrouter, \u0027ports\u0027, set())"},{"line_number":137,"context_line":"            if len(lrouter_ports) and self.nb_idl.get_lrouter_by_lrouter_port("},{"line_number":138,"context_line":"                    lrp_name) \u003d\u003d self.target_lrouter:"}],"source_content_type":"text/x-python","patch_set":39,"id":"eb1b123b_d4954602","line":135,"range":{"start_line":134,"start_character":0,"end_line":135,"end_character":36},"updated":"2023-06-30 16:11:59.000000000","message":"If you have a Row or RowView object, they *should* always have default values that are valid for their schema definition. I.e. sets will be [], dicts {}, numbers will be 0, etc. The only wrinkle I\u0027m aware of is that on optional types, where say you have a number type with min\u003d0, max\u003d1 (0 or 1 values, not a range restriction), the default would be []. The only other exception I can think of is when processing UPDATE events the \"old\" row will only have columns for the values that were changed.\n\nIf this isn\u0027t the case here, something else might be going on, like target_lrouter\u003dNone (which is being checked).","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"626b53b4d2f8d409ad5211f595053dd8a7fb7ce4","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :rtype:          Optional[int]"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        if self.target_lrouter:"},{"line_number":134,"context_line":"            # We may be exposed to a real OVS IDL object where all attributes"},{"line_number":135,"context_line":"            # are not populated yet."},{"line_number":136,"context_line":"            lrouter_ports \u003d getattr(self.target_lrouter, \u0027ports\u0027, set())"},{"line_number":137,"context_line":"            if len(lrouter_ports) and self.nb_idl.get_lrouter_by_lrouter_port("},{"line_number":138,"context_line":"                    lrp_name) \u003d\u003d self.target_lrouter:"}],"source_content_type":"text/x-python","patch_set":39,"id":"80ac8b01_d556e345","line":135,"range":{"start_line":134,"start_character":0,"end_line":135,"end_character":36},"in_reply_to":"7889efc9_71d67227","updated":"2023-07-12 13:49:04.000000000","message":"As above, it\u0027s an issue with the behavior of newly inserted, but not committed `Row` objects in python-ovs. We can probably find a way in the future to hide the difference. Though I wonder in general how with a backend like, say, an ovn-sbctl daemon mode backend, we\u0027d replicate the \"looking up uncommitted rows\" type behavior. We can reference them pretty easily in the transaction itself with the `--id\u003d@name` style CLI options, but having the `Row` show up in code *outside* of the `Command` objects seems like it would be tricky.","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"d6e8e14bc4adf4c7dced6993b9d3bff83ed65b7d","unresolved":true,"context_lines":[{"line_number":131,"context_line":"        :rtype:          Optional[int]"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        if self.target_lrouter:"},{"line_number":134,"context_line":"            # We may be exposed to a real OVS IDL object where all attributes"},{"line_number":135,"context_line":"            # are not populated yet."},{"line_number":136,"context_line":"            lrouter_ports \u003d getattr(self.target_lrouter, \u0027ports\u0027, set())"},{"line_number":137,"context_line":"            if len(lrouter_ports) and self.nb_idl.get_lrouter_by_lrouter_port("},{"line_number":138,"context_line":"                    lrp_name) \u003d\u003d self.target_lrouter:"}],"source_content_type":"text/x-python","patch_set":39,"id":"7889efc9_71d67227","line":135,"range":{"start_line":134,"start_character":0,"end_line":135,"end_character":36},"in_reply_to":"eb1b123b_d4954602","updated":"2023-07-03 14:42:24.000000000","message":"Similar to above, I have run into Tracebacks without this check, so I\u0027d prefer if we could keep it.\n\nI\u0027d be happy to drop the comment though.","commit_id":"da1577f4fd0376e3c71e94ce0812803342f289f8"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"11908417e4eba1407425a50d3404786bcbfb6ae2","unresolved":true,"context_lines":[{"line_number":134,"context_line":"            lrouter_ports \u003d getattr(self.target_lrouter, \u0027ports\u0027, set())"},{"line_number":135,"context_line":"            if len(lrouter_ports) and self.nb_idl.get_lrouter_by_lrouter_port("},{"line_number":136,"context_line":"                    lrp_name) \u003d\u003d self.target_lrouter:"},{"line_number":137,"context_line":"                return 10 * len(self.target_lrouter.ports)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _get_chassis_load_by_prios(self, chassis_info):"},{"line_number":140,"context_line":"        \"\"\"Retrieve the amount of ports by priorities hosted in the chassis."}],"source_content_type":"text/x-python","patch_set":52,"id":"dbca3b23_3f9e69a8","line":137,"range":{"start_line":137,"start_character":23,"end_line":137,"end_character":25},"updated":"2024-01-09 17:33:19.000000000","message":"Where did 10 come from? Maybe should be using a constant?","commit_id":"a991ea9dab1c0bc91e1e46e17ed8e2b82eff4fda"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"017283f06b4eb45610f4c526560e181424875588","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            lrouter_ports \u003d getattr(self.target_lrouter, \u0027ports\u0027, set())"},{"line_number":135,"context_line":"            if len(lrouter_ports) and self.nb_idl.get_lrouter_by_lrouter_port("},{"line_number":136,"context_line":"                    lrp_name) \u003d\u003d self.target_lrouter:"},{"line_number":137,"context_line":"                return 10 * len(self.target_lrouter.ports)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _get_chassis_load_by_prios(self, chassis_info):"},{"line_number":140,"context_line":"        \"\"\"Retrieve the amount of ports by priorities hosted in the chassis."}],"source_content_type":"text/x-python","patch_set":52,"id":"9d9c7338_56a946fe","line":137,"range":{"start_line":137,"start_character":23,"end_line":137,"end_character":25},"in_reply_to":"dbca3b23_3f9e69a8","updated":"2024-01-31 19:16:41.000000000","message":"Done","commit_id":"a991ea9dab1c0bc91e1e46e17ed8e2b82eff4fda"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5f58ce1510e17e2cbac6a5fb81b657c7f27ea0f1","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        likely that the chassis is selected for scheduling."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :param lrp_name: Name of LRP."},{"line_number":172,"context_line":"        :type lrp_name:  str"},{"line_number":173,"context_line":"        :returns:        Number, if lrp_name belongs to LR with multiple"},{"line_number":174,"context_line":"                         LRPs."},{"line_number":175,"context_line":"        :rtype:          int"}],"source_content_type":"text/x-python","patch_set":56,"id":"85242d91_a2d4be5c","line":172,"updated":"2024-02-07 22:55:23.000000000","message":"nit: there are other args passed as well","commit_id":"dd2b73b8fee9bc18d57de1b7f11b7b92f7feeddc"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"9f5fa86400fa86cb346b153289504cc39c3b0567","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        likely that the chassis is selected for scheduling."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :param lrp_name: Name of LRP."},{"line_number":172,"context_line":"        :type lrp_name:  str"},{"line_number":173,"context_line":"        :returns:        Number, if lrp_name belongs to LR with multiple"},{"line_number":174,"context_line":"                         LRPs."},{"line_number":175,"context_line":"        :rtype:          int"}],"source_content_type":"text/x-python","patch_set":56,"id":"582da5cc_2b8d531a","line":172,"in_reply_to":"85242d91_a2d4be5c","updated":"2024-02-16 16:45:22.000000000","message":"Done","commit_id":"dd2b73b8fee9bc18d57de1b7f11b7b92f7feeddc"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5f58ce1510e17e2cbac6a5fb81b657c7f27ea0f1","unresolved":true,"context_lines":[{"line_number":178,"context_line":"            lrouter_ports \u003d getattr(target_lrouter, \u0027ports\u0027, set())"},{"line_number":179,"context_line":"            if len(lrouter_ports) and nb_idl.get_lrouter_by_lrouter_port("},{"line_number":180,"context_line":"                    lrp_name) \u003d\u003d target_lrouter:"},{"line_number":181,"context_line":"                return 2 * ovn_const.MAX_GW_CHASSIS * len(target_lrouter.ports)"},{"line_number":182,"context_line":"        return 0"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _select_gateway_chassis(self, nb_idl, sb_idl, candidates,"}],"source_content_type":"text/x-python","patch_set":56,"id":"b21ed447_9b2af8e5","line":181,"range":{"start_line":181,"start_character":23,"end_line":181,"end_character":24},"updated":"2024-02-07 22:55:23.000000000","message":"2 since there can be multiple gws?","commit_id":"dd2b73b8fee9bc18d57de1b7f11b7b92f7feeddc"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"9f5fa86400fa86cb346b153289504cc39c3b0567","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            lrouter_ports \u003d getattr(target_lrouter, \u0027ports\u0027, set())"},{"line_number":179,"context_line":"            if len(lrouter_ports) and nb_idl.get_lrouter_by_lrouter_port("},{"line_number":180,"context_line":"                    lrp_name) \u003d\u003d target_lrouter:"},{"line_number":181,"context_line":"                return 2 * ovn_const.MAX_GW_CHASSIS * len(target_lrouter.ports)"},{"line_number":182,"context_line":"        return 0"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _select_gateway_chassis(self, nb_idl, sb_idl, candidates,"}],"source_content_type":"text/x-python","patch_set":56,"id":"418a5e94_d1e06a96","line":181,"range":{"start_line":181,"start_character":23,"end_line":181,"end_character":24},"in_reply_to":"b21ed447_9b2af8e5","updated":"2024-02-16 16:45:22.000000000","message":"It\u0027s mostly just about getting a elevated number, and on the back of your comment to use a constant I kept the 2 to keep the same number. We could probably use `5` as well 😊\n\nI\u0027ll add a comment as well","commit_id":"dd2b73b8fee9bc18d57de1b7f11b7b92f7feeddc"}]}
