)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ca18ae4c82c00589e036b8e7f0ac37c65502cd88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e4ff9d27_1cec376c","updated":"2025-06-25 15:03:49.000000000","message":"recheck neutron-tempest-plugin-openvswitch","commit_id":"811677a832f2124ba68bb9a3ba0a8ea5511c2d53"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4f44fa87f2f84974685bb4747191aff22e8907a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"ad35bf1e_676d4445","updated":"2025-06-27 11:33:01.000000000","message":"recheck neutron-fullstack","commit_id":"575f3b2e09f4ef54792d50f6ada3a8a323e2aa74"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3c54dc4ea11c31b7a2eebfb7a7df396e5f4b8f04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"2f0b5ec6_c9b19316","updated":"2025-06-27 15:22:18.000000000","message":"recheck neutron-functional","commit_id":"e940cbf4b137a609b309d6b4ebd99d32bce18972"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5300a4ef4fdab4b3588854f4b87a673e2673d63f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"879866f5_5fb708d1","updated":"2025-07-14 15:04:23.000000000","message":"ping fellow reviewers","commit_id":"2145901d6f262f6014e3fc996309ce82881af0a4"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"15aa61f1304672f715afe39f6034eae2e28d50e4","unresolved":true,"context_lines":[{"line_number":1386,"context_line":"                  str(datetime.now()))"},{"line_number":1387,"context_line":""},{"line_number":1388,"context_line":"    def sync_fip_dnat_rules(self):"},{"line_number":1389,"context_line":"        \"\"\"Sync all FIPs DNAT rules, setting the configured stateless option\"\"\""},{"line_number":1390,"context_line":"        stateless_nat \u003d (\u0027true\u0027 if ovn_conf.is_stateless_nat_enabled() else"},{"line_number":1391,"context_line":"                         \u0027false\u0027)"},{"line_number":1392,"context_line":"        nat_rules \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"84828cd2_d7815134","line":1389,"updated":"2025-06-22 19:16:16.000000000","message":"This also needs a \u0027started at\u0027 debug message to match all the others above.\n\nLOG.debug(\u0027OVN-NB Sync Floating IP NAT rules started @ %s\u0027,\n          str(datetime.now()))","commit_id":"39aa67281be04fcaf87cd10a16214f7a167a894b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"acd0d59f566efdf5497e5d299602b23fe35b56ab","unresolved":false,"context_lines":[{"line_number":1386,"context_line":"                  str(datetime.now()))"},{"line_number":1387,"context_line":""},{"line_number":1388,"context_line":"    def sync_fip_dnat_rules(self):"},{"line_number":1389,"context_line":"        \"\"\"Sync all FIPs DNAT rules, setting the configured stateless option\"\"\""},{"line_number":1390,"context_line":"        stateless_nat \u003d (\u0027true\u0027 if ovn_conf.is_stateless_nat_enabled() else"},{"line_number":1391,"context_line":"                         \u0027false\u0027)"},{"line_number":1392,"context_line":"        nat_rules \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"2cac0cac_6a23885b","line":1389,"in_reply_to":"84828cd2_d7815134","updated":"2025-06-23 09:33:48.000000000","message":"Done","commit_id":"39aa67281be04fcaf87cd10a16214f7a167a894b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"15aa61f1304672f715afe39f6034eae2e28d50e4","unresolved":true,"context_lines":[{"line_number":1401,"context_line":"                    (\u0027options\u0027, {\u0027stateless\u0027: stateless_nat})))"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"        LOG.debug(\u0027OVN-NB Sync Floating IP NAT rules completed @ %s\u0027,"},{"line_number":1404,"context_line":"                  str(datetime.now()))"},{"line_number":1405,"context_line":""},{"line_number":1406,"context_line":""},{"line_number":1407,"context_line":"class OvnSbSynchronizer(OvnDbSynchronizer):"}],"source_content_type":"text/x-python","patch_set":8,"id":"92b80194_eb695016","line":1404,"updated":"2025-06-22 19:16:16.000000000","message":"The one thing this doesn\u0027t do is ever look at the mode it\u0027s being run in:\n\nif self.mode \u003d\u003d ovn_const.OVN_DB_SYNC_MODE_REPAIR:\n\nMost methods here (except for the qos above?) will log something, then fix if in repair mode. We should probably log the number of rules that need updating, but only sync if repair mode.","commit_id":"39aa67281be04fcaf87cd10a16214f7a167a894b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"acd0d59f566efdf5497e5d299602b23fe35b56ab","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"                    (\u0027options\u0027, {\u0027stateless\u0027: stateless_nat})))"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"        LOG.debug(\u0027OVN-NB Sync Floating IP NAT rules completed @ %s\u0027,"},{"line_number":1404,"context_line":"                  str(datetime.now()))"},{"line_number":1405,"context_line":""},{"line_number":1406,"context_line":""},{"line_number":1407,"context_line":"class OvnSbSynchronizer(OvnDbSynchronizer):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ab960c7_2607aa59","line":1404,"in_reply_to":"92b80194_eb695016","updated":"2025-06-23 09:33:48.000000000","message":"Right, not only I need to solve this one but also fix the QoS ones. Thanks for spotting that. I\u0027ll open a LP right now.","commit_id":"39aa67281be04fcaf87cd10a16214f7a167a894b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"62242207f0fba620f11b75c5a3b41449f2c363d8","unresolved":true,"context_lines":[{"line_number":1400,"context_line":"                nat_rules.append(nat_rule)"},{"line_number":1401,"context_line":""},{"line_number":1402,"context_line":"        with self.ovn_api.transaction(check_error\u003dTrue) as txn:"},{"line_number":1403,"context_line":"            for nat_rule in nat_rules:"},{"line_number":1404,"context_line":"                txn.add(self.ovn_api.db_set("},{"line_number":1405,"context_line":"                    \u0027NAT\u0027, nat_rule[\u0027_uuid\u0027],"},{"line_number":1406,"context_line":"                    (\u0027options\u0027, {\u0027stateless\u0027: stateless_nat})))"}],"source_content_type":"text/x-python","patch_set":9,"id":"604fe704_4d4855e5","line":1403,"updated":"2025-06-23 18:09:59.000000000","message":"So I think it might be useful to log a warning here for each entry, and then only add the transaction if in repair mode, that way if running in log mode the user knows there is work to do.\n\nFor a reference see L1249-1255 above.\n\nWe\u0027d then remove the early return at the beginning of this method.","commit_id":"b0b9c202003fad742d8262d1332f9d85fb9fdb96"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"18ca18168537a3bfff21202d8270081205223c95","unresolved":false,"context_lines":[{"line_number":1400,"context_line":"                nat_rules.append(nat_rule)"},{"line_number":1401,"context_line":""},{"line_number":1402,"context_line":"        with self.ovn_api.transaction(check_error\u003dTrue) as txn:"},{"line_number":1403,"context_line":"            for nat_rule in nat_rules:"},{"line_number":1404,"context_line":"                txn.add(self.ovn_api.db_set("},{"line_number":1405,"context_line":"                    \u0027NAT\u0027, nat_rule[\u0027_uuid\u0027],"},{"line_number":1406,"context_line":"                    (\u0027options\u0027, {\u0027stateless\u0027: stateless_nat})))"}],"source_content_type":"text/x-python","patch_set":9,"id":"f7a2cb2e_e4edbc3f","line":1403,"in_reply_to":"604fe704_4d4855e5","updated":"2025-06-25 10:09:43.000000000","message":"I don\u0027t think so in this case. All FIP DNAT rules must be synced if the ``stateless_nat_enabled`` is changed. That means all FIP DNAT rules will have the incorrect value until we change it. Again, if we change it back, all DNAT rules will be updated again.\n\nInstead of this, we can just inform if the OVN database needs an update or not.\n\nBTW, this method must be called from the maintenance class too. I\u0027ll update it.","commit_id":"b0b9c202003fad742d8262d1332f9d85fb9fdb96"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d7a68f25338750a750b56bb519ebfa28034e2d29","unresolved":false,"context_lines":[{"line_number":1400,"context_line":"                nat_rules.append(nat_rule)"},{"line_number":1401,"context_line":""},{"line_number":1402,"context_line":"        with self.ovn_api.transaction(check_error\u003dTrue) as txn:"},{"line_number":1403,"context_line":"            for nat_rule in nat_rules:"},{"line_number":1404,"context_line":"                txn.add(self.ovn_api.db_set("},{"line_number":1405,"context_line":"                    \u0027NAT\u0027, nat_rule[\u0027_uuid\u0027],"},{"line_number":1406,"context_line":"                    (\u0027options\u0027, {\u0027stateless\u0027: stateless_nat})))"}],"source_content_type":"text/x-python","patch_set":9,"id":"17c7d3dc_0cb0b064","line":1403,"in_reply_to":"f7a2cb2e_e4edbc3f","updated":"2025-06-25 10:37:09.000000000","message":"Actually I\u0027ve done a mistake in the current code and my previous comment. This method is always called in the maintenance method. What I need to do is to always repair the DB when this method is called from the maintenance class.","commit_id":"b0b9c202003fad742d8262d1332f9d85fb9fdb96"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"de296c61b36cbe3187352a148dcd355585f07989","unresolved":true,"context_lines":[{"line_number":1403,"context_line":"            pass"},{"line_number":1404,"context_line":"        elif not (self.mode \u003d\u003d ovn_const.OVN_DB_SYNC_MODE_REPAIR or"},{"line_number":1405,"context_line":"                  self.is_maintenance):"},{"line_number":1406,"context_line":"            LOG.warning(\u0027The floating IP DNAT rules must be updated to match \u0027"},{"line_number":1407,"context_line":"                        \u0027the ``stateless_nat_enabled`` configuration flag.\u0027)"},{"line_number":1408,"context_line":"        else:"},{"line_number":1409,"context_line":"            with self.ovn_api.transaction(check_error\u003dTrue) as txn:"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f733f91_3ed01861","line":1406,"range":{"start_line":1406,"start_character":29,"end_line":1406,"end_character":45},"updated":"2025-07-02 19:38:40.000000000","message":"nit: s/Floating IP NAT\n\nso it matches the start/end strings","commit_id":"e940cbf4b137a609b309d6b4ebd99d32bce18972"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"199828fec09c357efcf08ec4763a9789de8c7aef","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"            pass"},{"line_number":1404,"context_line":"        elif not (self.mode \u003d\u003d ovn_const.OVN_DB_SYNC_MODE_REPAIR or"},{"line_number":1405,"context_line":"                  self.is_maintenance):"},{"line_number":1406,"context_line":"            LOG.warning(\u0027The floating IP DNAT rules must be updated to match \u0027"},{"line_number":1407,"context_line":"                        \u0027the ``stateless_nat_enabled`` configuration flag.\u0027)"},{"line_number":1408,"context_line":"        else:"},{"line_number":1409,"context_line":"            with self.ovn_api.transaction(check_error\u003dTrue) as txn:"}],"source_content_type":"text/x-python","patch_set":13,"id":"0833dbb7_de02fb47","line":1406,"range":{"start_line":1406,"start_character":29,"end_line":1406,"end_character":45},"in_reply_to":"7f733f91_3ed01861","updated":"2025-07-07 09:36:22.000000000","message":"Right. Actually the FIP NAT rules are DNAT, but this is talking about the OVN `NAT` registers. I\u0027ll update it.","commit_id":"e940cbf4b137a609b309d6b4ebd99d32bce18972"}],"releasenotes/notes/ovn-fip-stateless-nat-403d2dec7a480aae.yaml":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"15aa61f1304672f715afe39f6034eae2e28d50e4","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    ``[ovn]stateless_nat_enabled``. By default, this option is disabled,"},{"line_number":7,"context_line":"    keeping the current behaviour. This functionality improves the performance"},{"line_number":8,"context_line":"    in some deployments (DPDK based, for example) by avoiding hitting"},{"line_number":9,"context_line":"    conntrack."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"c57cd925_b9b4df85","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":13},"updated":"2025-06-22 19:16:16.000000000","message":"nit: conntrack OVN actions ?","commit_id":"39aa67281be04fcaf87cd10a16214f7a167a894b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"acd0d59f566efdf5497e5d299602b23fe35b56ab","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    ``[ovn]stateless_nat_enabled``. By default, this option is disabled,"},{"line_number":7,"context_line":"    keeping the current behaviour. This functionality improves the performance"},{"line_number":8,"context_line":"    in some deployments (DPDK based, for example) by avoiding hitting"},{"line_number":9,"context_line":"    conntrack."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"4470de95_5ceb862a","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":13},"in_reply_to":"c57cd925_b9b4df85","updated":"2025-06-23 09:33:48.000000000","message":"Done","commit_id":"39aa67281be04fcaf87cd10a16214f7a167a894b"}],"tox.ini":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"3c04fcd810f9c5b679cc9d7b0b1173eb1132e901","unresolved":true,"context_lines":[{"line_number":181,"context_line":"commands \u003d"},{"line_number":182,"context_line":"  stestr run --no-subunit-trace {posargs}"},{"line_number":183,"context_line":"  coverage combine"},{"line_number":184,"context_line":"  coverage report --fail-under\u003d78 --skip-covered"},{"line_number":185,"context_line":"  coverage html -d cover"},{"line_number":186,"context_line":"  coverage xml -o cover/coverage.xml"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-properties","patch_set":11,"id":"cbd4a941_551f08dd","line":184,"range":{"start_line":184,"start_character":31,"end_line":184,"end_character":33},"updated":"2025-06-26 11:50:58.000000000","message":"In https://review.opendev.org/c/openstack/neutron/+/952977 Takashi sets this value to 80 😊","commit_id":"1a1c89258db1228aa1a95cfb36fa88a78750b532"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ac265f26ea0b76f87f6de00e2d0f6cb1cc0c2e19","unresolved":false,"context_lines":[{"line_number":181,"context_line":"commands \u003d"},{"line_number":182,"context_line":"  stestr run --no-subunit-trace {posargs}"},{"line_number":183,"context_line":"  coverage combine"},{"line_number":184,"context_line":"  coverage report --fail-under\u003d78 --skip-covered"},{"line_number":185,"context_line":"  coverage html -d cover"},{"line_number":186,"context_line":"  coverage xml -o cover/coverage.xml"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-properties","patch_set":11,"id":"3c55401d_65ef5d6d","line":184,"range":{"start_line":184,"start_character":31,"end_line":184,"end_character":33},"in_reply_to":"cbd4a941_551f08dd","updated":"2025-06-27 08:25:18.000000000","message":"I\u0027ll update this value to 80, but eventually if we tend to implement FTs instead of UTs (something that I prefer), this value should be lowered again.","commit_id":"1a1c89258db1228aa1a95cfb36fa88a78750b532"}]}
