)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"c5b94e2a906b54e6cb90fbb4854577eca5bdb742","unresolved":true,"context_lines":[{"line_number":23,"context_line":"SYNC_MODE_REPAIR."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"[1]"},{"line_number":26,"context_line":"https://mail.openvswitch.org/pipermail/ovs-discuss/2022-December/052126.html"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #1998609"},{"line_number":29,"context_line":"Change-Id: I2ac871cc1fe2423c9481ef765ad1cf1e00354fc6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"a40a1d05_1cacdfca","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":76},"updated":"2026-02-19 08:05:20.000000000","message":"can this be formulated to some Neutron doc as well in a follow-up patch for example? Or the extension of faq document is enough perhaps?","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8f678ad61076d2ef1f4a112923a856dbbe4ec685","unresolved":true,"context_lines":[{"line_number":23,"context_line":"SYNC_MODE_REPAIR."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"[1]"},{"line_number":26,"context_line":"https://mail.openvswitch.org/pipermail/ovs-discuss/2022-December/052126.html"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #1998609"},{"line_number":29,"context_line":"Change-Id: I2ac871cc1fe2423c9481ef765ad1cf1e00354fc6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"0f093495_380b0f62","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":76},"in_reply_to":"a40a1d05_1cacdfca","updated":"2026-02-19 08:06:19.000000000","message":"After reading again with the doc/cfg help and re-no I think should be enough for all users","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5d5f0501959ffd589108c1ea16548205dd404b2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"59f817ac_03e17880","updated":"2022-12-13 14:57:19.000000000","message":"Hi Roberto, please check https://bugs.launchpad.net/neutron/+bug/1998609/comments/2","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8829c864_294f7fce","updated":"2022-12-13 18:27:31.000000000","message":"I know we also need to discuss this in neutron drivers meeting.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"507b45c2_6ae90afc","updated":"2022-12-13 21:15:16.000000000","message":"Thanks for the feedback Brian!","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"f26b2b248b473f9d9966fa184ce379c41da85819","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a9f6c973_bf7d0e8a","updated":"2023-01-06 11:38:32.000000000","message":"recheck","commit_id":"3417e0854ac143c4062e6b4ef1a4512a16306bb0"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"d119e84e28b01e57d91ffcf7885dd97535b8515e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"17d40366_16e4f344","updated":"2023-04-25 16:35:31.000000000","message":"recheck","commit_id":"0911ebcb684d5bcca83591e51248019f95472898"},{"author":{"_account_id":30463,"name":"Krzysztof Tomaszewski","display_name":"Krzysztof Tomaszewski","email":"ktomaszewski@cloudferro.com","username":"labedz"},"change_message_id":"2c041ad23b947f37eb99ca9c9c14eda85fef29b4","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"7e01a250_58f173e9","updated":"2023-05-16 14:37:43.000000000","message":"recheck - \u0027Task Run devstack failed running on host controller\u0027 because \u0027Unable to fetch some archives\u0027","commit_id":"0911ebcb684d5bcca83591e51248019f95472898"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"7954b19e9f72e25cc6f9709ff882b2575cc3486d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"da8729c4_a7161e59","in_reply_to":"7e01a250_58f173e9","updated":"2023-05-30 19:37:15.000000000","message":"Done","commit_id":"0911ebcb684d5bcca83591e51248019f95472898"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"50252136222f1a817e9fed23b6e52aebd832fd28","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"ea931705_49fe209c","updated":"2023-05-23 08:34:22.000000000","message":"it seems that functional tests failure may be related to this patch so please check it before rechecking","commit_id":"6729829acc3bd7cd2af6eb3ba5f4424fe2e5fb73"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fac9d5e9bc6b53d950aa3f9448754e876c39fa3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"c8e72ecc_d863d996","updated":"2023-07-04 16:36:12.000000000","message":"Hello, any feedback on the latest review?","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"be3ced6c017f46237d7cb43e91fa18c2ef54eb32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"21782752_0d49f6f1","updated":"2023-05-31 12:00:09.000000000","message":"recheck","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"a1b45bf982912d602008e36e8dbd8f5c84147dd7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"86f8fbc7_3cc349c8","updated":"2023-06-05 10:51:52.000000000","message":"recheck, it seems that functional tests failure may not be related to this patch. I ran the functional tests locally comparing the pre and post patch version, and the general tests that fail are the same (the tests of this patch are ok). There seems to be an issue with the coverage count.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"61c9ea3cb4dad8839af555e213de76c1dc73c7e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"bc82cfd0_73edb9aa","in_reply_to":"c8e72ecc_d863d996","updated":"2023-07-04 17:10:03.000000000","message":"I\u0027ll check it out, thanks for the review 😊.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"7213eb135dd3d2249603a2682719e54c2f58a683","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"4f3c21f2_6083cc8d","updated":"2023-07-07 10:50:16.000000000","message":"recheck","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d417c5d6dc96a2026a256896616d6d42fc7c1fa9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"38be9baa_63aa038e","in_reply_to":"4f3c21f2_6083cc8d","updated":"2023-07-12 08:15:44.000000000","message":"Please don\u0027t do bare re-checks. Investigate what the issue was and provide this feedback before re-checking the patch.","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c71e36253bdee169541aaff4197e02d38cb041ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"6795ed2c_423dee27","updated":"2023-09-08 10:01:38.000000000","message":"Can you rebase this patch?","commit_id":"5eb255a3eda454db8549538cdecc74763d2f0418"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"26c56ecdc60bf2e90f209c08ac5c93b140e3865b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"0cd903e8_819626b3","updated":"2023-07-19 12:02:34.000000000","message":"recheck","commit_id":"5eb255a3eda454db8549538cdecc74763d2f0418"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"e65746c2ef0fab0bd18cb2d910595ab23419b965","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"f4d2e213_3f949a0b","updated":"2023-07-18 11:05:12.000000000","message":"recheck - not related error \"tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps.test_in_tenant_traffic [229.660040s] ... FAILED\"","commit_id":"5eb255a3eda454db8549538cdecc74763d2f0418"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"738cd1032216638875ce5003e1f1b5ac2c8ac6a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"cea4b567_0089eab0","updated":"2023-07-19 12:54:15.000000000","message":"recheck neutron-functional-with-uwsgi","commit_id":"5eb255a3eda454db8549538cdecc74763d2f0418"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"b30116c82cec72677a958572fc872bb9b07d7345","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"d266411a_32831fa7","updated":"2023-07-14 01:12:37.000000000","message":"recheck, it seems that neutron-functional-with-uwsgi test TIMED_OUT failure may not be related to this patch. I believe that with the the new UTs for the mech_driver the coverage issue should have been solved.","commit_id":"5eb255a3eda454db8549538cdecc74763d2f0418"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"95cc6c8f78f9750291ea6f7e7509e372dd4168dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"88037bc5_afbd7e26","in_reply_to":"6795ed2c_423dee27","updated":"2023-09-08 11:11:03.000000000","message":"Done! thanks.","commit_id":"5eb255a3eda454db8549538cdecc74763d2f0418"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ff1e55253dedba72288cef0a82c79300506b1a10","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":33,"id":"d3c27d23_d07f2ec5","updated":"2024-05-28 21:08:30.000000000","message":"recheck","commit_id":"51255b050d43ba6198b44e9dae28faa540aa90dc"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"35014a8ff0c6cc428b5858992b4aa167fcdf8f2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":33,"id":"4c77cae7_afd88504","updated":"2024-06-06 17:04:37.000000000","message":"recheck - unrelated errors.","commit_id":"51255b050d43ba6198b44e9dae28faa540aa90dc"},{"author":{"_account_id":35536,"name":"Jakub Neumann","display_name":"Jakub Neumann (Cloudferro)","email":"jakub.neumann@gmail.com","username":"jneumann"},"change_message_id":"60e97f5c8ee5d39b69252f29710bf9214eecdfe7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"4187f696_3c71c2cd","updated":"2026-01-28 15:09:00.000000000","message":"We are using this patch in production for some time and it works well enough.","commit_id":"74c3e58b0f695aa9f4e45c66558be7687376cf3d"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"90b2701f4761d84ecb247e69e335996f162ce1b4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"38fa023f_dbd486f9","updated":"2026-01-30 09:35:56.000000000","message":"Failing function test is unrelated to this patch.\n\nWaiting for https://review.opendev.org/c/openstack/neutron/+/974997 to get merged so I can rebase.","commit_id":"94a41b3760bfd3d0fb01319afaa4c4bffdef455a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"f7111130_7359c156","updated":"2026-02-04 23:00:32.000000000","message":"Thanks for updating this.\n\nIt will also need a release note describing the new option.","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"ee8febbc8fff51776e065ee344226904018552f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"564803a9_6dd72b35","updated":"2026-01-30 21:40:43.000000000","message":"recheck openstack-tox-pep8 timed out","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"85f695bc_57de3d37","updated":"2026-02-05 11:17:18.000000000","message":"Thanks for the review @haleyb.dev@gmail.com very much appreciated.\nI think I resolved all your notes.","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"98d053f0e7bbe525650c23ab59762e74106518b1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":41,"id":"6aa551c0_1cb992f9","updated":"2026-02-06 09:11:46.000000000","message":"@haleyb.dev@gmail.com After thinking a bit more about this patch, there could be a potential security risk in how this is currently implemented.\n\nWhen we blindly apply the gua nat rules, a tenant could simply add any publicly available ipv6 range, and the hypervisor would then send requests to vms with ips located in that range.\nFor example, if tenant1 creates google’s ipv6 range, we would apply those rules on the hypervisor and the hypervisor would start answering for those IPs. At least on the same hypervisor traffic for that network would be routed to the tenant1 network.\nDepending on network setup, for example with the ovn-bgp-agent with underlay driver, every tenant could potentially be routed into tenant1 network when requesting the google range.\n\nI think we would need some limitation, such as adding an address scope filter to the code.\n\nWhat do you think?","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3208c20242ef55828244c872d6e9cf0030811fb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"86760408_b7f1d1ff","updated":"2026-02-10 23:03:31.000000000","message":"Sorry, I still need to go through all the comments, just a quick response.","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"34d9b54abfcd52fdfb5ab6effbf832d3a178bef1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":41,"id":"846f2c8f_6e7c6534","in_reply_to":"56955f12_4b18acf2","updated":"2026-04-22 04:50:00.000000000","message":"Regarding the potential security risk, is this also an issue with IPv4? I guess I\u0027m just trying to think if it is an issue.","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"7db0a87a0ac6514360187a51f44c4d963e9056b5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":41,"id":"9312e8b4_784557e8","in_reply_to":"6aa551c0_1cb992f9","updated":"2026-02-06 12:17:29.000000000","message":"One idea regarding the potential address scope filter could be the following.\nWe add a distributed ipv6 method option, which could be `all` exposing any v6 tenant address, gua which than adds a v6 gua check to each ip address or address_scope which checks if an ip addresses is part of the address scope defined in another option like distributed_ipv6_address_scope ?","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"09042418609336bb7fff9c6d1dd1bf388c3829bb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":41,"id":"8809ffab_5c315e9e","in_reply_to":"846f2c8f_6e7c6534","updated":"2026-04-22 07:31:15.000000000","message":"For v4 this is not an issue as this patch only adds the option to expose v6 tenant ips. For v4, public ips always come from some kind of provider network that the cloud admin is responsible for.\n\nBut as this patch adds the option to expose any kind of v6 tenant ip we should add some kind of filtering capability as described above. Correct?","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f3af922ec626fd333c26f0aa93774aef5aa318e4","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":41,"id":"56955f12_4b18acf2","in_reply_to":"9312e8b4_784557e8","updated":"2026-04-21 08:16:55.000000000","message":"@haleyb.dev@gmail.com I would appreciate some feedback here so I can get this patch move forward.","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"}],"doc/source/ovn/faq/index.rst":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"See :doc:`/admin/ovn/ovn` for links to more details on OVN\u0027s architecture."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"**Q: Does OVN support DVR or distributed L3 routing for IPv6?**"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Yes, it\u0027s controlled by a single flag in configuration."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"f15b7663_5c4e1bde","line":123,"range":{"start_line":123,"start_character":5,"end_line":123,"end_character":26},"updated":"2023-06-27 17:23:46.000000000","message":"1) DVR (for FIP) and we don\u0027t have this feature. You should remove it from this line.\n\n2) You should include this under the question \"Does OVN support DVR or distributed L3 routing\"","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"See :doc:`/admin/ovn/ovn` for links to more details on OVN\u0027s architecture."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"**Q: Does OVN support DVR or distributed L3 routing for IPv6?**"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Yes, it\u0027s controlled by a single flag in configuration."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"18deb337_bfa07844","line":123,"range":{"start_line":123,"start_character":5,"end_line":123,"end_character":26},"in_reply_to":"a17ffe6b_93c57c87","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ba92c1e00157233ca16d25d581c3ad6d7cdd819b","unresolved":true,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"See :doc:`/admin/ovn/ovn` for links to more details on OVN\u0027s architecture."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"**Q: Does OVN support DVR or distributed L3 routing for IPv6?**"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Yes, it\u0027s controlled by a single flag in configuration."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"a17ffe6b_93c57c87","line":123,"range":{"start_line":123,"start_character":5,"end_line":123,"end_character":26},"in_reply_to":"bef6bb4a_1ceb7102","updated":"2023-07-05 14:56:29.000000000","message":"What I mean is that this should be under \"Does OVN support DVR or distributed L3 routing\" question, answering first for IPv4 and then for Ipv6","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"c4ccac40a9b91846daf99412c9e724b098c859b9","unresolved":true,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"See :doc:`/admin/ovn/ovn` for links to more details on OVN\u0027s architecture."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"**Q: Does OVN support DVR or distributed L3 routing for IPv6?**"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Yes, it\u0027s controlled by a single flag in configuration."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"bef6bb4a_1ceb7102","line":123,"range":{"start_line":123,"start_character":5,"end_line":123,"end_character":26},"in_reply_to":"f15b7663_5c4e1bde","updated":"2023-07-04 21:06:43.000000000","message":"I don\u0027t know if I understood the comment, the DRV I\u0027m talking about here is the IPv6 DVR and not for FIPs. What would be the suggestion for changing the text?","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py":[{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":762,"context_line":"               nat[\u0027logical_ip\u0027] \u003d\u003d logical_ip and"},{"line_number":763,"context_line":"               nat[\u0027external_ip\u0027] \u003d\u003d external_ip and"},{"line_number":764,"context_line":"               nat[\u0027external_ids\u0027].get(ovn_const.OVN_FIP_EXT_ID_KEY)"},{"line_number":765,"context_line":"                   is not None):"},{"line_number":766,"context_line":"                return nat"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    def check_revision_number(self, name, resource, resource_type,"}],"source_content_type":"text/x-python","patch_set":2,"id":"36267cc7_cb15fd39","line":765,"in_reply_to":"231af429_16c4be66","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":762,"context_line":"               nat[\u0027logical_ip\u0027] \u003d\u003d logical_ip and"},{"line_number":763,"context_line":"               nat[\u0027external_ip\u0027] \u003d\u003d external_ip and"},{"line_number":764,"context_line":"               nat[\u0027external_ids\u0027].get(ovn_const.OVN_FIP_EXT_ID_KEY)"},{"line_number":765,"context_line":"                                       is not None):"},{"line_number":766,"context_line":"                return nat"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    def check_revision_number(self, name, resource, resource_type,"}],"source_content_type":"text/x-python","patch_set":5,"id":"68224646_c2d9c755","line":765,"in_reply_to":"477aaeb1_85058254","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":750,"context_line":"            if filter_type and nat_rule.type !\u003d filter_type:"},{"line_number":751,"context_line":"                continue"},{"line_number":752,"context_line":"            if filter_external_ip and \\"},{"line_number":753,"context_line":"                    nat_rule.external_ip !\u003d filter_external_ip:"},{"line_number":754,"context_line":"                continue"},{"line_number":755,"context_line":"            if filter_logical_ip and \\"},{"line_number":756,"context_line":"                    nat_rule.logical_ip !\u003d filter_logical_ip:"}],"source_content_type":"text/x-python","patch_set":39,"id":"2b3eba46_1cd640ee","line":753,"updated":"2026-02-04 23:00:32.000000000","message":"nit: should use () and not \\ if possible here and below","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":750,"context_line":"            if filter_type and nat_rule.type !\u003d filter_type:"},{"line_number":751,"context_line":"                continue"},{"line_number":752,"context_line":"            if filter_external_ip and \\"},{"line_number":753,"context_line":"                    nat_rule.external_ip !\u003d filter_external_ip:"},{"line_number":754,"context_line":"                continue"},{"line_number":755,"context_line":"            if filter_logical_ip and \\"},{"line_number":756,"context_line":"                    nat_rule.logical_ip !\u003d filter_logical_ip:"}],"source_content_type":"text/x-python","patch_set":39,"id":"34738f50_2b7e31a3","line":753,"in_reply_to":"2b3eba46_1cd640ee","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"}],"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":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2577,"context_line":"                    ls_dns_record.uuid, ptr_record, if_exists\u003dTrue))"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"    def create_distributed_ipv6(self, port):"},{"line_number":2580,"context_line":"        \"\"\"Create the IPv6 NAT rule for the distrubuted routing scenario"},{"line_number":2581,"context_line":""},{"line_number":2582,"context_line":"        Use the ipv6 address attached to the subnet of the port to"},{"line_number":2583,"context_line":"        create the IPv6 NAT rule."}],"source_content_type":"text/x-python","patch_set":5,"id":"06dd95a7_8d36e39e","line":2580,"range":{"start_line":2580,"start_character":44,"end_line":2580,"end_character":55},"updated":"2022-12-13 18:27:31.000000000","message":"nit: s/distributed\n\nSame typo below.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"                    ls_dns_record.uuid, ptr_record, if_exists\u003dTrue))"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"    def create_distributed_ipv6(self, port):"},{"line_number":2580,"context_line":"        \"\"\"Create the IPv6 NAT rule for the distrubuted routing scenario"},{"line_number":2581,"context_line":""},{"line_number":2582,"context_line":"        Use the ipv6 address attached to the subnet of the port to"},{"line_number":2583,"context_line":"        create the IPv6 NAT rule."}],"source_content_type":"text/x-python","patch_set":5,"id":"98d3e311_00970cb0","line":2580,"range":{"start_line":2580,"start_character":44,"end_line":2580,"end_character":55},"in_reply_to":"06dd95a7_8d36e39e","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2592,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":2593,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2594,"context_line":"            subnet \u003d self._plugin.get_subnet("},{"line_number":2595,"context_line":"                    context, ip[\u0027subnet_id\u0027])"},{"line_number":2596,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"},{"line_number":2597,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2598,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"}],"source_content_type":"text/x-python","patch_set":5,"id":"e0016508_8ab7f052","line":2595,"updated":"2022-12-13 18:27:31.000000000","message":"Indentation here looks wrong, should be 4 spaces, or maybe this fits on the previous line?","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2592,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":2593,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2594,"context_line":"            subnet \u003d self._plugin.get_subnet("},{"line_number":2595,"context_line":"                    context, ip[\u0027subnet_id\u0027])"},{"line_number":2596,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"},{"line_number":2597,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2598,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"}],"source_content_type":"text/x-python","patch_set":5,"id":"736fc7f1_fceca5e0","line":2595,"in_reply_to":"e0016508_8ab7f052","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2597,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2598,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2599,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2600,"context_line":"                        \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2601,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2602,"context_line":"                                                     filters\u003dfilters)"},{"line_number":2603,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"872132c9_d4331be9","line":2600,"updated":"2022-12-13 18:27:31.000000000","message":"Indentation looks wrong here. Soon we will enforce this and this will be an error.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2597,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2598,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2599,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2600,"context_line":"                        \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2601,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2602,"context_line":"                                                     filters\u003dfilters)"},{"line_number":2603,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"a360cfac_44cfd458","line":2600,"in_reply_to":"872132c9_d4331be9","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2599,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2600,"context_line":"                        \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2601,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2602,"context_line":"                                                     filters\u003dfilters)"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"        for router_port in router_ports:"},{"line_number":2605,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"d42c27e6_f77aa4bc","line":2602,"updated":"2022-12-13 18:27:31.000000000","message":"Should there be a break here too?","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2599,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2600,"context_line":"                        \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2601,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2602,"context_line":"                                                     filters\u003dfilters)"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"        for router_port in router_ports:"},{"line_number":2605,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fad74a46_e4fa72b1","line":2602,"in_reply_to":"d42c27e6_f77aa4bc","updated":"2022-12-13 21:15:16.000000000","message":"Yes, absolutely.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2602,"context_line":"                                                     filters\u003dfilters)"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"        for router_port in router_ports:"},{"line_number":2605,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2606,"context_line":""},{"line_number":2607,"context_line":"        if port_ipv6_address is None or router_id is None:"},{"line_number":2608,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"8f434c25_9501fe67","line":2605,"updated":"2022-12-13 18:27:31.000000000","message":"Should this have a \u0027break\u0027? The router id of the first port should be enough. Same applies below.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2602,"context_line":"                                                     filters\u003dfilters)"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"        for router_port in router_ports:"},{"line_number":2605,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2606,"context_line":""},{"line_number":2607,"context_line":"        if port_ipv6_address is None or router_id is None:"},{"line_number":2608,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"165decd5_858c14da","line":2605,"in_reply_to":"8f434c25_9501fe67","updated":"2022-12-13 21:15:16.000000000","message":"Yes, absolutely too.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2631,"context_line":"                self._transaction(commands, txn\u003dtxn)"},{"line_number":2632,"context_line":"        except Exception as e:"},{"line_number":2633,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2634,"context_line":"                LOG.error(\u0027Unable to create NAT rule for distributed\u0027"},{"line_number":2635,"context_line":"                          \u0027router IPv6. Error: %s\u0027, e)"},{"line_number":2636,"context_line":""},{"line_number":2637,"context_line":"    def delete_distributed_ipv6(self, router_name, ipv6_addr):"}],"source_content_type":"text/x-python","patch_set":5,"id":"e8974b37_f210c2bb","line":2634,"range":{"start_line":2634,"start_character":68,"end_line":2634,"end_character":69},"updated":"2022-12-13 18:27:31.000000000","message":"nit: missing trailing space","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2631,"context_line":"                self._transaction(commands, txn\u003dtxn)"},{"line_number":2632,"context_line":"        except Exception as e:"},{"line_number":2633,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2634,"context_line":"                LOG.error(\u0027Unable to create NAT rule for distributed\u0027"},{"line_number":2635,"context_line":"                          \u0027router IPv6. Error: %s\u0027, e)"},{"line_number":2636,"context_line":""},{"line_number":2637,"context_line":"    def delete_distributed_ipv6(self, router_name, ipv6_addr):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fc375f40_8051802a","line":2634,"range":{"start_line":2634,"start_character":68,"end_line":2634,"end_character":69},"in_reply_to":"e8974b37_f210c2bb","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2651,"context_line":"                self._transaction(commands, txn\u003dtxn)"},{"line_number":2652,"context_line":"        except Exception as e:"},{"line_number":2653,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2654,"context_line":"                LOG.error(\u0027Unable to delete NAT rule for distributed\u0027"},{"line_number":2655,"context_line":"                          \u0027router IPv6. Error: %s\u0027, e)"},{"line_number":2656,"context_line":""},{"line_number":2657,"context_line":"    def _delete_distributed_ipv6_by_port(self, port):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5b673835_3e076049","line":2654,"range":{"start_line":2654,"start_character":68,"end_line":2654,"end_character":69},"updated":"2022-12-13 18:27:31.000000000","message":"nit: missing trailing space","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2651,"context_line":"                self._transaction(commands, txn\u003dtxn)"},{"line_number":2652,"context_line":"        except Exception as e:"},{"line_number":2653,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2654,"context_line":"                LOG.error(\u0027Unable to delete NAT rule for distributed\u0027"},{"line_number":2655,"context_line":"                          \u0027router IPv6. Error: %s\u0027, e)"},{"line_number":2656,"context_line":""},{"line_number":2657,"context_line":"    def _delete_distributed_ipv6_by_port(self, port):"}],"source_content_type":"text/x-python","patch_set":5,"id":"b9272cfa_4199fbbd","line":2654,"range":{"start_line":2654,"start_character":68,"end_line":2654,"end_character":69},"in_reply_to":"5b673835_3e076049","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2667,"context_line":"        subnet \u003d []"},{"line_number":2668,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2669,"context_line":"            subnet \u003d self._plugin.get_subnet("},{"line_number":2670,"context_line":"                    context, ip[\u0027subnet_id\u0027])"},{"line_number":2671,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"},{"line_number":2672,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2673,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"}],"source_content_type":"text/x-python","patch_set":5,"id":"54ff2924_1a63e960","line":2670,"updated":"2022-12-13 18:27:31.000000000","message":"Indentation here looks wrong, should be 4 spaces, or maybe this fits on the previous line?","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2667,"context_line":"        subnet \u003d []"},{"line_number":2668,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2669,"context_line":"            subnet \u003d self._plugin.get_subnet("},{"line_number":2670,"context_line":"                    context, ip[\u0027subnet_id\u0027])"},{"line_number":2671,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"},{"line_number":2672,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2673,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"}],"source_content_type":"text/x-python","patch_set":5,"id":"985f8c75_f9105ada","line":2670,"in_reply_to":"54ff2924_1a63e960","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fe6c8b7b15bdc2bd40b25439353d3f7639b116e2","unresolved":true,"context_lines":[{"line_number":2679,"context_line":"        for router_port in router_ports:"},{"line_number":2680,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2681,"context_line":""},{"line_number":2682,"context_line":"        if port_ipv6_address is None:"},{"line_number":2683,"context_line":"            return"},{"line_number":2684,"context_line":""},{"line_number":2685,"context_line":"        gw_lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":2686,"context_line":"        self.delete_distributed_ipv6(gw_lrouter_name, port_ipv6_address)"}],"source_content_type":"text/x-python","patch_set":5,"id":"18c352ee_5df8dfb3","line":2683,"range":{"start_line":2682,"start_character":8,"end_line":2683,"end_character":18},"updated":"2022-12-13 18:27:31.000000000","message":"This block should be above the router port loop since that will be unnecessary if there is no address.","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":2679,"context_line":"        for router_port in router_ports:"},{"line_number":2680,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2681,"context_line":""},{"line_number":2682,"context_line":"        if port_ipv6_address is None:"},{"line_number":2683,"context_line":"            return"},{"line_number":2684,"context_line":""},{"line_number":2685,"context_line":"        gw_lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":2686,"context_line":"        self.delete_distributed_ipv6(gw_lrouter_name, port_ipv6_address)"}],"source_content_type":"text/x-python","patch_set":5,"id":"d803eda0_9f6af138","line":2683,"range":{"start_line":2682,"start_character":8,"end_line":2683,"end_character":18},"in_reply_to":"18c352ee_5df8dfb3","updated":"2022-12-13 21:15:16.000000000","message":"Done","commit_id":"01407ad374c861a7990ab5a2871bbb6215faa817"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"},{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.create_distributed_ipv6(port)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    def _set_unset_virtual_port_type(self, context, txn, parent_port,"},{"line_number":646,"context_line":"                                     addresses, unset\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7fc3eea1_c81d1bcb","line":643,"range":{"start_line":643,"start_character":0,"end_line":643,"end_character":7},"updated":"2023-06-27 17:23:46.000000000","message":"Include this method inside the port create OVN transaction.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ba92c1e00157233ca16d25d581c3ad6d7cdd819b","unresolved":true,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"},{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.create_distributed_ipv6(port)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    def _set_unset_virtual_port_type(self, context, txn, parent_port,"},{"line_number":646,"context_line":"                                     addresses, unset\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":21,"id":"a0cac24e_fc77c08c","line":643,"range":{"start_line":643,"start_character":0,"end_line":643,"end_character":7},"in_reply_to":"04a0a579_254e2732","updated":"2023-07-05 14:56:29.000000000","message":"No, what I\u0027m saying is that you should include this operation inside the OVN txn that starts in L577 [1]. Same applies for other methods.\n\nhttps://review.opendev.org/c/openstack/neutron/+/867513/21/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py#577","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"c4ccac40a9b91846daf99412c9e724b098c859b9","unresolved":true,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"},{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.create_distributed_ipv6(port)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    def _set_unset_virtual_port_type(self, context, txn, parent_port,"},{"line_number":646,"context_line":"                                     addresses, unset\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":21,"id":"04a0a579_254e2732","line":643,"range":{"start_line":643,"start_character":0,"end_line":643,"end_character":7},"in_reply_to":"7fc3eea1_c81d1bcb","updated":"2023-07-04 21:06:43.000000000","message":"What would be the suggested method to move this call? inside ovn_client class or somewhere else?","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"},{"line_number":642,"context_line":""},{"line_number":643,"context_line":"        self.create_distributed_ipv6(port)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    def _set_unset_virtual_port_type(self, context, txn, parent_port,"},{"line_number":646,"context_line":"                                     addresses, unset\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1850cef1_669b5a54","line":643,"range":{"start_line":643,"start_character":0,"end_line":643,"end_character":7},"in_reply_to":"a0cac24e_fc77c08c","updated":"2023-07-05 22:11:17.000000000","message":"Sure, makes sense... thanks!","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":797,"context_line":"        if check_rev_cmd.result \u003d\u003d ovn_const.TXN_COMMITTED:"},{"line_number":798,"context_line":"            db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"        self.create_distributed_ipv6(port)"},{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    def _delete_port(self, port_id, port_object\u003dNone):"},{"line_number":803,"context_line":"        ovn_port \u003d self._nb_idl.lookup(\u0027Logical_Switch_Port\u0027, port_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"c724d385_8ea34c09","line":800,"range":{"start_line":800,"start_character":8,"end_line":800,"end_character":42},"updated":"2023-06-27 17:23:46.000000000","message":"Include this method inside the port update OVN transaction.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":797,"context_line":"        if check_rev_cmd.result \u003d\u003d ovn_const.TXN_COMMITTED:"},{"line_number":798,"context_line":"            db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)"},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"        self.create_distributed_ipv6(port)"},{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    def _delete_port(self, port_id, port_object\u003dNone):"},{"line_number":803,"context_line":"        ovn_port \u003d self._nb_idl.lookup(\u0027Logical_Switch_Port\u0027, port_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abab46e_3d9661f3","line":800,"range":{"start_line":800,"start_character":8,"end_line":800,"end_character":42},"in_reply_to":"c724d385_8ea34c09","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":805,"context_line":"            ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY)"},{"line_number":806,"context_line":"        network_id \u003d ovn_network_name.replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        self._delete_distributed_ipv6_by_port(port_object)"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":811,"context_line":"            txn.add(self._nb_idl.delete_lswitch_port("}],"source_content_type":"text/x-python","patch_set":21,"id":"28ec950f_75c3e904","line":808,"range":{"start_line":808,"start_character":8,"end_line":808,"end_character":58},"updated":"2023-06-27 17:23:46.000000000","message":"Include this method inside the port delete OVN transaction.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":805,"context_line":"            ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY)"},{"line_number":806,"context_line":"        network_id \u003d ovn_network_name.replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        self._delete_distributed_ipv6_by_port(port_object)"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":811,"context_line":"            txn.add(self._nb_idl.delete_lswitch_port("}],"source_content_type":"text/x-python","patch_set":21,"id":"9b9b23bd_07c23f8e","line":808,"range":{"start_line":808,"start_character":8,"end_line":808,"end_character":58},"in_reply_to":"28ec950f_75c3e904","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":1737,"context_line":""},{"line_number":1738,"context_line":"        db_rev.bump_revision(context, port, ovn_const.TYPE_ROUTER_PORTS)"},{"line_number":1739,"context_line":""},{"line_number":1740,"context_line":"        self._update_dvr_nat_ipv6(router[\u0027id\u0027], port[\u0027id\u0027], True)"},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"    def _update_lrouter_port(self, context, port, if_exists\u003dFalse, txn\u003dNone):"},{"line_number":1743,"context_line":"        \"\"\"Update a logical router port.\"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"e5420b9c_7f89d0fd","line":1740,"range":{"start_line":1740,"start_character":0,"end_line":1740,"end_character":19},"updated":"2023-06-27 17:23:46.000000000","message":"ditto","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":1737,"context_line":""},{"line_number":1738,"context_line":"        db_rev.bump_revision(context, port, ovn_const.TYPE_ROUTER_PORTS)"},{"line_number":1739,"context_line":""},{"line_number":1740,"context_line":"        self._update_dvr_nat_ipv6(router[\u0027id\u0027], port[\u0027id\u0027], True)"},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"    def _update_lrouter_port(self, context, port, if_exists\u003dFalse, txn\u003dNone):"},{"line_number":1743,"context_line":"        \"\"\"Update a logical router port.\"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"c03abe03_65f11008","line":1740,"range":{"start_line":1740,"start_character":0,"end_line":1740,"end_character":19},"in_reply_to":"e5420b9c_7f89d0fd","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":1812,"context_line":"        except idlutils.RowNotFound:"},{"line_number":1813,"context_line":"            return"},{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"        self._update_dvr_nat_ipv6(router_id, port_id)"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"        subnet_ids \u003d subnet_ids or []"},{"line_number":1818,"context_line":"        port_removed \u003d False"}],"source_content_type":"text/x-python","patch_set":21,"id":"94c9f1f3_0b4ebe83","line":1815,"range":{"start_line":1815,"start_character":0,"end_line":1815,"end_character":9},"updated":"2023-06-27 17:23:46.000000000","message":"ditto","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":1812,"context_line":"        except idlutils.RowNotFound:"},{"line_number":1813,"context_line":"            return"},{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"        self._update_dvr_nat_ipv6(router_id, port_id)"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":"        subnet_ids \u003d subnet_ids or []"},{"line_number":1818,"context_line":"        port_removed \u003d False"}],"source_content_type":"text/x-python","patch_set":21,"id":"a6e6362f_04ea12b7","line":1815,"range":{"start_line":1815,"start_character":0,"end_line":1815,"end_character":9},"in_reply_to":"94c9f1f3_0b4ebe83","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2717,"context_line":"        return None"},{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":"    def _find_ipv6_nat_rule(self, router_id, ipv6_addr):"},{"line_number":2720,"context_line":"        lrouter_nats \u003d self._nb_idl.get_lrouter_nat_rules("},{"line_number":2721,"context_line":"            utils.ovn_name(router_id))"},{"line_number":2722,"context_line":"        for lrouter_nat in lrouter_nats:"},{"line_number":2723,"context_line":"            if lrouter_nat[\u0027type\u0027] \u003d\u003d \u0027dnat_and_snat\u0027 and \\"},{"line_number":2724,"context_line":"                    lrouter_nat[\u0027external_ip\u0027] \u003d\u003d ipv6_addr and \\"},{"line_number":2725,"context_line":"                    lrouter_nat[\u0027logical_ip\u0027] \u003d\u003d ipv6_addr:"},{"line_number":2726,"context_line":"                return lrouter_nat"},{"line_number":2727,"context_line":"        return None"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def _update_dvr_nat_ipv6(self, router_id, port_id, create_rule\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":21,"id":"134145b8_1f0194d6","line":2726,"range":{"start_line":2720,"start_character":8,"end_line":2726,"end_character":34},"updated":"2023-06-27 17:23:46.000000000","message":"This way of finding the correct NAT rule is expensive because you are first building a list with all NAT rules present in the system. Modify \"get_lrouter_nat_rules\" to be able to pass filter arguments, like \"type\", \"external_ip\" and \"logical_ip\"","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2717,"context_line":"        return None"},{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":"    def _find_ipv6_nat_rule(self, router_id, ipv6_addr):"},{"line_number":2720,"context_line":"        lrouter_nats \u003d self._nb_idl.get_lrouter_nat_rules("},{"line_number":2721,"context_line":"            utils.ovn_name(router_id))"},{"line_number":2722,"context_line":"        for lrouter_nat in lrouter_nats:"},{"line_number":2723,"context_line":"            if lrouter_nat[\u0027type\u0027] \u003d\u003d \u0027dnat_and_snat\u0027 and \\"},{"line_number":2724,"context_line":"                    lrouter_nat[\u0027external_ip\u0027] \u003d\u003d ipv6_addr and \\"},{"line_number":2725,"context_line":"                    lrouter_nat[\u0027logical_ip\u0027] \u003d\u003d ipv6_addr:"},{"line_number":2726,"context_line":"                return lrouter_nat"},{"line_number":2727,"context_line":"        return None"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def _update_dvr_nat_ipv6(self, router_id, port_id, create_rule\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":21,"id":"27d62fa9_f6fcf25e","line":2726,"range":{"start_line":2720,"start_character":8,"end_line":2726,"end_character":34},"in_reply_to":"134145b8_1f0194d6","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2724,"context_line":"                    lrouter_nat[\u0027external_ip\u0027] \u003d\u003d ipv6_addr and \\"},{"line_number":2725,"context_line":"                    lrouter_nat[\u0027logical_ip\u0027] \u003d\u003d ipv6_addr:"},{"line_number":2726,"context_line":"                return lrouter_nat"},{"line_number":2727,"context_line":"        return None"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def _update_dvr_nat_ipv6(self, router_id, port_id, create_rule\u003dFalse):"},{"line_number":2730,"context_line":"        \"\"\"Update the VM IPv6 NAT rule attached to the router port"}],"source_content_type":"text/x-python","patch_set":21,"id":"8ef9faf8_78883cec","line":2727,"range":{"start_line":2727,"start_character":0,"end_line":2727,"end_character":4},"updated":"2023-06-27 17:23:46.000000000","message":"nit: Just \"return\"","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2724,"context_line":"                    lrouter_nat[\u0027external_ip\u0027] \u003d\u003d ipv6_addr and \\"},{"line_number":2725,"context_line":"                    lrouter_nat[\u0027logical_ip\u0027] \u003d\u003d ipv6_addr:"},{"line_number":2726,"context_line":"                return lrouter_nat"},{"line_number":2727,"context_line":"        return None"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def _update_dvr_nat_ipv6(self, router_id, port_id, create_rule\u003dFalse):"},{"line_number":2730,"context_line":"        \"\"\"Update the VM IPv6 NAT rule attached to the router port"}],"source_content_type":"text/x-python","patch_set":21,"id":"2733fe65_109d4d62","line":2727,"range":{"start_line":2727,"start_character":0,"end_line":2727,"end_character":4},"in_reply_to":"8ef9faf8_78883cec","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2825,"context_line":"        # Verify the device owner relationship"},{"line_number":2826,"context_line":"        device_owner \u003d port[\u0027device_owner\u0027]"},{"line_number":2827,"context_line":"        if device_owner is None:"},{"line_number":2828,"context_line":"            return"},{"line_number":2829,"context_line":"        if not device_owner.startswith("},{"line_number":2830,"context_line":"                const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":2831,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"57f3b7fe_45e7e4e8","line":2828,"updated":"2023-06-27 17:23:46.000000000","message":"nit: You should combine both:\n```\n   if device_owner is None or not device_owner.startswith(\n           const.DEVICE_OWNER_COMPUTE_PREFIX):\n       return\n```","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2825,"context_line":"        # Verify the device owner relationship"},{"line_number":2826,"context_line":"        device_owner \u003d port[\u0027device_owner\u0027]"},{"line_number":2827,"context_line":"        if device_owner is None:"},{"line_number":2828,"context_line":"            return"},{"line_number":2829,"context_line":"        if not device_owner.startswith("},{"line_number":2830,"context_line":"                const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":2831,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"2cfa87dc_fa167552","line":2828,"in_reply_to":"57f3b7fe_45e7e4e8","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2834,"context_line":"        port_ipv6_address \u003d None"},{"line_number":2835,"context_line":"        router_id \u003d None"},{"line_number":2836,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":2837,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2838,"context_line":"            subnet \u003d self._plugin.get_subnet(context,"},{"line_number":2839,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":2840,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"}],"source_content_type":"text/x-python","patch_set":21,"id":"baac6dcc_90586738","line":2837,"range":{"start_line":2837,"start_character":18,"end_line":2837,"end_character":43},"updated":"2023-06-27 17:23:46.000000000","message":"You\u0027ll have the subnet_ids and the ip_adresses. You can obtain the subnet IP version with the IP address and you don\u0027t need to retrieve the subnet from the DB.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2834,"context_line":"        port_ipv6_address \u003d None"},{"line_number":2835,"context_line":"        router_id \u003d None"},{"line_number":2836,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":2837,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2838,"context_line":"            subnet \u003d self._plugin.get_subnet(context,"},{"line_number":2839,"context_line":"                                             ip[\u0027subnet_id\u0027])"},{"line_number":2840,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"}],"source_content_type":"text/x-python","patch_set":21,"id":"bfcc53e3_617c1a1c","line":2837,"range":{"start_line":2837,"start_character":18,"end_line":2837,"end_character":43},"in_reply_to":"baac6dcc_90586738","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2846,"context_line":"                                                      filters\u003dfilters)"},{"line_number":2847,"context_line":"                break"},{"line_number":2848,"context_line":""},{"line_number":2849,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2850,"context_line":"            return"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        for router_port in router_ports:"}],"source_content_type":"text/x-python","patch_set":21,"id":"120a6199_714b17ca","line":2849,"range":{"start_line":2849,"start_character":11,"end_line":2849,"end_character":28},"updated":"2023-06-27 17:23:46.000000000","message":"Why do you need to check this?","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2846,"context_line":"                                                      filters\u003dfilters)"},{"line_number":2847,"context_line":"                break"},{"line_number":2848,"context_line":""},{"line_number":2849,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2850,"context_line":"            return"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        for router_port in router_ports:"}],"source_content_type":"text/x-python","patch_set":21,"id":"36fad707_189a574e","line":2849,"range":{"start_line":2849,"start_character":11,"end_line":2849,"end_character":28},"in_reply_to":"120a6199_714b17ca","updated":"2023-07-05 22:11:17.000000000","message":"Good question, checking the router_ports is enough for this case...","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2849,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2850,"context_line":"            return"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        for router_port in router_ports:"},{"line_number":2853,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2854,"context_line":"            break"},{"line_number":2855,"context_line":""},{"line_number":2856,"context_line":"        if router_id is None:"},{"line_number":2857,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"9c43a923_e0daa311","line":2854,"range":{"start_line":2852,"start_character":8,"end_line":2854,"end_character":17},"updated":"2023-06-27 17:23:46.000000000","message":"Why don\u0027t you just read the first router port in the list? There could be only one.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"c4ccac40a9b91846daf99412c9e724b098c859b9","unresolved":true,"context_lines":[{"line_number":2849,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2850,"context_line":"            return"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        for router_port in router_ports:"},{"line_number":2853,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2854,"context_line":"            break"},{"line_number":2855,"context_line":""},{"line_number":2856,"context_line":"        if router_id is None:"},{"line_number":2857,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"cb25843b_3c7247b2","line":2854,"range":{"start_line":2852,"start_character":8,"end_line":2854,"end_character":17},"in_reply_to":"9c43a923_e0daa311","updated":"2023-07-04 21:06:43.000000000","message":"Are you sure there would be only one in this case? I need to confirm this before change.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2849,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2850,"context_line":"            return"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        for router_port in router_ports:"},{"line_number":2853,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2854,"context_line":"            break"},{"line_number":2855,"context_line":""},{"line_number":2856,"context_line":"        if router_id is None:"},{"line_number":2857,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"3d11f533_238dcd27","line":2854,"range":{"start_line":2852,"start_character":8,"end_line":2854,"end_character":17},"in_reply_to":"a526d928_2cb07014","updated":"2023-07-05 22:11:17.000000000","message":"Yes definitely! thanks","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ba92c1e00157233ca16d25d581c3ad6d7cdd819b","unresolved":true,"context_lines":[{"line_number":2849,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2850,"context_line":"            return"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        for router_port in router_ports:"},{"line_number":2853,"context_line":"            router_id \u003d router_port[\u0027device_id\u0027]"},{"line_number":2854,"context_line":"            break"},{"line_number":2855,"context_line":""},{"line_number":2856,"context_line":"        if router_id is None:"},{"line_number":2857,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"a526d928_2cb07014","line":2854,"range":{"start_line":2852,"start_character":8,"end_line":2854,"end_character":17},"in_reply_to":"cb25843b_3c7247b2","updated":"2023-07-05 14:56:29.000000000","message":"If you have checked before that router_ports has elements and you are iterating just to retrieve the first one, why don\u0027t you just take it directly:\n```\n    router_id \u003d next(iter(router_ports))\n```\n^^^ same result, one line only","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2926,"context_line":"        subnet \u003d []"},{"line_number":2927,"context_line":"        router_id \u003d None"},{"line_number":2928,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2929,"context_line":"            subnet \u003d self._plugin.get_subnet(context, ip[\u0027subnet_id\u0027])"},{"line_number":2930,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"},{"line_number":2931,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2932,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2933,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"}],"source_content_type":"text/x-python","patch_set":21,"id":"f189fa2f_a602a9cf","line":2930,"range":{"start_line":2929,"start_character":12,"end_line":2930,"end_character":66},"updated":"2023-06-27 17:23:46.000000000","message":"Same here, the fixed_ips can provide you the IP version, there is no need to retrieve the subnets from the DB","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":false,"context_lines":[{"line_number":2926,"context_line":"        subnet \u003d []"},{"line_number":2927,"context_line":"        router_id \u003d None"},{"line_number":2928,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2929,"context_line":"            subnet \u003d self._plugin.get_subnet(context, ip[\u0027subnet_id\u0027])"},{"line_number":2930,"context_line":"            if subnet and subnet[\u0027ipv6_address_mode\u0027] is not None:"},{"line_number":2931,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2932,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2933,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"}],"source_content_type":"text/x-python","patch_set":21,"id":"e1ad5215_1a4b51b6","line":2930,"range":{"start_line":2929,"start_character":12,"end_line":2930,"end_character":66},"in_reply_to":"f189fa2f_a602a9cf","updated":"2023-07-05 22:11:17.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e72fa40dfd658c2cc384b21fdf78de65af13d570","unresolved":true,"context_lines":[{"line_number":2932,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2933,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2934,"context_line":"                           \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2935,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2936,"context_line":"                                                      filters\u003dfilters)"},{"line_number":2937,"context_line":""},{"line_number":2938,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2939,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"ee911710_bdbcb27d","line":2936,"range":{"start_line":2935,"start_character":16,"end_line":2936,"end_character":70},"updated":"2023-06-27 17:23:46.000000000","message":"You don\u0027t need to find that in the Neutron DB. You can find the OVN NB logical_router_port with external_ids:neutron:subnet_ids\u003dsubnet_id and then retrieve the router name from external_ids:neutron:router_name","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bb94e947f0ddb3b04c245629046b9039ad60e56","unresolved":true,"context_lines":[{"line_number":2932,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2933,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2934,"context_line":"                           \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2935,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2936,"context_line":"                                                      filters\u003dfilters)"},{"line_number":2937,"context_line":""},{"line_number":2938,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2939,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"9ff7b3ea_d9cfea3d","line":2936,"range":{"start_line":2935,"start_character":16,"end_line":2936,"end_character":70},"in_reply_to":"9c6c407f_aa48760d","updated":"2023-07-12 09:22:13.000000000","message":"This is a Logical_Router_Port register: https://paste.opendev.org/show/bydLs91eEHPOsw7YT1a9/\n\nYou have the router and the subnet IDs. You have everything to find it.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"bbe0fa43182b7c6f48aa9747de4f4a438d0b3057","unresolved":false,"context_lines":[{"line_number":2932,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2933,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2934,"context_line":"                           \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2935,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2936,"context_line":"                                                      filters\u003dfilters)"},{"line_number":2937,"context_line":""},{"line_number":2938,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2939,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"1b27d14f_30d88a9b","line":2936,"range":{"start_line":2935,"start_character":16,"end_line":2936,"end_character":70},"in_reply_to":"9ff7b3ea_d9cfea3d","updated":"2023-07-13 01:02:10.000000000","message":"done","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ec5ac286052e9daa07540d5185b5bcc7b6fdc961","unresolved":true,"context_lines":[{"line_number":2932,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2933,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet[\u0027id\u0027]]},"},{"line_number":2934,"context_line":"                           \u0027device_owner\u0027: [const.DEVICE_OWNER_ROUTER_INTF]}"},{"line_number":2935,"context_line":"                router_ports \u003d self._plugin.get_ports(context,"},{"line_number":2936,"context_line":"                                                      filters\u003dfilters)"},{"line_number":2937,"context_line":""},{"line_number":2938,"context_line":"        if port_ipv6_address is None or router_ports is None:"},{"line_number":2939,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":21,"id":"9c6c407f_aa48760d","line":2936,"range":{"start_line":2935,"start_character":16,"end_line":2936,"end_character":70},"in_reply_to":"ee911710_bdbcb27d","updated":"2023-07-05 22:11:17.000000000","message":"I don\u0027t know if I can do this without call the DB, since the port object does not have the external_ids.","commit_id":"76f9496ddfae9f4da8bd9cf9b0491b7dc970b6d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bb94e947f0ddb3b04c245629046b9039ad60e56","unresolved":true,"context_lines":[{"line_number":2809,"context_line":""},{"line_number":2810,"context_line":"        return"},{"line_number":2811,"context_line":""},{"line_number":2812,"context_line":"    def create_distributed_ipv6(self, port):"},{"line_number":2813,"context_line":"        \"\"\"Create the IPv6 NAT rule for the DVR scenario"},{"line_number":2814,"context_line":""},{"line_number":2815,"context_line":"        Use the ipv6 address attached to the subnet of the port to"}],"source_content_type":"text/x-python","patch_set":22,"id":"2304378c_7588d2a4","line":2812,"range":{"start_line":2812,"start_character":8,"end_line":2812,"end_character":31},"updated":"2023-07-12 09:22:13.000000000","message":"This method should not be used outside this class and this module. Please make it private.","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"bbe0fa43182b7c6f48aa9747de4f4a438d0b3057","unresolved":false,"context_lines":[{"line_number":2809,"context_line":""},{"line_number":2810,"context_line":"        return"},{"line_number":2811,"context_line":""},{"line_number":2812,"context_line":"    def create_distributed_ipv6(self, port):"},{"line_number":2813,"context_line":"        \"\"\"Create the IPv6 NAT rule for the DVR scenario"},{"line_number":2814,"context_line":""},{"line_number":2815,"context_line":"        Use the ipv6 address attached to the subnet of the port to"}],"source_content_type":"text/x-python","patch_set":22,"id":"563d465a_c2e9d091","line":2812,"range":{"start_line":2812,"start_character":8,"end_line":2812,"end_character":31},"in_reply_to":"2304378c_7588d2a4","updated":"2023-07-13 01:02:10.000000000","message":"This method is called from db_sync, it can\u0027t be private.","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bb94e947f0ddb3b04c245629046b9039ad60e56","unresolved":true,"context_lines":[{"line_number":2869,"context_line":"        commands.append(self._nb_idl.add_nat_rule_in_lrouter(gw_lrouter_name,"},{"line_number":2870,"context_line":"                                                             **columns))"},{"line_number":2871,"context_line":""},{"line_number":2872,"context_line":"        try:"},{"line_number":2873,"context_line":"            with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":2874,"context_line":"                self._transaction(commands, txn\u003dtxn)"},{"line_number":2875,"context_line":"        except Exception as e:"},{"line_number":2876,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2877,"context_line":"                LOG.error(\u0027Unable to create NAT rule for distributed \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"025b6a81_bfe38506","line":2874,"range":{"start_line":2872,"start_character":8,"end_line":2874,"end_character":52},"updated":"2023-07-12 09:22:13.000000000","message":"When I commented in [1], what I was expecting is to have a method like \"add_txns_to_sync_port_dns_records\" or \"_qos_driver.create_port\" or \"_add_port_to_drop_port_group\". In these methods we are passing the txn object, we are not creating another one. Actually here you are creating a nested transaction and committing some registers before the upper one.\n\n[1]https://review.opendev.org/c/openstack/neutron/+/867513/21/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py#643","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"bbe0fa43182b7c6f48aa9747de4f4a438d0b3057","unresolved":false,"context_lines":[{"line_number":2869,"context_line":"        commands.append(self._nb_idl.add_nat_rule_in_lrouter(gw_lrouter_name,"},{"line_number":2870,"context_line":"                                                             **columns))"},{"line_number":2871,"context_line":""},{"line_number":2872,"context_line":"        try:"},{"line_number":2873,"context_line":"            with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":2874,"context_line":"                self._transaction(commands, txn\u003dtxn)"},{"line_number":2875,"context_line":"        except Exception as e:"},{"line_number":2876,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2877,"context_line":"                LOG.error(\u0027Unable to create NAT rule for distributed \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"e2eff990_e0d4eaff","line":2874,"range":{"start_line":2872,"start_character":8,"end_line":2874,"end_character":52},"in_reply_to":"025b6a81_bfe38506","updated":"2023-07-13 01:02:10.000000000","message":"Sure, thanks.","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bb94e947f0ddb3b04c245629046b9039ad60e56","unresolved":true,"context_lines":[{"line_number":2877,"context_line":"                LOG.error(\u0027Unable to create NAT rule for distributed \u0027"},{"line_number":2878,"context_line":"                          \u0027router IPv6. Error: %s\u0027, e)"},{"line_number":2879,"context_line":""},{"line_number":2880,"context_line":"    def delete_distributed_ipv6(self, router_name, ipv6_addr):"},{"line_number":2881,"context_line":"        \"\"\"Delete the IPv6 NAT rule for the DVR scenario"},{"line_number":2882,"context_line":""},{"line_number":2883,"context_line":"        :param router_name: OVN context router name."}],"source_content_type":"text/x-python","patch_set":22,"id":"76f90b6c_cb6ffa4e","line":2880,"range":{"start_line":2880,"start_character":8,"end_line":2880,"end_character":31},"updated":"2023-07-12 09:22:13.000000000","message":"ditto: pass the txn object.","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"bbe0fa43182b7c6f48aa9747de4f4a438d0b3057","unresolved":false,"context_lines":[{"line_number":2877,"context_line":"                LOG.error(\u0027Unable to create NAT rule for distributed \u0027"},{"line_number":2878,"context_line":"                          \u0027router IPv6. Error: %s\u0027, e)"},{"line_number":2879,"context_line":""},{"line_number":2880,"context_line":"    def delete_distributed_ipv6(self, router_name, ipv6_addr):"},{"line_number":2881,"context_line":"        \"\"\"Delete the IPv6 NAT rule for the DVR scenario"},{"line_number":2882,"context_line":""},{"line_number":2883,"context_line":"        :param router_name: OVN context router name."}],"source_content_type":"text/x-python","patch_set":22,"id":"d407be5d_81309985","line":2880,"range":{"start_line":2880,"start_character":8,"end_line":2880,"end_character":31},"in_reply_to":"76f90b6c_cb6ffa4e","updated":"2023-07-13 01:02:10.000000000","message":"done","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bb94e947f0ddb3b04c245629046b9039ad60e56","unresolved":true,"context_lines":[{"line_number":2916,"context_line":"        port_ipv6_address \u003d None"},{"line_number":2917,"context_line":"        router_id \u003d None"},{"line_number":2918,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2919,"context_line":"            # Quick match for IPv6 address format"},{"line_number":2920,"context_line":"            if ip[\u0027ip_address\u0027].find(\u0027:\u0027) !\u003d -1:"},{"line_number":2921,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2922,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2923,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [ip[\u0027subnet_id\u0027]]},"}],"source_content_type":"text/x-python","patch_set":22,"id":"aca26e21_0daddf9a","line":2920,"range":{"start_line":2919,"start_character":12,"end_line":2920,"end_character":48},"updated":"2023-07-12 09:22:13.000000000","message":"We have a robust method for this check: neutron.common.utils.get_ip_version","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"bbe0fa43182b7c6f48aa9747de4f4a438d0b3057","unresolved":false,"context_lines":[{"line_number":2916,"context_line":"        port_ipv6_address \u003d None"},{"line_number":2917,"context_line":"        router_id \u003d None"},{"line_number":2918,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2919,"context_line":"            # Quick match for IPv6 address format"},{"line_number":2920,"context_line":"            if ip[\u0027ip_address\u0027].find(\u0027:\u0027) !\u003d -1:"},{"line_number":2921,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":2922,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":2923,"context_line":"                filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [ip[\u0027subnet_id\u0027]]},"}],"source_content_type":"text/x-python","patch_set":22,"id":"c6536090_ce0a3d81","line":2920,"range":{"start_line":2919,"start_character":12,"end_line":2920,"end_character":48},"in_reply_to":"aca26e21_0daddf9a","updated":"2023-07-13 01:02:10.000000000","message":"I had seen it, but with some computational use to create/initialize an object and prepare for the version check. But I\u0027m going to change it to make it standard.","commit_id":"5a9f1d6090f56b1242ff437130bfff60b357779f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3151,"context_line":"        self._create_ovn_fair_meter(meter_name, from_reload, txn,"},{"line_number":3152,"context_line":"                                    stateless\u003dTrue)"},{"line_number":3153,"context_line":""},{"line_number":3154,"context_line":"    def _check_duplicated_ipv6_rule(self, port, list):"},{"line_number":3155,"context_line":"        for rule in list:"},{"line_number":3156,"context_line":"            if rule[\u0027port\u0027] \u003d\u003d port:"},{"line_number":3157,"context_line":"                return port"}],"source_content_type":"text/x-python","patch_set":39,"id":"3ed61162_7ac774b2","line":3154,"range":{"start_line":3154,"start_character":48,"end_line":3154,"end_character":52},"updated":"2026-02-04 23:00:32.000000000","message":"Should use some variable other than the python built-in \u0027list\u0027, surprised pep8 didn\u0027t complain.","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3151,"context_line":"        self._create_ovn_fair_meter(meter_name, from_reload, txn,"},{"line_number":3152,"context_line":"                                    stateless\u003dTrue)"},{"line_number":3153,"context_line":""},{"line_number":3154,"context_line":"    def _check_duplicated_ipv6_rule(self, port, list):"},{"line_number":3155,"context_line":"        for rule in list:"},{"line_number":3156,"context_line":"            if rule[\u0027port\u0027] \u003d\u003d port:"},{"line_number":3157,"context_line":"                return port"}],"source_content_type":"text/x-python","patch_set":39,"id":"33b8754f_6a094562","line":3154,"range":{"start_line":3154,"start_character":48,"end_line":3154,"end_character":52},"in_reply_to":"3ed61162_7ac774b2","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3154,"context_line":"    def _check_duplicated_ipv6_rule(self, port, list):"},{"line_number":3155,"context_line":"        for rule in list:"},{"line_number":3156,"context_line":"            if rule[\u0027port\u0027] \u003d\u003d port:"},{"line_number":3157,"context_line":"                return port"},{"line_number":3158,"context_line":"        return"},{"line_number":3159,"context_line":""},{"line_number":3160,"context_line":"    def _find_ipv6_nat_rule(self, lrouter_name, ipv6_addr):"}],"source_content_type":"text/x-python","patch_set":39,"id":"016f47da_d091be38","line":3157,"updated":"2026-02-04 23:00:32.000000000","message":"I don\u0027t know if this is faster, but it seems better to use any() here, plus this function should return True/False\n\nif any(rule[\u0027port\u0027] \u003d\u003d port for rule in rules):\n    return True\nreturn False\n\nnot sure if i got the true/false correct there","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3154,"context_line":"    def _check_duplicated_ipv6_rule(self, port, list):"},{"line_number":3155,"context_line":"        for rule in list:"},{"line_number":3156,"context_line":"            if rule[\u0027port\u0027] \u003d\u003d port:"},{"line_number":3157,"context_line":"                return port"},{"line_number":3158,"context_line":"        return"},{"line_number":3159,"context_line":""},{"line_number":3160,"context_line":"    def _find_ipv6_nat_rule(self, lrouter_name, ipv6_addr):"}],"source_content_type":"text/x-python","patch_set":39,"id":"a92cb67e_f14b2ae2","line":3157,"in_reply_to":"016f47da_d091be38","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3161,"context_line":"        lrouter_nats \u003d self._nb_idl.get_lrouter_nat_rules("},{"line_number":3162,"context_line":"            lrouter_name, \u0027dnat_and_snat\u0027, ipv6_addr, ipv6_addr)"},{"line_number":3163,"context_line":"        if lrouter_nats:"},{"line_number":3164,"context_line":"            return next(iter(lrouter_nats))"},{"line_number":3165,"context_line":"        return"},{"line_number":3166,"context_line":""},{"line_number":3167,"context_line":"    def _update_dvr_nat_ipv6(self, context, router_id, port_id, create_rule,"}],"source_content_type":"text/x-python","patch_set":39,"id":"c988fb35_5c7b4614","line":3164,"updated":"2026-02-04 23:00:32.000000000","message":"instead of indenting this should just remove the if() and supply a default value, will also avoid a possible StopIteration issue:\n\nreturn next(iter(lrouter_nats), None)","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3161,"context_line":"        lrouter_nats \u003d self._nb_idl.get_lrouter_nat_rules("},{"line_number":3162,"context_line":"            lrouter_name, \u0027dnat_and_snat\u0027, ipv6_addr, ipv6_addr)"},{"line_number":3163,"context_line":"        if lrouter_nats:"},{"line_number":3164,"context_line":"            return next(iter(lrouter_nats))"},{"line_number":3165,"context_line":"        return"},{"line_number":3166,"context_line":""},{"line_number":3167,"context_line":"    def _update_dvr_nat_ipv6(self, context, router_id, port_id, create_rule,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ba3c20d7_f9883d91","line":3164,"in_reply_to":"c988fb35_5c7b4614","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3194,"context_line":"            db_ports \u003d self._plugin.get_ports(admin_context, filters\u003dfilters)"},{"line_number":3195,"context_line":"            for port in db_ports:"},{"line_number":3196,"context_line":"                if not port[\u0027device_owner\u0027].startswith("},{"line_number":3197,"context_line":"                        const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":3198,"context_line":"                    continue"},{"line_number":3199,"context_line":"                for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":3200,"context_line":"                    subnet \u003d self._plugin.get_subnet(admin_context,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ec5b082b_d4c190e6","line":3197,"updated":"2026-02-04 23:00:32.000000000","message":"is port[\u0027device_owner\u0027] always valid here?\n\nif not port.get(\u0027device_owner\u0027, \u0027\u0027).startswith(...)","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3194,"context_line":"            db_ports \u003d self._plugin.get_ports(admin_context, filters\u003dfilters)"},{"line_number":3195,"context_line":"            for port in db_ports:"},{"line_number":3196,"context_line":"                if not port[\u0027device_owner\u0027].startswith("},{"line_number":3197,"context_line":"                        const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":3198,"context_line":"                    continue"},{"line_number":3199,"context_line":"                for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":3200,"context_line":"                    subnet \u003d self._plugin.get_subnet(admin_context,"}],"source_content_type":"text/x-python","patch_set":39,"id":"a3e330e8_4e9b5c8d","line":3197,"in_reply_to":"ec5b082b_d4c190e6","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3204,"context_line":"                        # to the same \u0027VM\u0027 port, make sure we don\u0027t insert it"},{"line_number":3205,"context_line":"                        # twice."},{"line_number":3206,"context_line":"                        if self._check_duplicated_ipv6_rule(port, db_ipv6s) \\"},{"line_number":3207,"context_line":"                                is None:"},{"line_number":3208,"context_line":"                            db_ipv6s.append({\u0027ip\u0027: ip[\u0027ip_address\u0027],"},{"line_number":3209,"context_line":"                                             \u0027port\u0027: port})"},{"line_number":3210,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"e0992ddb_423d9277","line":3207,"updated":"2026-02-04 23:00:32.000000000","message":"Would need to change based on above comment","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3204,"context_line":"                        # to the same \u0027VM\u0027 port, make sure we don\u0027t insert it"},{"line_number":3205,"context_line":"                        # twice."},{"line_number":3206,"context_line":"                        if self._check_duplicated_ipv6_rule(port, db_ipv6s) \\"},{"line_number":3207,"context_line":"                                is None:"},{"line_number":3208,"context_line":"                            db_ipv6s.append({\u0027ip\u0027: ip[\u0027ip_address\u0027],"},{"line_number":3209,"context_line":"                                             \u0027port\u0027: port})"},{"line_number":3210,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"fd93b71e_ca56554b","line":3207,"in_reply_to":"e0992ddb_423d9277","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3210,"context_line":""},{"line_number":3211,"context_line":"        gw_lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":3212,"context_line":"        for db_ipv6 in db_ipv6s:"},{"line_number":3213,"context_line":"            db_port \u003d db_ipv6[\u0027port\u0027]"},{"line_number":3214,"context_line":"            if create_rule is True:"},{"line_number":3215,"context_line":"                # Skip the previously existing rule if for some reason it is"},{"line_number":3216,"context_line":"                # already applied"}],"source_content_type":"text/x-python","patch_set":39,"id":"242d769f_bd95d2fb","line":3213,"updated":"2026-02-04 23:00:32.000000000","message":"db_port is only used in if() case so this can move there","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3210,"context_line":""},{"line_number":3211,"context_line":"        gw_lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":3212,"context_line":"        for db_ipv6 in db_ipv6s:"},{"line_number":3213,"context_line":"            db_port \u003d db_ipv6[\u0027port\u0027]"},{"line_number":3214,"context_line":"            if create_rule is True:"},{"line_number":3215,"context_line":"                # Skip the previously existing rule if for some reason it is"},{"line_number":3216,"context_line":"                # already applied"}],"source_content_type":"text/x-python","patch_set":39,"id":"d45bd3df_9a1a1064","line":3213,"in_reply_to":"242d769f_bd95d2fb","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3211,"context_line":"        gw_lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":3212,"context_line":"        for db_ipv6 in db_ipv6s:"},{"line_number":3213,"context_line":"            db_port \u003d db_ipv6[\u0027port\u0027]"},{"line_number":3214,"context_line":"            if create_rule is True:"},{"line_number":3215,"context_line":"                # Skip the previously existing rule if for some reason it is"},{"line_number":3216,"context_line":"                # already applied"},{"line_number":3217,"context_line":"                if (self._find_ipv6_nat_rule(gw_lrouter_name, db_ipv6[\u0027ip\u0027])"}],"source_content_type":"text/x-python","patch_set":39,"id":"99f229fc_fa79f2b2","line":3214,"updated":"2026-02-04 23:00:32.000000000","message":"s/if create_rule:","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3211,"context_line":"        gw_lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":3212,"context_line":"        for db_ipv6 in db_ipv6s:"},{"line_number":3213,"context_line":"            db_port \u003d db_ipv6[\u0027port\u0027]"},{"line_number":3214,"context_line":"            if create_rule is True:"},{"line_number":3215,"context_line":"                # Skip the previously existing rule if for some reason it is"},{"line_number":3216,"context_line":"                # already applied"},{"line_number":3217,"context_line":"                if (self._find_ipv6_nat_rule(gw_lrouter_name, db_ipv6[\u0027ip\u0027])"}],"source_content_type":"text/x-python","patch_set":39,"id":"6ff210bb_80a9830b","line":3214,"in_reply_to":"99f229fc_fa79f2b2","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3215,"context_line":"                # Skip the previously existing rule if for some reason it is"},{"line_number":3216,"context_line":"                # already applied"},{"line_number":3217,"context_line":"                if (self._find_ipv6_nat_rule(gw_lrouter_name, db_ipv6[\u0027ip\u0027])"},{"line_number":3218,"context_line":"                        is not None):"},{"line_number":3219,"context_line":"                    continue"},{"line_number":3220,"context_line":"                # Set the NAT external_ids with the port information"},{"line_number":3221,"context_line":"                ext_ids \u003d {"}],"source_content_type":"text/x-python","patch_set":39,"id":"ffa98612_bc5fae89","line":3218,"updated":"2026-02-04 23:00:32.000000000","message":"I think you can drop the None check here","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3215,"context_line":"                # Skip the previously existing rule if for some reason it is"},{"line_number":3216,"context_line":"                # already applied"},{"line_number":3217,"context_line":"                if (self._find_ipv6_nat_rule(gw_lrouter_name, db_ipv6[\u0027ip\u0027])"},{"line_number":3218,"context_line":"                        is not None):"},{"line_number":3219,"context_line":"                    continue"},{"line_number":3220,"context_line":"                # Set the NAT external_ids with the port information"},{"line_number":3221,"context_line":"                ext_ids \u003d {"}],"source_content_type":"text/x-python","patch_set":39,"id":"c6437759_50090210","line":3218,"in_reply_to":"ffa98612_bc5fae89","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3236,"context_line":"            else:"},{"line_number":3237,"context_line":"                # Skip if the NAT rule does not exist in OVN context"},{"line_number":3238,"context_line":"                if (self._find_ipv6_nat_rule(gw_lrouter_name, db_ipv6[\u0027ip\u0027])"},{"line_number":3239,"context_line":"                        is None):"},{"line_number":3240,"context_line":"                    continue"},{"line_number":3241,"context_line":"                txn.add(self._nb_idl.delete_nat_rule_in_lrouter("},{"line_number":3242,"context_line":"                    gw_lrouter_name, type\u003d\u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":39,"id":"189363a7_ea214150","line":3239,"updated":"2026-02-04 23:00:32.000000000","message":"And this should be \u0027if not self._find...\u0027","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3236,"context_line":"            else:"},{"line_number":3237,"context_line":"                # Skip if the NAT rule does not exist in OVN context"},{"line_number":3238,"context_line":"                if (self._find_ipv6_nat_rule(gw_lrouter_name, db_ipv6[\u0027ip\u0027])"},{"line_number":3239,"context_line":"                        is None):"},{"line_number":3240,"context_line":"                    continue"},{"line_number":3241,"context_line":"                txn.add(self._nb_idl.delete_nat_rule_in_lrouter("},{"line_number":3242,"context_line":"                    gw_lrouter_name, type\u003d\u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ca500b53_7734d49f","line":3239,"in_reply_to":"189363a7_ea214150","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3257,"context_line":"        # Verify the device owner relationship"},{"line_number":3258,"context_line":"        device_owner \u003d port[\u0027device_owner\u0027]"},{"line_number":3259,"context_line":"        if device_owner is None or not device_owner.startswith("},{"line_number":3260,"context_line":"                const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":3261,"context_line":"            return"},{"line_number":3262,"context_line":""},{"line_number":3263,"context_line":"        port_ipv6_address \u003d None"}],"source_content_type":"text/x-python","patch_set":39,"id":"14f43bf4_71c26b83","line":3260,"updated":"2026-02-04 23:00:32.000000000","message":"Same comment as above","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3257,"context_line":"        # Verify the device owner relationship"},{"line_number":3258,"context_line":"        device_owner \u003d port[\u0027device_owner\u0027]"},{"line_number":3259,"context_line":"        if device_owner is None or not device_owner.startswith("},{"line_number":3260,"context_line":"                const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":3261,"context_line":"            return"},{"line_number":3262,"context_line":""},{"line_number":3263,"context_line":"        port_ipv6_address \u003d None"}],"source_content_type":"text/x-python","patch_set":39,"id":"bf1581b0_b203fe5d","line":3260,"in_reply_to":"14f43bf4_71c26b83","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3278,"context_line":"            return"},{"line_number":3279,"context_line":""},{"line_number":3280,"context_line":"        if (self._find_ipv6_nat_rule(gw_lrouter_name, port_ipv6_address)"},{"line_number":3281,"context_line":"                is not None):"},{"line_number":3282,"context_line":"            return"},{"line_number":3283,"context_line":""},{"line_number":3284,"context_line":"        # Set the NAT external_ids with the port information"}],"source_content_type":"text/x-python","patch_set":39,"id":"314819cb_e527c3d2","line":3281,"updated":"2026-02-04 23:00:32.000000000","message":"None not needed here either.","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3278,"context_line":"            return"},{"line_number":3279,"context_line":""},{"line_number":3280,"context_line":"        if (self._find_ipv6_nat_rule(gw_lrouter_name, port_ipv6_address)"},{"line_number":3281,"context_line":"                is not None):"},{"line_number":3282,"context_line":"            return"},{"line_number":3283,"context_line":""},{"line_number":3284,"context_line":"        # Set the NAT external_ids with the port information"}],"source_content_type":"text/x-python","patch_set":39,"id":"00d43e70_9fafc6df","line":3281,"in_reply_to":"314819cb_e527c3d2","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3323,"context_line":"        device_owner \u003d port[\u0027device_owner\u0027]"},{"line_number":3324,"context_line":"        if device_owner is None:"},{"line_number":3325,"context_line":"            return"},{"line_number":3326,"context_line":"        if not device_owner.startswith("},{"line_number":3327,"context_line":"                const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":3328,"context_line":"            return"},{"line_number":3329,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"3c98b5a8_fae841ce","line":3326,"updated":"2026-02-04 23:00:32.000000000","message":"Same comment as above","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3323,"context_line":"        device_owner \u003d port[\u0027device_owner\u0027]"},{"line_number":3324,"context_line":"        if device_owner is None:"},{"line_number":3325,"context_line":"            return"},{"line_number":3326,"context_line":"        if not device_owner.startswith("},{"line_number":3327,"context_line":"                const.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":3328,"context_line":"            return"},{"line_number":3329,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"d896302c_ef5c1328","line":3326,"in_reply_to":"3c98b5a8_fae841ce","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":3345,"context_line":"            return"},{"line_number":3346,"context_line":""},{"line_number":3347,"context_line":"        if (self._find_ipv6_nat_rule(gw_lrouter_name, port_ipv6_address)"},{"line_number":3348,"context_line":"                is None):"},{"line_number":3349,"context_line":"            return"},{"line_number":3350,"context_line":""},{"line_number":3351,"context_line":"        self.delete_distributed_ipv6(gw_lrouter_name, port_ipv6_address, txn)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ef2e201b_c823384e","line":3348,"updated":"2026-02-04 23:00:32.000000000","message":"Same comment as above","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":3345,"context_line":"            return"},{"line_number":3346,"context_line":""},{"line_number":3347,"context_line":"        if (self._find_ipv6_nat_rule(gw_lrouter_name, port_ipv6_address)"},{"line_number":3348,"context_line":"                is None):"},{"line_number":3349,"context_line":"            return"},{"line_number":3350,"context_line":""},{"line_number":3351,"context_line":"        self.delete_distributed_ipv6(gw_lrouter_name, port_ipv6_address, txn)"}],"source_content_type":"text/x-python","patch_set":39,"id":"76131adb_bd0975cd","line":3348,"in_reply_to":"ef2e201b_c823384e","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b5c8e5dffab602cff8c4498b5b239bcf68623dc","unresolved":true,"context_lines":[{"line_number":3257,"context_line":"        gw_lrouter_name \u003d None"},{"line_number":3258,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":3259,"context_line":"            if common_utils.get_ip_version(ip[\u0027ip_address\u0027]) \u003d\u003d \\"},{"line_number":3260,"context_line":"                    const.IP_VERSION_6:"},{"line_number":3261,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":3262,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":3263,"context_line":"                lrp_port \u003d self._nb_idl.get_logical_router_ports_by_subnet_ids("}],"source_content_type":"text/x-python","patch_set":40,"id":"f7fb7503_437d2ae6","line":3260,"updated":"2026-02-05 16:30:42.000000000","message":"I guess if we have to change this based on my comment below it might be easier to check if IPv4 here and continue so we can un-indent things a bit.","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"1cdb82440b2023ca177f5a40c23dd5ca11dbb690","unresolved":false,"context_lines":[{"line_number":3257,"context_line":"        gw_lrouter_name \u003d None"},{"line_number":3258,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":3259,"context_line":"            if common_utils.get_ip_version(ip[\u0027ip_address\u0027]) \u003d\u003d \\"},{"line_number":3260,"context_line":"                    const.IP_VERSION_6:"},{"line_number":3261,"context_line":"                port_ipv6_address \u003d ip[\u0027ip_address\u0027]"},{"line_number":3262,"context_line":"                # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":3263,"context_line":"                lrp_port \u003d self._nb_idl.get_logical_router_ports_by_subnet_ids("}],"source_content_type":"text/x-python","patch_set":40,"id":"23e83db0_a22f1892","line":3260,"in_reply_to":"f7fb7503_437d2ae6","updated":"2026-02-05 21:40:39.000000000","message":"Done","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b5c8e5dffab602cff8c4498b5b239bcf68623dc","unresolved":true,"context_lines":[{"line_number":3265,"context_line":"                if lrp_port:"},{"line_number":3266,"context_line":"                    gw_lrouter_name \u003d lrp_port.external_ids.get("},{"line_number":3267,"context_line":"                        ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":3268,"context_line":"                break"},{"line_number":3269,"context_line":""},{"line_number":3270,"context_line":"        if gw_lrouter_name is None:"},{"line_number":3271,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":40,"id":"089204cb_dc9f7415","line":3268,"updated":"2026-02-05 16:30:42.000000000","message":"So something I missed before is that there can be multiple IPv6 addresses on this port each in their own subnet. It seems we should loop if we didn\u0027t find the lrp_port for the subnet. But then below we only add a single rule for one address, so then that would all need to be inside the loop as well. It would have to be tested that it continues to work the same way.","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"1cdb82440b2023ca177f5a40c23dd5ca11dbb690","unresolved":true,"context_lines":[{"line_number":3265,"context_line":"                if lrp_port:"},{"line_number":3266,"context_line":"                    gw_lrouter_name \u003d lrp_port.external_ids.get("},{"line_number":3267,"context_line":"                        ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":3268,"context_line":"                break"},{"line_number":3269,"context_line":""},{"line_number":3270,"context_line":"        if gw_lrouter_name is None:"},{"line_number":3271,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":40,"id":"7cb1301e_2905dc40","line":3268,"in_reply_to":"089204cb_dc9f7415","updated":"2026-02-05 21:40:39.000000000","message":"Implemented looping over the ips and adding a rule for each v6 address.\n\nI am not 100% sure what you mean with \"It would have to be tested that it continues to work the same way.\"? I added a functional test for a port with multiple ip\u0027s is that enough?","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3208c20242ef55828244c872d6e9cf0030811fb4","unresolved":true,"context_lines":[{"line_number":3265,"context_line":"                if lrp_port:"},{"line_number":3266,"context_line":"                    gw_lrouter_name \u003d lrp_port.external_ids.get("},{"line_number":3267,"context_line":"                        ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":3268,"context_line":"                break"},{"line_number":3269,"context_line":""},{"line_number":3270,"context_line":"        if gw_lrouter_name is None:"},{"line_number":3271,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":40,"id":"9135b266_a4d8305a","line":3268,"in_reply_to":"7cb1301e_2905dc40","updated":"2026-02-10 23:03:31.000000000","message":"I guess I assumed this was tested in a production environment, so a big change like the loop might need a re-test, but a functional test might be enough.","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"b7cb5c86dd02329b7172062daec10e5982e1c968","unresolved":false,"context_lines":[{"line_number":3265,"context_line":"                if lrp_port:"},{"line_number":3266,"context_line":"                    gw_lrouter_name \u003d lrp_port.external_ids.get("},{"line_number":3267,"context_line":"                        ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":3268,"context_line":"                break"},{"line_number":3269,"context_line":""},{"line_number":3270,"context_line":"        if gw_lrouter_name is None:"},{"line_number":3271,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":40,"id":"143f516c_bdd05011","line":3268,"in_reply_to":"9135b266_a4d8305a","updated":"2026-02-11 18:41:30.000000000","message":"We are very much planning to use this feature at some point. But first I would like to get the patch into a mergeable state before I will test it in a pre-prod environment.\nI assume we also need some patching in the ovn-bgp-agent once the patch is merged so that setups using the agent announce v6 ips from compute nodes.\n\n@jakub.neumann@gmail.com said they were using the initial patch in production.","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b5c8e5dffab602cff8c4498b5b239bcf68623dc","unresolved":true,"context_lines":[{"line_number":3328,"context_line":"                if lrp_port:"},{"line_number":3329,"context_line":"                    gw_lrouter_name \u003d lrp_port.external_ids.get("},{"line_number":3330,"context_line":"                        ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":""},{"line_number":3333,"context_line":"        if gw_lrouter_name is None:"},{"line_number":3334,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":40,"id":"bbf26d5d_481b38d6","line":3331,"updated":"2026-02-05 16:30:42.000000000","message":"Same loop comment as above.","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"1cdb82440b2023ca177f5a40c23dd5ca11dbb690","unresolved":false,"context_lines":[{"line_number":3328,"context_line":"                if lrp_port:"},{"line_number":3329,"context_line":"                    gw_lrouter_name \u003d lrp_port.external_ids.get("},{"line_number":3330,"context_line":"                        ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":3331,"context_line":"                break"},{"line_number":3332,"context_line":""},{"line_number":3333,"context_line":"        if gw_lrouter_name is None:"},{"line_number":3334,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":40,"id":"6e521b2c_e52ef31e","line":3331,"in_reply_to":"bbf26d5d_481b38d6","updated":"2026-02-05 21:40:39.000000000","message":"Done","commit_id":"ef50e7b3fca16f18c68655a773127d0baca37666"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"8331c4dae0c74300305c2d539d200c81aab73ac7","unresolved":true,"context_lines":[{"line_number":3256,"context_line":"        for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":3257,"context_line":"            if common_utils.get_ip_version(ip[\u0027ip_address\u0027]) \u003d\u003d \\"},{"line_number":3258,"context_line":"                    const.IP_VERSION_4:"},{"line_number":3259,"context_line":"                continue"},{"line_number":3260,"context_line":"            # Get the Logical_Router attached to that IPv6 subnet address"},{"line_number":3261,"context_line":"            lrp_port \u003d self._nb_idl.get_logical_router_ports_by_subnet_ids("},{"line_number":3262,"context_line":"                ip[\u0027subnet_id\u0027])"}],"source_content_type":"text/x-python","patch_set":41,"id":"aa335f88_5baa80d7","line":3259,"updated":"2026-02-06 09:17:01.000000000","message":"@haleyb.dev@gmail.com should we add `ipv6.is_global` from `ipaddress` lib as a check here? Otherwise we would also expose none gua addresses I suppose?","commit_id":"7857e132c9863a9fc620f3ff1d6fe8e1cd3545ff"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py":[{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"            db_ports \u003d self.core_plugin.get_ports(ctx, filters\u003dfilters)"},{"line_number":1290,"context_line":"            for port in db_ports:"},{"line_number":1291,"context_line":"                if not port[\u0027device_owner\u0027].startswith("},{"line_number":1292,"context_line":"                    constants.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":1293,"context_line":"                    continue"},{"line_number":1294,"context_line":"                for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":1295,"context_line":"                    subnet \u003d self.core_plugin.get_subnet(ctx,"}],"source_content_type":"text/x-python","patch_set":2,"id":"be97c329_77c6c62e","line":1292,"in_reply_to":"0fde15b5_f3fe63ad","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E125 continuation line with same indent as next logical line\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":1303,"context_line":"        for db_ipv6 in db_ipv6s:"},{"line_number":1304,"context_line":"            for ovn_nat in ovn_nats:"},{"line_number":1305,"context_line":"                if (ovn_nat[\u0027logical_ip\u0027] \u003d\u003d db_ipv6[\u0027ip\u0027] and"},{"line_number":1306,"context_line":"                    ovn_nat[\u0027external_ip\u0027] \u003d\u003d db_ipv6[\u0027ip\u0027]):"},{"line_number":1307,"context_line":"                    break"},{"line_number":1308,"context_line":"            else:"},{"line_number":1309,"context_line":"                # The router can have both IPv4 and IPv6 subnet linked to the"}],"source_content_type":"text/x-python","patch_set":2,"id":"afa0e475_02174607","line":1306,"in_reply_to":"54277695_7735b7db","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E129 visually indented line with same indent as next logical line\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":1314,"context_line":"        for ovn_nat in ovn_nats:"},{"line_number":1315,"context_line":"            for db_ipv6 in db_ipv6s:"},{"line_number":1316,"context_line":"                if (ovn_nat[\u0027logical_ip\u0027] \u003d\u003d db_ipv6[\u0027ip\u0027] and"},{"line_number":1317,"context_line":"                    ovn_nat[\u0027external_ip\u0027] \u003d\u003d db_ipv6[\u0027ip\u0027]):"},{"line_number":1318,"context_line":"                    break"},{"line_number":1319,"context_line":"            else:"},{"line_number":1320,"context_line":"                ovn_ipv6_rule \u003d {\u0027ip\u0027: ovn_nat[\u0027external_ip\u0027], \u0027data\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"0ed18fcf_ae7e14b8","line":1317,"in_reply_to":"a1d62f86_73a0a6a6","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E129 visually indented line with same indent as next logical line\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"                                    \u0027add\u0027: add_nat_ipv6,"},{"line_number":1347,"context_line":"                                    \u0027del\u0027: del_nat_ipv6})"},{"line_number":1348,"context_line":""},{"line_number":1349,"context_line":"        with self.ovn_api.transaction(check_error\u003dTrue) as txn:"},{"line_number":1350,"context_line":"            for dvr_ipv6 in update_ipv6_list:"},{"line_number":1351,"context_line":"                for nat in dvr_ipv6[\u0027del\u0027]:"},{"line_number":1352,"context_line":"                    LOG.warning(\"Router %(id)s distributed IPv6 %(ipv6)s \""}],"source_content_type":"text/x-python","patch_set":2,"id":"4d3cd516_1c236fcf","line":1349,"in_reply_to":"46dee8ec_1ba364c7","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: F841 local variable \u0027txn\u0027 is assigned to but never used\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":1371,"context_line":"        LOG.debug(\u0027OVN-NB Sync distributed IPv6 finished %s\u0027,"},{"line_number":1372,"context_line":"                  str(datetime.now()))"},{"line_number":1373,"context_line":""},{"line_number":1374,"context_line":"class OvnSbSynchronizer(OvnDbSynchronizer):"},{"line_number":1375,"context_line":"    \"\"\"Synchronizer class for SB.\"\"\""},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"    def __init__(self, core_plugin, ovn_api, ovn_driver):"}],"source_content_type":"text/x-python","patch_set":2,"id":"03e29669_46faa2dc","line":1374,"in_reply_to":"af2a001a_a3b846a5","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":1417,"context_line":"        for rule in list:"},{"line_number":1418,"context_line":"            if rule[\u0027data\u0027] \u003d\u003d db_ipv6[\u0027data\u0027]:"},{"line_number":1419,"context_line":"                return db_ipv6"},{"line_number":1420,"context_line":"        return"},{"line_number":1421,"context_line":""},{"line_number":1422,"context_line":"    def _calculate_distributed_ipv6_differences(self, ovn_nats, router,"},{"line_number":1423,"context_line":"                                                ctx):"}],"source_content_type":"text/x-python","patch_set":39,"id":"97b7056b_2b8e80db","line":1420,"updated":"2026-02-04 23:00:32.000000000","message":"Same comment as other file - this is technically returning a boolean as return value is never used","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":1417,"context_line":"        for rule in list:"},{"line_number":1418,"context_line":"            if rule[\u0027data\u0027] \u003d\u003d db_ipv6[\u0027data\u0027]:"},{"line_number":1419,"context_line":"                return db_ipv6"},{"line_number":1420,"context_line":"        return"},{"line_number":1421,"context_line":""},{"line_number":1422,"context_line":"    def _calculate_distributed_ipv6_differences(self, ovn_nats, router,"},{"line_number":1423,"context_line":"                                                ctx):"}],"source_content_type":"text/x-python","patch_set":39,"id":"1b17db74_a4c6ad89","line":1420,"in_reply_to":"97b7056b_2b8e80db","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":1434,"context_line":"            db_ports \u003d self.core_plugin.get_ports(ctx, filters\u003dfilters)"},{"line_number":1435,"context_line":"            for port in db_ports:"},{"line_number":1436,"context_line":"                if not port[\u0027device_owner\u0027].startswith("},{"line_number":1437,"context_line":"                        constants.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":1438,"context_line":"                    continue"},{"line_number":1439,"context_line":"                for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":1440,"context_line":"                    subnet \u003d self.core_plugin.get_subnet(ctx,"}],"source_content_type":"text/x-python","patch_set":39,"id":"308f6565_0c924bea","line":1437,"updated":"2026-02-04 23:00:32.000000000","message":"Same comment as other file, can this be None and throw an exception?","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":1434,"context_line":"            db_ports \u003d self.core_plugin.get_ports(ctx, filters\u003dfilters)"},{"line_number":1435,"context_line":"            for port in db_ports:"},{"line_number":1436,"context_line":"                if not port[\u0027device_owner\u0027].startswith("},{"line_number":1437,"context_line":"                        constants.DEVICE_OWNER_COMPUTE_PREFIX):"},{"line_number":1438,"context_line":"                    continue"},{"line_number":1439,"context_line":"                for ip in port.get(\u0027fixed_ips\u0027, []):"},{"line_number":1440,"context_line":"                    subnet \u003d self.core_plugin.get_subnet(ctx,"}],"source_content_type":"text/x-python","patch_set":39,"id":"9598b274_54bf2ec3","line":1437,"in_reply_to":"308f6565_0c924bea","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":1480,"context_line":""},{"line_number":1481,"context_line":"    def sync_distributed_ipv6(self, ctx):"},{"line_number":1482,"context_line":"        \"\"\"Sync distributed IPv6 nat rules.\"\"\""},{"line_number":1483,"context_line":"        LOG.debug(\u0027OVN-NB Sync distributed IPv6 started %s\u0027,"},{"line_number":1484,"context_line":"                  str(datetime.now()))"},{"line_number":1485,"context_line":"        update_ipv6_list \u003d []"},{"line_number":1486,"context_line":"        # Get all router NAT rules to compare the differences"}],"source_content_type":"text/x-python","patch_set":39,"id":"9550e217_9a8ce2cb","line":1483,"range":{"start_line":1483,"start_character":48,"end_line":1483,"end_character":55},"updated":"2026-02-04 23:00:32.000000000","message":"s/started @ %s\n\nto match other strings here","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":1480,"context_line":""},{"line_number":1481,"context_line":"    def sync_distributed_ipv6(self, ctx):"},{"line_number":1482,"context_line":"        \"\"\"Sync distributed IPv6 nat rules.\"\"\""},{"line_number":1483,"context_line":"        LOG.debug(\u0027OVN-NB Sync distributed IPv6 started %s\u0027,"},{"line_number":1484,"context_line":"                  str(datetime.now()))"},{"line_number":1485,"context_line":"        update_ipv6_list \u003d []"},{"line_number":1486,"context_line":"        # Get all router NAT rules to compare the differences"}],"source_content_type":"text/x-python","patch_set":39,"id":"2fc3c4dd_d109a1a9","line":1483,"range":{"start_line":1483,"start_character":48,"end_line":1483,"end_character":55},"in_reply_to":"9550e217_9a8ce2cb","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":1525,"context_line":"                        self._ovn_client.create_distributed_ipv6("},{"line_number":1526,"context_line":"                            nat[\u0027data\u0027], txn)"},{"line_number":1527,"context_line":""},{"line_number":1528,"context_line":"        LOG.debug(\u0027OVN-NB Sync distributed IPv6 finished %s\u0027,"},{"line_number":1529,"context_line":"                  str(datetime.now()))"},{"line_number":1530,"context_line":""},{"line_number":1531,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"c384d690_d10e8f96","line":1528,"range":{"start_line":1528,"start_character":48,"end_line":1528,"end_character":56},"updated":"2026-02-04 23:00:32.000000000","message":"s/completed @ %s","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"                        self._ovn_client.create_distributed_ipv6("},{"line_number":1526,"context_line":"                            nat[\u0027data\u0027], txn)"},{"line_number":1527,"context_line":""},{"line_number":1528,"context_line":"        LOG.debug(\u0027OVN-NB Sync distributed IPv6 finished %s\u0027,"},{"line_number":1529,"context_line":"                  str(datetime.now()))"},{"line_number":1530,"context_line":""},{"line_number":1531,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"994326f4_cdf00460","line":1528,"range":{"start_line":1528,"start_character":48,"end_line":1528,"end_character":56},"in_reply_to":"c384d690_d10e8f96","updated":"2026-02-05 11:17:18.000000000","message":"Done","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8254020a19a0aefc563d6c8f06cc39666db3b97d","unresolved":true,"context_lines":[{"line_number":1802,"context_line":"    def _create_port(self, name, net_id, security_groups\u003dNone,"},{"line_number":1803,"context_line":"                     device_owner\u003dNone):"},{"line_number":1804,"context_line":"        data \u003d {\u0027port\u0027: {\u0027name\u0027: name,"},{"line_number":1805,"context_line":"                         \u0027tenant_id\u0027: self._project_id,"},{"line_number":1806,"context_line":"                         \u0027network_id\u0027: net_id}}"},{"line_number":1807,"context_line":""},{"line_number":1808,"context_line":"        if security_groups is not None:"}],"source_content_type":"text/x-python","patch_set":39,"id":"5889efd3_84f79779","line":1805,"updated":"2026-02-04 23:00:32.000000000","message":"Just a comment that I have another patch series in-flight changing this to project_id, so this will need an update if it merges first. Same with usage above possibly.","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"},{"author":{"_account_id":34380,"name":"Maximilian Stinsky","email":"maximilian@stinsky.com","username":"mstinsky"},"change_message_id":"f52cfe92f776d9987744f2edefc6e84a270ea8b6","unresolved":true,"context_lines":[{"line_number":1802,"context_line":"    def _create_port(self, name, net_id, security_groups\u003dNone,"},{"line_number":1803,"context_line":"                     device_owner\u003dNone):"},{"line_number":1804,"context_line":"        data \u003d {\u0027port\u0027: {\u0027name\u0027: name,"},{"line_number":1805,"context_line":"                         \u0027tenant_id\u0027: self._project_id,"},{"line_number":1806,"context_line":"                         \u0027network_id\u0027: net_id}}"},{"line_number":1807,"context_line":""},{"line_number":1808,"context_line":"        if security_groups is not None:"}],"source_content_type":"text/x-python","patch_set":39,"id":"fb6d1cbc_483c6161","line":1805,"in_reply_to":"5889efd3_84f79779","updated":"2026-02-05 11:17:18.000000000","message":"Ok, thanks for the heads-up. I will keep this comment open, than we can check what gets merged first.","commit_id":"2ce5ec9baf1ec1f265469cbda8b95fde162b8918"}],"neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_db_sync.py":[{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                        \u0027external_ip\u0027: \u002790.0.0.10\u0027,"},{"line_number":315,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"},{"line_number":316,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":317,"context_line":"                                                 {\"neutron:fip_id\":\"fip1\"}},"},{"line_number":318,"context_line":"                                       {\u0027logical_ip\u0027: \u0027172.16.1.11\u0027,"},{"line_number":319,"context_line":"                                        \u0027external_ip\u0027: \u002790.0.0.11\u0027,"},{"line_number":320,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"093d624e_8b8c2b3d","line":317,"in_reply_to":"42a618d2_0d0d4d46","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                        \u0027external_ip\u0027: \u002790.0.0.10\u0027,"},{"line_number":315,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"},{"line_number":316,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":317,"context_line":"                                                 {\"neutron:fip_id\":\"fip1\"}},"},{"line_number":318,"context_line":"                                       {\u0027logical_ip\u0027: \u0027172.16.1.11\u0027,"},{"line_number":319,"context_line":"                                        \u0027external_ip\u0027: \u002790.0.0.11\u0027,"},{"line_number":320,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d5775fd_6ba254ac","line":317,"in_reply_to":"6bad1959_722bef4d","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E231 missing whitespace after \u0027:\u0027\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                                        \u0027external_ip\u0027: \u002790.0.0.11\u0027,"},{"line_number":320,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"},{"line_number":321,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":322,"context_line":"                                                 {\"neutron:fip_id\":\"fip5\"}},"},{"line_number":323,"context_line":"                                       {\u0027logical_ip\u0027: \u0027192.168.2.11\u0027,"},{"line_number":324,"context_line":"                                        \u0027external_ip\u0027: \u0027100.0.0.11\u0027,"},{"line_number":325,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"96d0fa2e_36b08ba6","line":322,"in_reply_to":"94819eca_6677a1c1","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E231 missing whitespace after \u0027:\u0027\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                                        \u0027external_ip\u0027: \u002790.0.0.11\u0027,"},{"line_number":320,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"},{"line_number":321,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":322,"context_line":"                                                 {\"neutron:fip_id\":\"fip5\"}},"},{"line_number":323,"context_line":"                                       {\u0027logical_ip\u0027: \u0027192.168.2.11\u0027,"},{"line_number":324,"context_line":"                                        \u0027external_ip\u0027: \u0027100.0.0.11\u0027,"},{"line_number":325,"context_line":"                                        \u0027type\u0027: \u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"f32a084a_a69d6283","line":322,"in_reply_to":"c0e22bf1_962d3fb3","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":326,"context_line":"                                        \u0027external_mac\u0027: \u002701:02:03:04:05:06\u0027,"},{"line_number":327,"context_line":"                                        \u0027logical_port\u0027: \u0027vm1\u0027,"},{"line_number":328,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":329,"context_line":"                                                 {\"neutron:fip_id\":\"fip4\"}}"},{"line_number":330,"context_line":"                                        ]}]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.lswitches_with_ports \u003d [{\u0027name\u0027: \u0027neutron-n1\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"56f4d210_658b16c0","line":329,"in_reply_to":"6d53276a_352cc312","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E231 missing whitespace after \u0027:\u0027\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":326,"context_line":"                                        \u0027external_mac\u0027: \u002701:02:03:04:05:06\u0027,"},{"line_number":327,"context_line":"                                        \u0027logical_port\u0027: \u0027vm1\u0027,"},{"line_number":328,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":329,"context_line":"                                                 {\"neutron:fip_id\":\"fip4\"}}"},{"line_number":330,"context_line":"                                        ]}]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.lswitches_with_ports \u003d [{\u0027name\u0027: \u0027neutron-n1\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb0a7b1f_650b3864","line":329,"in_reply_to":"ce95e580_c3eacaea","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                                        \u0027logical_port\u0027: \u0027vm1\u0027,"},{"line_number":328,"context_line":"                                        \u0027external_ids\u0027:"},{"line_number":329,"context_line":"                                                 {\"neutron:fip_id\":\"fip4\"}}"},{"line_number":330,"context_line":"                                        ]}]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.lswitches_with_ports \u003d [{\u0027name\u0027: \u0027neutron-n1\u0027,"},{"line_number":333,"context_line":"                                      \u0027ports\u0027: [\u0027p1n1\u0027, \u0027p3n1\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"4249a52e_3c50ac38","line":330,"in_reply_to":"159d3fee_668c2b14","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E124 closing bracket does not match visual indentation\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":811,"context_line":"        del_floating_ip_list \u003d [{\u0027logical_ip\u0027: \u0027172.16.1.11\u0027,"},{"line_number":812,"context_line":"                                 \u0027external_ip\u0027: \u002790.0.0.11\u0027,"},{"line_number":813,"context_line":"                                 \u0027type\u0027: \u0027dnat_and_snat\u0027,"},{"line_number":814,"context_line":"                                 \u0027external_ids\u0027: {\"neutron:fip_id\":\"fip5\"}},"},{"line_number":815,"context_line":"                                {\u0027logical_ip\u0027: \u0027192.168.2.11\u0027,"},{"line_number":816,"context_line":"                                 \u0027external_ip\u0027: \u0027100.0.0.11\u0027,"},{"line_number":817,"context_line":"                                 \u0027type\u0027: \u0027dnat_and_snat\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7dd7cd0d_fd819996","line":814,"in_reply_to":"609f8b63_e1a3314f","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E231 missing whitespace after \u0027:\u0027\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"},{"author":{"_account_id":35432,"name":"Roberto Acosta","display_name":"rbartzen","email":"rbartzen@gmail.com","username":"rbartzen"},"change_message_id":"ebc66499c0d782566b26feada8fac12b8a89065f","unresolved":false,"context_lines":[{"line_number":817,"context_line":"                                 \u0027type\u0027: \u0027dnat_and_snat\u0027,"},{"line_number":818,"context_line":"                                 \u0027external_mac\u0027: \u002701:02:03:04:05:06\u0027,"},{"line_number":819,"context_line":"                                 \u0027logical_port\u0027: \u0027vm1\u0027,"},{"line_number":820,"context_line":"                                 \u0027external_ids\u0027: {\"neutron:fip_id\":\"fip4\"}}]"},{"line_number":821,"context_line":""},{"line_number":822,"context_line":"        del_router_list \u003d [{\u0027router\u0027: \u0027neutron-r3\u0027}]"},{"line_number":823,"context_line":"        del_router_port_list \u003d [{\u0027id\u0027: \u0027lrp-p3r1\u0027, \u0027router\u0027: \u0027neutron-r1\u0027}]"}],"source_content_type":"text/x-python","patch_set":2,"id":"34a7ff27_535ba35f","line":820,"in_reply_to":"fa464e28_818d4a79","updated":"2022-12-13 21:15:16.000000000","message":"\u003e pep8: E231 missing whitespace after \u0027:\u0027\n\nPlease fix.","commit_id":"06c304975b835ab6eee36cf05f45c15735d29a20"}]}
