)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":33341,"name":"Maor Blaustein","email":"mblue@redhat.com","username":"blue"},"change_message_id":"bec046be8eee798ec93ac925ed2e012bf40f2b38","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace crudini dependency with ConfigParser"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add helper methods that generate ConfigParser commands for config"},{"line_number":10,"context_line":"file operations and replace all crudini calls with new methods."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Assisted-by: Claude Code Sonnet 4.5"},{"line_number":13,"context_line":"Change-Id: I4afdaf89179b7de11f449266a709ba9b59db0803"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"93ecfd35_a8cc7fe2","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":63},"updated":"2026-01-12 15:05:27.000000000","message":"nit: could be useful having reference since it continues on purpose of past related change merged:\nhttps://review.opendev.org/c/x/whitebox-neutron-tempest-plugin/+/971055","commit_id":"5fc0d72231a17d136bb31478e35864417ce874da"},{"author":{"_account_id":37280,"name":"Renjing Xiao","display_name":"Renjing Xiao","email":"rxiao@redhat.com","username":"rxiao"},"change_message_id":"a135f3f72830ed626715c154e1ff9a62296e6782","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace crudini dependency with ConfigParser"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add helper methods that generate ConfigParser commands for config"},{"line_number":10,"context_line":"file operations and replace all crudini calls with new methods."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Assisted-by: Claude Code Sonnet 4.5"},{"line_number":13,"context_line":"Change-Id: I4afdaf89179b7de11f449266a709ba9b59db0803"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"414e32e8_d75e5820","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":63},"in_reply_to":"93ecfd35_a8cc7fe2","updated":"2026-01-14 09:20:46.000000000","message":"Done","commit_id":"5fc0d72231a17d136bb31478e35864417ce874da"},{"author":{"_account_id":37280,"name":"Renjing Xiao","display_name":"Renjing Xiao","email":"rxiao@redhat.com","username":"rxiao"},"change_message_id":"a135f3f72830ed626715c154e1ff9a62296e6782","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace crudini dependency with ConfigParser"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add helper methods that generate ConfigParser commands for config"},{"line_number":10,"context_line":"file operations and replace all crudini calls with new methods."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Assisted-by: Claude Code Sonnet 4.5"},{"line_number":13,"context_line":"Change-Id: I4afdaf89179b7de11f449266a709ba9b59db0803"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"876e5ec7_5aa91f84","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":63},"in_reply_to":"93ecfd35_a8cc7fe2","updated":"2026-01-14 09:20:46.000000000","message":"Done","commit_id":"5fc0d72231a17d136bb31478e35864417ce874da"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":33341,"name":"Maor Blaustein","email":"mblue@redhat.com","username":"blue"},"change_message_id":"e4557aaa37000ec7418d3bb899bf29489a9a3661","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ef28927b_c6b906a6","updated":"2026-01-14 13:31:19.000000000","message":"Thank you Renjing for the changes, looks good, left some feedback.","commit_id":"adb218f3c2b80b74563e5685fc721b8355282af3"},{"author":{"_account_id":33341,"name":"Maor Blaustein","email":"mblue@redhat.com","username":"blue"},"change_message_id":"616152eff5c5192bb6afdf4f2d7b5fd8ce7af9be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"379db14a_c20d1b39","updated":"2026-01-15 09:16:28.000000000","message":"LGTM, thanks","commit_id":"1f0b62987cc401dcba1baa9a58db2046f55921b2"}],"whitebox_neutron_tempest_plugin/common/utils.py":[{"author":{"_account_id":33341,"name":"Maor Blaustein","email":"mblue@redhat.com","username":"blue"},"change_message_id":"bec046be8eee798ec93ac925ed2e012bf40f2b38","unresolved":true,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def get_config_cmd(file, section, param, default\u003d\u0027\u0027):"},{"line_number":71,"context_line":"    return (f\"python3 -c \\\"import configparser; \""},{"line_number":72,"context_line":"            f\"cp\u003dconfigparser.ConfigParser(); cp.optionxform\u003dstr; \""},{"line_number":73,"context_line":"            f\"cp.read(\u0027{file}\u0027); \""},{"line_number":74,"context_line":"            f\"print(cp.get(\u0027{section}\u0027, \u0027{param}\u0027, fallback\u003d\u0027{default}\u0027))\\\"\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"283a8b14_5b93e5d4","line":71,"range":{"start_line":71,"start_character":14,"end_line":71,"end_character":21},"updated":"2026-01-12 15:05:27.000000000","message":"We already run python for test code executed, why run another python session there remotely limited by paramiko ssh client with less control over it, no configured tempest logs, and so on?","commit_id":"5fc0d72231a17d136bb31478e35864417ce874da"},{"author":{"_account_id":37280,"name":"Renjing Xiao","display_name":"Renjing Xiao","email":"rxiao@redhat.com","username":"rxiao"},"change_message_id":"a135f3f72830ed626715c154e1ff9a62296e6782","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def get_config_cmd(file, section, param, default\u003d\u0027\u0027):"},{"line_number":71,"context_line":"    return (f\"python3 -c \\\"import configparser; \""},{"line_number":72,"context_line":"            f\"cp\u003dconfigparser.ConfigParser(); cp.optionxform\u003dstr; \""},{"line_number":73,"context_line":"            f\"cp.read(\u0027{file}\u0027); \""},{"line_number":74,"context_line":"            f\"print(cp.get(\u0027{section}\u0027, \u0027{param}\u0027, fallback\u003d\u0027{default}\u0027))\\\"\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fe1275e_14863fea","line":71,"range":{"start_line":71,"start_character":14,"end_line":71,"end_character":21},"in_reply_to":"283a8b14_5b93e5d4","updated":"2026-01-14 09:20:46.000000000","message":"Done","commit_id":"5fc0d72231a17d136bb31478e35864417ce874da"},{"author":{"_account_id":37280,"name":"Renjing Xiao","display_name":"Renjing Xiao","email":"rxiao@redhat.com","username":"rxiao"},"change_message_id":"a135f3f72830ed626715c154e1ff9a62296e6782","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def get_config_cmd(file, section, param, default\u003d\u0027\u0027):"},{"line_number":71,"context_line":"    return (f\"python3 -c \\\"import configparser; \""},{"line_number":72,"context_line":"            f\"cp\u003dconfigparser.ConfigParser(); cp.optionxform\u003dstr; \""},{"line_number":73,"context_line":"            f\"cp.read(\u0027{file}\u0027); \""},{"line_number":74,"context_line":"            f\"print(cp.get(\u0027{section}\u0027, \u0027{param}\u0027, fallback\u003d\u0027{default}\u0027))\\\"\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"e02e2613_47d79f81","line":71,"range":{"start_line":71,"start_character":14,"end_line":71,"end_character":21},"in_reply_to":"283a8b14_5b93e5d4","updated":"2026-01-14 09:20:46.000000000","message":"Done","commit_id":"5fc0d72231a17d136bb31478e35864417ce874da"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c540264cc31bdfb279945ba84b7a567c00ab5025","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    if section !\u003d \u0027DEFAULT\u0027 and not cp.has_section(section):"},{"line_number":84,"context_line":"        cp.add_section(section)"},{"line_number":85,"context_line":"    cp.set(section, param, str(value))"},{"line_number":86,"context_line":"    buf \u003d io.StringIO()"},{"line_number":87,"context_line":"    cp.write(buf)"},{"line_number":88,"context_line":"    return buf.getvalue()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def del_config_value(content, section, param\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"371bee49_1e2f5298","line":88,"range":{"start_line":86,"start_character":4,"end_line":88,"end_character":25},"updated":"2026-01-14 09:38:47.000000000","message":"Usually io.StringIO() is safe to open and rely on the garbage collector to close it. But it is better if you do it explicitly:\n`\nwith io.StringIO() as buf:\n    cp.write(buf)\n    res \u003d buf.getvalue()\nreturn res\n`","commit_id":"5752732b7d9a889e6ffd50c792f413766f81c051"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"61b7894eb8a27e8dfd55a20b7c98160315f2d2c9","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    if section !\u003d \u0027DEFAULT\u0027 and not cp.has_section(section):"},{"line_number":84,"context_line":"        cp.add_section(section)"},{"line_number":85,"context_line":"    cp.set(section, param, str(value))"},{"line_number":86,"context_line":"    buf \u003d io.StringIO()"},{"line_number":87,"context_line":"    cp.write(buf)"},{"line_number":88,"context_line":"    return buf.getvalue()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def del_config_value(content, section, param\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"beea6abd_91ee11bb","line":88,"range":{"start_line":86,"start_character":4,"end_line":88,"end_character":25},"in_reply_to":"371bee49_1e2f5298","updated":"2026-01-14 09:51:17.000000000","message":"Done","commit_id":"5752732b7d9a889e6ffd50c792f413766f81c051"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c540264cc31bdfb279945ba84b7a567c00ab5025","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        cp.remove_option(section, param)"},{"line_number":97,"context_line":"    else:"},{"line_number":98,"context_line":"        cp.remove_section(section)"},{"line_number":99,"context_line":"    buf \u003d io.StringIO()"},{"line_number":100,"context_line":"    cp.write(buf)"},{"line_number":101,"context_line":"    return buf.getvalue()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def conf_action("}],"source_content_type":"text/x-python","patch_set":3,"id":"4e0b6f15_b42d25e5","line":101,"range":{"start_line":99,"start_character":3,"end_line":101,"end_character":25},"updated":"2026-01-14 09:38:47.000000000","message":"ditto","commit_id":"5752732b7d9a889e6ffd50c792f413766f81c051"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"61b7894eb8a27e8dfd55a20b7c98160315f2d2c9","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        cp.remove_option(section, param)"},{"line_number":97,"context_line":"    else:"},{"line_number":98,"context_line":"        cp.remove_section(section)"},{"line_number":99,"context_line":"    buf \u003d io.StringIO()"},{"line_number":100,"context_line":"    cp.write(buf)"},{"line_number":101,"context_line":"    return buf.getvalue()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def conf_action("}],"source_content_type":"text/x-python","patch_set":3,"id":"96683fd3_f271ab6f","line":101,"range":{"start_line":99,"start_character":3,"end_line":101,"end_character":25},"in_reply_to":"4e0b6f15_b42d25e5","updated":"2026-01-14 09:51:17.000000000","message":"Done","commit_id":"5752732b7d9a889e6ffd50c792f413766f81c051"},{"author":{"_account_id":33341,"name":"Maor Blaustein","email":"mblue@redhat.com","username":"blue"},"change_message_id":"e4557aaa37000ec7418d3bb899bf29489a9a3661","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        f\"cat \u0027{file}\u0027 2\u003e/dev/null || true\", host, check).stdout"},{"line_number":112,"context_line":"    if value:"},{"line_number":113,"context_line":"        content \u003d set_config_value(content, section, param, value)"},{"line_number":114,"context_line":"        content \u003d content.replace(\"\u0027\", \"\u0027\\\\\u0027\u0027\")"},{"line_number":115,"context_line":"        shell.execute("},{"line_number":116,"context_line":"            f\"echo \u0027{content}\u0027 | sudo tee \u0027{file}\u0027 \u003e /dev/null\","},{"line_number":117,"context_line":"            host, check)"},{"line_number":118,"context_line":"        return \u0027\u0027"},{"line_number":119,"context_line":"    return get_config_value(content, section, param)"}],"source_content_type":"text/x-python","patch_set":4,"id":"14387d14_8f5822b6","line":116,"range":{"start_line":114,"start_character":0,"end_line":116,"end_character":64},"updated":"2026-01-14 13:31:19.000000000","message":"Since there seems to be possible escaping issues (all the occurrences of `content.replace(\"\u0027\", \"\u0027\\\\\u0027\u0027\")` in patch), what about trying shell here document instead of `echo`, together with method `execute_script` (commonly used in NTP/WNTP)?\n\nNotice that if you see fit to apply such change in current patch more occurrences, also `run_group_cmd` uses `exec_command` and not `execute_script`, possibly may need adjustments to run cleanly but definitely doable.","commit_id":"adb218f3c2b80b74563e5685fc721b8355282af3"},{"author":{"_account_id":37280,"name":"Renjing Xiao","display_name":"Renjing Xiao","email":"rxiao@redhat.com","username":"rxiao"},"change_message_id":"d42a9c862039296f3b3b1e8958ec84811494c2e7","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        f\"cat \u0027{file}\u0027 2\u003e/dev/null || true\", host, check).stdout"},{"line_number":112,"context_line":"    if value:"},{"line_number":113,"context_line":"        content \u003d set_config_value(content, section, param, value)"},{"line_number":114,"context_line":"        content \u003d content.replace(\"\u0027\", \"\u0027\\\\\u0027\u0027\")"},{"line_number":115,"context_line":"        shell.execute("},{"line_number":116,"context_line":"            f\"echo \u0027{content}\u0027 | sudo tee \u0027{file}\u0027 \u003e /dev/null\","},{"line_number":117,"context_line":"            host, check)"},{"line_number":118,"context_line":"        return \u0027\u0027"},{"line_number":119,"context_line":"    return get_config_value(content, section, param)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9250bbf0_4fcb18c4","line":116,"range":{"start_line":114,"start_character":0,"end_line":116,"end_character":64},"in_reply_to":"14387d14_8f5822b6","updated":"2026-01-14 21:27:54.000000000","message":"Thank you for the comments.","commit_id":"adb218f3c2b80b74563e5685fc721b8355282af3"}]}
