)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"59e0ee3311de64e8b02c86aa3786762e59b9f540","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Bence Romsics \u003cbence.romsics@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-04-12 13:34:19 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"port-hint-ovs-tx-steering: agent side"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I1106bc03061fd62e9baadadbe2bb4aaa8c3a6b1d"},{"line_number":10,"context_line":"Partially-Implements: #1990842"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"43f8b8e8_28d0f267","line":7,"updated":"2023-04-14 12:51:21.000000000","message":"I would suggest to update a bit more the commit message and description.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"e24af1440c3f6e27ab48f92b9dabd95704d91c08","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bence Romsics \u003cbence.romsics@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-04-12 13:34:19 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"port-hint-ovs-tx-steering: agent side"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I1106bc03061fd62e9baadadbe2bb4aaa8c3a6b1d"},{"line_number":10,"context_line":"Partially-Implements: #1990842"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"53210359_dde735ee","line":7,"in_reply_to":"43f8b8e8_28d0f267","updated":"2023-04-17 13:28:21.000000000","message":"Done","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bdd2476d74551a724f75a4b3ae2bf3a14a48e690","unresolved":true,"context_lines":[{"line_number":10,"context_line":"ovs `other_config` accordingly."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1106bc03061fd62e9baadadbe2bb4aaa8c3a6b1d"},{"line_number":13,"context_line":"Partially-Implements: #1990842"},{"line_number":14,"context_line":"Related-Change (spec): https://review.opendev.org/c/openstack/neutron-specs/+/862133"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"d0982bf7_55c4125b","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":30},"updated":"2023-04-17 15:28:21.000000000","message":"nit: this tag doesn\u0027t create the link, I think you should use Partial-Bug: #1990842","commit_id":"f9ec0439fda0e8d22078128590bce54e0df6af1e"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"59c02e561c6f5d89cb45090384eeb6ce9118fbd8","unresolved":false,"context_lines":[{"line_number":10,"context_line":"ovs `other_config` accordingly."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1106bc03061fd62e9baadadbe2bb4aaa8c3a6b1d"},{"line_number":13,"context_line":"Partially-Implements: #1990842"},{"line_number":14,"context_line":"Related-Change (spec): https://review.opendev.org/c/openstack/neutron-specs/+/862133"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"b6fb53cf_52af3be0","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":30},"in_reply_to":"d0982bf7_55c4125b","updated":"2023-04-18 13:16:43.000000000","message":"Done","commit_id":"f9ec0439fda0e8d22078128590bce54e0df6af1e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8785bdf6aa8b76abe8b4256caaac9b1b912d3f66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"20a29b72_b45af1f6","updated":"2023-03-14 13:03:55.000000000","message":"Thanks, I tested it, when the previous patch is accepted we can move on with it I think","commit_id":"3a03848e2fcd30721c901b968fe335ef1ad1bcc4"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"ecf44592e30b1dbbd8387e908f7bfb51d99040de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bc4e1716_686bd823","updated":"2023-03-02 09:03:40.000000000","message":"recheck unrelated tempest timeout","commit_id":"3a03848e2fcd30721c901b968fe335ef1ad1bcc4"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"198a2d5ec755cafbdfd6969aa231a5ccc57d28de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1a61936b_96c2cb30","updated":"2023-03-28 08:33:56.000000000","message":"Thanks Bence. I\u0027m putting -1 but most for the code looks good, feel free to let me know if I was wrong on something.","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bdd2476d74551a724f75a4b3ae2bf3a14a48e690","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"df747ffc_5cfb9cc0","updated":"2023-04-17 15:28:21.000000000","message":"Looks ok, waiting for the CI","commit_id":"f9ec0439fda0e8d22078128590bce54e0df6af1e"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c832d554c55fd2d954abc2da992dd6897e7c367f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"31a0f862_98a8f14d","updated":"2023-04-18 15:14:12.000000000","message":"As discussed on IRC let\u0027s move on it, the implementation is working and we can improve code if needed in future. Thank you Bence for your time !","commit_id":"b2ebb1d4106a45f3ea52a7b8247270df82642fa3"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"ddfd29d9648c6a973a9f5520c4735d38e852c7e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"811ad090_bf9a616e","updated":"2023-05-03 11:24:43.000000000","message":"recheck https://bugs.launchpad.net/neutron/+bug/2017992","commit_id":"e7e30010ba6eaf2a9b782372ac46039ab4173707"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"379e9039dcf984b54e661fea90e4dfca0021e861","unresolved":true,"context_lines":[{"line_number":1246,"context_line":"            try:"},{"line_number":1247,"context_line":"                # Apply port hints"},{"line_number":1248,"context_line":"                to_set \u003d self.sanitize_ovs_iface_other_config("},{"line_number":1249,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1250,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1251,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1252,"context_line":"                LOG.info("}],"source_content_type":"text/x-python","patch_set":6,"id":"326d1bc7_ac468bb7","line":1249,"updated":"2023-02-15 11:17:43.000000000","message":"When this raises, we should call clear_db_attribute() otherwise update to empty hints is not working.","commit_id":"bb41ed9beb2496fe6d669718ac39dec97412777a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"029593cda735956c0ec157cd74c44c001b5e37d3","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"            try:"},{"line_number":1247,"context_line":"                # Apply port hints"},{"line_number":1248,"context_line":"                to_set \u003d self.sanitize_ovs_iface_other_config("},{"line_number":1249,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1250,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1251,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1252,"context_line":"                LOG.info("}],"source_content_type":"text/x-python","patch_set":6,"id":"ada73698_8ba68b54","line":1249,"in_reply_to":"326d1bc7_ac468bb7","updated":"2023-02-15 14:45:02.000000000","message":"Done","commit_id":"bb41ed9beb2496fe6d669718ac39dec97412777a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"55b540a0f28b3759e647efba4f8b750cc4e69b94","unresolved":true,"context_lines":[{"line_number":1323,"context_line":"            if other_config[\u0027tx-steering\u0027] in (\u0027hash\u0027, \u0027thread\u0027):"},{"line_number":1324,"context_line":"                output[\u0027tx-steering\u0027] \u003d other_config[\u0027tx-steering\u0027]"},{"line_number":1325,"context_line":"        if other_config !\u003d output:"},{"line_number":1326,"context_line":"            LOG.warning("},{"line_number":1327,"context_line":"                \u0027Got unexpected other_config, using sanitized version!\u0027"},{"line_number":1328,"context_line":"                \u0027 got\u003d%s sanitized\u003d%s\u0027, other_config, output,"},{"line_number":1329,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":7,"id":"928985ba_b20fd86b","line":1326,"range":{"start_line":1326,"start_character":16,"end_line":1326,"end_character":23},"updated":"2023-02-16 13:25:29.000000000","message":"This should be LOG.error().","commit_id":"a6f833406e3d064b60b1a32b8b5a2a354e4bd068"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"943381028ef63ca401cc5d00f43986100191f232","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"            if other_config[\u0027tx-steering\u0027] in (\u0027hash\u0027, \u0027thread\u0027):"},{"line_number":1324,"context_line":"                output[\u0027tx-steering\u0027] \u003d other_config[\u0027tx-steering\u0027]"},{"line_number":1325,"context_line":"        if other_config !\u003d output:"},{"line_number":1326,"context_line":"            LOG.warning("},{"line_number":1327,"context_line":"                \u0027Got unexpected other_config, using sanitized version!\u0027"},{"line_number":1328,"context_line":"                \u0027 got\u003d%s sanitized\u003d%s\u0027, other_config, output,"},{"line_number":1329,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":7,"id":"d8f6272b_e4dd2d69","line":1326,"range":{"start_line":1326,"start_character":16,"end_line":1326,"end_character":23},"in_reply_to":"928985ba_b20fd86b","updated":"2023-02-17 14:29:14.000000000","message":"Done","commit_id":"a6f833406e3d064b60b1a32b8b5a2a354e4bd068"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"198a2d5ec755cafbdfd6969aa231a5ccc57d28de","unresolved":true,"context_lines":[{"line_number":1248,"context_line":"                                                   port, port_detail)"},{"line_number":1249,"context_line":"            # Apply port hints"},{"line_number":1250,"context_line":"            try:"},{"line_number":1251,"context_line":"                to_set \u003d self.sanitize_ovs_iface_other_config("},{"line_number":1252,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1253,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1254,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"}],"source_content_type":"text/x-python","patch_set":12,"id":"d9036a25_3e7dede2","line":1251,"updated":"2023-03-28 08:33:56.000000000","message":"It seems that this can be outside of the try..except","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"b26eea12b678940b64680fddaa835b4c6ce2886b","unresolved":false,"context_lines":[{"line_number":1248,"context_line":"                                                   port, port_detail)"},{"line_number":1249,"context_line":"            # Apply port hints"},{"line_number":1250,"context_line":"            try:"},{"line_number":1251,"context_line":"                to_set \u003d self.sanitize_ovs_iface_other_config("},{"line_number":1252,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1253,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1254,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"}],"source_content_type":"text/x-python","patch_set":12,"id":"4cd18e05_8f0b1d21","line":1251,"in_reply_to":"d9036a25_3e7dede2","updated":"2023-03-30 12:25:47.000000000","message":"Not really, please see line 1255.","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"198a2d5ec755cafbdfd6969aa231a5ccc57d28de","unresolved":true,"context_lines":[{"line_number":1252,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1253,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1254,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1255,"context_line":"            except (KeyError, TypeError):"},{"line_number":1256,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1257,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1258,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3434fa12_20b3d013","line":1255,"updated":"2023-03-28 08:33:56.000000000","message":"What is returning a KeyError or TypeEror I don\u0027t see any test for this case, right?","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"b26eea12b678940b64680fddaa835b4c6ce2886b","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1253,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1254,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1255,"context_line":"            except (KeyError, TypeError):"},{"line_number":1256,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1257,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1258,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5706e79b_290094f9","line":1255,"in_reply_to":"3434fa12_20b3d013","updated":"2023-03-30 12:25:47.000000000","message":"The evaluation of this expression: port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027]\n\nI just shortened this: if \u0027hints\u0027 in port_detail and \u0027openvswitch\u0027 in port_detail[\u0027hints\u0027] ...","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"198a2d5ec755cafbdfd6969aa231a5ccc57d28de","unresolved":true,"context_lines":[{"line_number":1322,"context_line":"        we consider accepted. Log if the output differs from the input."},{"line_number":1323,"context_line":"        \u0027\u0027\u0027"},{"line_number":1324,"context_line":"        output \u003d {}"},{"line_number":1325,"context_line":"        if \u0027tx-steering\u0027 in other_config:"},{"line_number":1326,"context_line":"            if other_config[\u0027tx-steering\u0027] in (\u0027hash\u0027, \u0027thread\u0027):"},{"line_number":1327,"context_line":"                output[\u0027tx-steering\u0027] \u003d other_config[\u0027tx-steering\u0027]"},{"line_number":1328,"context_line":"        if other_config !\u003d output:"}],"source_content_type":"text/x-python","patch_set":12,"id":"30a8c121_e66cc80f","line":1325,"updated":"2023-03-28 08:33:56.000000000","message":"I think all of these names should be declared as constants\n\nPORT_HINTS_TX_STEERING\nPORT_HINTS_TX_STEERING_HAS\nPORT_HINTS_TX_STEERING_THREAD","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"b26eea12b678940b64680fddaa835b4c6ce2886b","unresolved":false,"context_lines":[{"line_number":1322,"context_line":"        we consider accepted. Log if the output differs from the input."},{"line_number":1323,"context_line":"        \u0027\u0027\u0027"},{"line_number":1324,"context_line":"        output \u003d {}"},{"line_number":1325,"context_line":"        if \u0027tx-steering\u0027 in other_config:"},{"line_number":1326,"context_line":"            if other_config[\u0027tx-steering\u0027] in (\u0027hash\u0027, \u0027thread\u0027):"},{"line_number":1327,"context_line":"                output[\u0027tx-steering\u0027] \u003d other_config[\u0027tx-steering\u0027]"},{"line_number":1328,"context_line":"        if other_config !\u003d output:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5407fa14_a8df9fe0","line":1325,"in_reply_to":"30a8c121_e66cc80f","updated":"2023-03-30 12:25:47.000000000","message":"Done","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"198a2d5ec755cafbdfd6969aa231a5ccc57d28de","unresolved":true,"context_lines":[{"line_number":1326,"context_line":"            if other_config[\u0027tx-steering\u0027] in (\u0027hash\u0027, \u0027thread\u0027):"},{"line_number":1327,"context_line":"                output[\u0027tx-steering\u0027] \u003d other_config[\u0027tx-steering\u0027]"},{"line_number":1328,"context_line":"        if other_config !\u003d output:"},{"line_number":1329,"context_line":"            LOG.error("},{"line_number":1330,"context_line":"                \u0027Got unexpected other_config, using sanitized version!\u0027"},{"line_number":1331,"context_line":"                \u0027 got\u003d%s sanitized\u003d%s\u0027, other_config, output,"},{"line_number":1332,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":12,"id":"7d529b1a_7d8890d4","line":1329,"updated":"2023-03-28 08:33:56.000000000","message":"In the spec we are mentioning that this case should not be considered as error. I would have used Warning.","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"b26eea12b678940b64680fddaa835b4c6ce2886b","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"            if other_config[\u0027tx-steering\u0027] in (\u0027hash\u0027, \u0027thread\u0027):"},{"line_number":1327,"context_line":"                output[\u0027tx-steering\u0027] \u003d other_config[\u0027tx-steering\u0027]"},{"line_number":1328,"context_line":"        if other_config !\u003d output:"},{"line_number":1329,"context_line":"            LOG.error("},{"line_number":1330,"context_line":"                \u0027Got unexpected other_config, using sanitized version!\u0027"},{"line_number":1331,"context_line":"                \u0027 got\u003d%s sanitized\u003d%s\u0027, other_config, output,"},{"line_number":1332,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":12,"id":"0be633cf_d6c48d9c","line":1329,"in_reply_to":"7d529b1a_7d8890d4","updated":"2023-03-30 12:25:47.000000000","message":"Done","commit_id":"7cf7d0319f9df0efd583ed68cd865b79a56264b7"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"beffae50867cb5a8f66a4e25c9ef323aa244a197","unresolved":true,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"INIT_MAX_TRIES \u003d 3"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"PORT_HINTS_TX_STEERING \u003d \u0027tx-steering\u0027"},{"line_number":87,"context_line":"PORT_HINTS_TX_STEERING_HASH \u003d \u0027hash\u0027"},{"line_number":88,"context_line":"PORT_HINTS_TX_STEERING_THREAD \u003d \u0027thread\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ed9eae3_ddc61233","line":88,"range":{"start_line":86,"start_character":0,"end_line":88,"end_character":40},"updated":"2023-04-11 09:51:54.000000000","message":"Note/loud thinking: I think these can be left here, and don\u0027t need to move to neutron-lib, as only used here.","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"46e2404d2d472cccbc9cff9396e2c49d6108babc","unresolved":true,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"INIT_MAX_TRIES \u003d 3"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"PORT_HINTS_TX_STEERING \u003d \u0027tx-steering\u0027"},{"line_number":87,"context_line":"PORT_HINTS_TX_STEERING_HASH \u003d \u0027hash\u0027"},{"line_number":88,"context_line":"PORT_HINTS_TX_STEERING_THREAD \u003d \u0027thread\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":14,"id":"809d5d75_72f75ce2","line":88,"range":{"start_line":86,"start_character":0,"end_line":88,"end_character":40},"in_reply_to":"3ed9eae3_ddc61233","updated":"2023-04-11 10:50:37.000000000","message":"+1","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"e24af1440c3f6e27ab48f92b9dabd95704d91c08","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"INIT_MAX_TRIES \u003d 3"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"PORT_HINTS_TX_STEERING \u003d \u0027tx-steering\u0027"},{"line_number":87,"context_line":"PORT_HINTS_TX_STEERING_HASH \u003d \u0027hash\u0027"},{"line_number":88,"context_line":"PORT_HINTS_TX_STEERING_THREAD \u003d \u0027thread\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":14,"id":"e8032a64_636a1f07","line":88,"range":{"start_line":86,"start_character":0,"end_line":88,"end_character":40},"in_reply_to":"809d5d75_72f75ce2","updated":"2023-04-17 13:28:21.000000000","message":"Done","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"46e2404d2d472cccbc9cff9396e2c49d6108babc","unresolved":true,"context_lines":[{"line_number":1256,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1257,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1258,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1259,"context_line":"            except (KeyError, TypeError):"},{"line_number":1260,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1261,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1262,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":14,"id":"9d5d7c7b_8424343c","line":1259,"updated":"2023-04-11 10:50:37.000000000","message":"It\u0027s still no clear for me what can raise a KeyError or TypeError, could you illustrate that with tests and add comment here?\n\nWe are doing validation so all those keys should be always valid, right?\nport_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])\n\nOr I think we have to be more specific and say, if hints extension is activated, look into [\u0027hints\u0027], then [\u0027openvswitch\u0027][\u0027other_config\u0027] should always be valid. If it happens that they are KeyError we should log that as an error.\n\nFor the typeerror I don\u0027t know how it can come yet.","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b366ef8c62ac808218278ed72cad6629fca84a79","unresolved":true,"context_lines":[{"line_number":1256,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1257,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1258,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1259,"context_line":"            except (KeyError, TypeError):"},{"line_number":1260,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1261,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1262,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":14,"id":"196d13de_70be1cf3","line":1259,"in_reply_to":"00a80d36_dad3947c","updated":"2023-04-12 11:55:08.000000000","message":"OK so in both cases, in-sync or not. We should mever be in that situation of a KeyError or TypeError which certainly means that we should log something in not just silently continue","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"e24af1440c3f6e27ab48f92b9dabd95704d91c08","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1257,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1258,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1259,"context_line":"            except (KeyError, TypeError):"},{"line_number":1260,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1261,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1262,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":14,"id":"012e47b7_2ab81eb2","line":1259,"in_reply_to":"196d13de_70be1cf3","updated":"2023-04-17 13:28:21.000000000","message":"Please see the new tests I added and the answer just one line below.","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36803a80a6c89fb9d913a75114dbe24beb708b58","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"                    port_detail[\u0027hints\u0027][\u0027openvswitch\u0027][\u0027other_config\u0027])"},{"line_number":1257,"context_line":"                self.int_br.set_db_attribute("},{"line_number":1258,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027, to_set)"},{"line_number":1259,"context_line":"            except (KeyError, TypeError):"},{"line_number":1260,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1261,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1262,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":14,"id":"00a80d36_dad3947c","line":1259,"in_reply_to":"9d5d7c7b_8424343c","updated":"2023-04-12 11:35:30.000000000","message":"We have API validation in the server. Which for example may not be upgraded in sync with the agent. Usually I don\u0027t mind having some extra input validation, when it\u0027s in different components.\n\nAn easy example for TypeError being raised is when a value in the outer dicts is None and then we treat it as a dict.","commit_id":"9c024b1e27d31d5f74668ba2d46dc36aeb697438"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b366ef8c62ac808218278ed72cad6629fca84a79","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            #     * invalid key: KeyError"},{"line_number":1263,"context_line":"            #     * anything that\u0027s not a dict in hints, like None: TypeError"},{"line_number":1264,"context_line":"            except (KeyError, TypeError):"},{"line_number":1265,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1266,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1267,"context_line":"            finally:"},{"line_number":1268,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":15,"id":"2971e80e_a71e850c","line":1265,"updated":"2023-04-12 11:55:08.000000000","message":"Can you add a warning here and I think we should be good. I\u0027m very sorry to annoying you but we can\u0027t really silently move forward as it is never expected to have those exceptions raised.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c33a5124e303e55417f7065ac1be18e301260c86","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            #     * invalid key: KeyError"},{"line_number":1263,"context_line":"            #     * anything that\u0027s not a dict in hints, like None: TypeError"},{"line_number":1264,"context_line":"            except (KeyError, TypeError):"},{"line_number":1265,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1266,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1267,"context_line":"            finally:"},{"line_number":1268,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":15,"id":"2a6a2653_f641f9e7","line":1265,"in_reply_to":"012160c8_1d688c40","updated":"2023-04-18 14:39:25.000000000","message":"\u003e By the spec (https://review.opendev.org/c/openstack/neutron-specs/+/879043/2/specs/2023.1/ovs-tx-steering.rst#58 ) in case the setting of hint s by OVS is failed the error is not returned, nor the port is set to failed state, as the hints setting are optional, and the mech driver can even ignore it if it can\u0027t set it.\n\nRight, my understanding is that we don\u0027t want to block the process of port creation.\n\nI feel like such experience is not so great for end-user as it will not know whether he has made a simple typo. The feature will just not work (not be activated).\n\n\u003e That\u0027s why this agent tries to look up the other_config part of the hints field without any validation. That\u0027s why here we sanitize other_config (and log when we find unexpected other_config). All the rest should be (and already is) validated in the server and/or other mech_drivers/agents.\n\nIf you are sure of that the KeyError will never appear so my thinking is that we should not try to catch it. If there are some unexpected cases, they should be IMO logged.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"2b339fd3ef44760e9dc32b1acc134d5ae121cf60","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            #     * invalid key: KeyError"},{"line_number":1263,"context_line":"            #     * anything that\u0027s not a dict in hints, like None: TypeError"},{"line_number":1264,"context_line":"            except (KeyError, TypeError):"},{"line_number":1265,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1266,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1267,"context_line":"            finally:"},{"line_number":1268,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":15,"id":"76b42317_b39e5992","line":1265,"in_reply_to":"2971e80e_a71e850c","updated":"2023-04-12 14:40:50.000000000","message":"When the hints attribute is updated to empty (i.e. when hints are deleted), this is an expected execution branch.\n\nWhen we receive any invalid input, that\u0027s already logged (at warning level) from sanitize_ovs_iface_other_config().\n\nSo I\u0027m not sure what to add here.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"1856b009e99db97badb305e31efd0a1af6fd0e9d","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            #     * invalid key: KeyError"},{"line_number":1263,"context_line":"            #     * anything that\u0027s not a dict in hints, like None: TypeError"},{"line_number":1264,"context_line":"            except (KeyError, TypeError):"},{"line_number":1265,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1266,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1267,"context_line":"            finally:"},{"line_number":1268,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":15,"id":"af3fda77_d552b212","line":1265,"in_reply_to":"6c6e8b7a_79caee31","updated":"2023-04-17 07:51:07.000000000","message":"the code anyway will enter to finally and the debug log is there.\nBy the spec (https://review.opendev.org/c/openstack/neutron-specs/+/879043/2/specs/2023.1/ovs-tx-steering.rst#58 ) in case the setting of hint s by OVS is failed the error is not returned, nor the port is set to failed state, as the hints setting are optional, and the mech driver can even ignore it if it can\u0027t set it.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"59e0ee3311de64e8b02c86aa3786762e59b9f540","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            #     * invalid key: KeyError"},{"line_number":1263,"context_line":"            #     * anything that\u0027s not a dict in hints, like None: TypeError"},{"line_number":1264,"context_line":"            except (KeyError, TypeError):"},{"line_number":1265,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1266,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1267,"context_line":"            finally:"},{"line_number":1268,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":15,"id":"6c6e8b7a_79caee31","line":1265,"in_reply_to":"76b42317_b39e5992","updated":"2023-04-14 12:51:21.000000000","message":"I may missing something but nothing will be logged if there is a KeyError. The KeyError will happen before we enter in sanitize_ovs_iface_other_config().\n\nYou should at check minimum whether \u0027hints\u0027 exists. we should have something more specific than what there is currently to check the validity and report errors.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"e24af1440c3f6e27ab48f92b9dabd95704d91c08","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            #     * invalid key: KeyError"},{"line_number":1263,"context_line":"            #     * anything that\u0027s not a dict in hints, like None: TypeError"},{"line_number":1264,"context_line":"            except (KeyError, TypeError):"},{"line_number":1265,"context_line":"                self.int_br.clear_db_attribute("},{"line_number":1266,"context_line":"                    \u0027Interface\u0027, port.port_name, \u0027other_config\u0027)"},{"line_number":1267,"context_line":"            finally:"},{"line_number":1268,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":15,"id":"012160c8_1d688c40","line":1265,"in_reply_to":"af3fda77_d552b212","updated":"2023-04-17 13:28:21.000000000","message":"I started refactoring this code as suggested. While doing that I remembered/rediscovered the original reason to write it like this, which is the following and I believe it is still valid:\n\nneutron-server should and does validate the whole hints field. Parts of the hints field are used/interpreted by different mech_drivers and their agents. This agent is only responsible for the other_config part of the hints field and nothing else. In the future, the hints field could contain parts that are not meant for this component. Of which this component should know nothing. ovs-agent should not validate those parts, it should not log warnings about those.\n\nThat\u0027s why this agent tries to look up the other_config part of the hints field without any validation. That\u0027s why here we sanitize other_config (and log when we find unexpected other_config). All the rest should be (and already is) validated in the server and/or other mech_drivers/agents.","commit_id":"3564100dab3182d15b4e0b73556630031f01eb96"}]}
