)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9713de2efd9203ad391385b0934d8e28b0a66629","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3731665d_f5169686","updated":"2022-06-27 14:53:23.000000000","message":"I\u0027m really concerned by the \"shell\u003dTrue\" and the usage of plain \"|\" in subprocess.Popen. This should be reworked in order to avoid this bad practice, imho.","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"6a097277bf662f8f0098f994571d7dfc2b2c1e47","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ea331b81_3d67c762","in_reply_to":"3731665d_f5169686","updated":"2022-06-28 09:59:29.000000000","message":"Using shell can be a security risk only if your command input data comes from an untrusted source. Is \u0027podman ps --all\u0027 or value of SOCKET constant untrusted source? Possibly. But if an attacker is capable of changing podman\u0027s command output (eg. swapping mounted podman socket owned by root) or value of the constant in the script, then he/she does not need this script to do more harm.\n\nBut sure I can definitely use two Popens and have commands as list instead, so that security guys sleep a bit better :).","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"ef98fe5d8ef75c5a71ec80e76fa3e99b1200cf87","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"233c99e3_b7dc1a7a","in_reply_to":"ea331b81_3d67c762","updated":"2022-06-28 19:23:12.000000000","message":"Done","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"6e055e210bab2093a8b89b304dfc23e8b60facca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b9ffc228_933cf12f","updated":"2022-07-01 09:40:05.000000000","message":"2022-06-29 11:18:31.304460 | primary | fatal: [undercloud]: FAILED! \u003d\u003e {\"ansible_job_id\": \"22086713143.63426\", \"changed\": false, \"cmd\": \"openstack overcloud ceph deploy ","commit_id":"4b209f11767211b2b6c531fd28f2aed43aea6381"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"ba40f0cc995e4e0ec04506ccfc49431f9ebf3eb7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1e5c2213_a833d293","updated":"2022-07-01 09:40:16.000000000","message":"recheck","commit_id":"4b209f11767211b2b6c531fd28f2aed43aea6381"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"387a9ff9129556a6deae5dc2c4ed4a7b4a639223","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"91ec301b_5f9bf257","updated":"2022-06-29 09:55:13.000000000","message":"recheck","commit_id":"4b209f11767211b2b6c531fd28f2aed43aea6381"},{"author":{"_account_id":7294,"name":"Leif Madsen","email":"lmadsen@redhat.com","username":"leifmadsen"},"change_message_id":"3bf69566d590cc0e0f3c3aebe1244c97009760e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dc343f9a_8595c3a2","updated":"2022-07-18 17:09:59.000000000","message":"I\u0027m seeing a pair of +2 on this change and CI verification. Can we get a +W and have this merged?\n\nMartin, does this also need backporting to Wallaby?","commit_id":"4832fbfbc9ffbf2a493a3702d3456a763504610b"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"fad393c134061fbf0b39ffdd120d25679dcbc145","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7af24459_737a03c0","updated":"2022-07-11 14:44:13.000000000","message":"Thanks for addressing the different concerns!","commit_id":"4832fbfbc9ffbf2a493a3702d3456a763504610b"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f046c491f11425ceb39434c291f65d0bf3034541","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"e9ff12f8_caa6b6eb","updated":"2022-07-26 07:38:53.000000000","message":"The change already has two +2 so I\u0027ll merge this now.\nLeaving a comment which can be addressed in a follow-up if needed.","commit_id":"4832fbfbc9ffbf2a493a3702d3456a763504610b"},{"author":{"_account_id":4264,"name":"Matthias Runge","email":"mrunge@redhat.com","username":"mrunge"},"change_message_id":"c7aed10f4d174abfb9000da1da8df0c55d95eaad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"56187b71_6240bc39","updated":"2022-07-05 05:49:02.000000000","message":"recheck","commit_id":"4832fbfbc9ffbf2a493a3702d3456a763504610b"}],"container_config_scripts/monitoring/collectd_check_health.py":[{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9713de2efd9203ad391385b0934d8e28b0a66629","unresolved":true,"context_lines":[{"line_number":22,"context_line":"SOCKET \u003d \"unix:/run/podman/podman.sock\""},{"line_number":23,"context_line":"FORMAT \u003d (\"{service: .Name, container: .Id, status: .State.Running, \""},{"line_number":24,"context_line":"         \"healthy: .State.Health.Status}\")"},{"line_number":25,"context_line":"SKIP \u003d [\u0027_bootstrap\u0027, \u0027container-puppet-\u0027, \u0027_db_sync\u0027,"},{"line_number":26,"context_line":"        \u0027_ensure_\u0027, \u0027_fix_\u0027, \u0027_init_\u0027, \u0027_map_\u0027, \u0027_wait_\u0027,"},{"line_number":27,"context_line":"        \u0027mysql_data_ownership\u0027, \u0027configure_cms_options\u0027]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"387188e5_12890bf0","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":4},"updated":"2022-06-27 14:53:23.000000000","message":"nit: \"SKIP_LIST\" would be more explicit imho","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"6a097277bf662f8f0098f994571d7dfc2b2c1e47","unresolved":false,"context_lines":[{"line_number":22,"context_line":"SOCKET \u003d \"unix:/run/podman/podman.sock\""},{"line_number":23,"context_line":"FORMAT \u003d (\"{service: .Name, container: .Id, status: .State.Running, \""},{"line_number":24,"context_line":"         \"healthy: .State.Health.Status}\")"},{"line_number":25,"context_line":"SKIP \u003d [\u0027_bootstrap\u0027, \u0027container-puppet-\u0027, \u0027_db_sync\u0027,"},{"line_number":26,"context_line":"        \u0027_ensure_\u0027, \u0027_fix_\u0027, \u0027_init_\u0027, \u0027_map_\u0027, \u0027_wait_\u0027,"},{"line_number":27,"context_line":"        \u0027mysql_data_ownership\u0027, \u0027configure_cms_options\u0027]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d2a7d404_9042c21e","line":25,"range":{"start_line":25,"start_character":0,"end_line":25,"end_character":4},"in_reply_to":"387188e5_12890bf0","updated":"2022-06-28 09:59:29.000000000","message":"Ack","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9713de2efd9203ad391385b0934d8e28b0a66629","unresolved":true,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def execute(cmd, workdir: str \u003d None):"},{"line_number":31,"context_line":"    proc \u003d subprocess.Popen(cmd, cwd\u003dworkdir, shell\u003dTrue, close_fds\u003dTrue,"},{"line_number":32,"context_line":"                            stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE)"},{"line_number":33,"context_line":"    out, err \u003d proc.communicate()"},{"line_number":34,"context_line":"    out \u003d out.decode()"}],"source_content_type":"text/x-python","patch_set":1,"id":"641c3029_9c5806a3","line":31,"range":{"start_line":31,"start_character":46,"end_line":31,"end_character":56},"updated":"2022-06-27 14:53:23.000000000","message":"imho, this is a potential security issue.","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"6a097277bf662f8f0098f994571d7dfc2b2c1e47","unresolved":true,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def execute(cmd, workdir: str \u003d None):"},{"line_number":31,"context_line":"    proc \u003d subprocess.Popen(cmd, cwd\u003dworkdir, shell\u003dTrue, close_fds\u003dTrue,"},{"line_number":32,"context_line":"                            stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE)"},{"line_number":33,"context_line":"    out, err \u003d proc.communicate()"},{"line_number":34,"context_line":"    out \u003d out.decode()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9bd3f3b2_cacb8055","line":31,"range":{"start_line":31,"start_character":46,"end_line":31,"end_character":56},"in_reply_to":"641c3029_9c5806a3","updated":"2022-06-28 09:59:29.000000000","message":"Replied above.","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"ef98fe5d8ef75c5a71ec80e76fa3e99b1200cf87","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def execute(cmd, workdir: str \u003d None):"},{"line_number":31,"context_line":"    proc \u003d subprocess.Popen(cmd, cwd\u003dworkdir, shell\u003dTrue, close_fds\u003dTrue,"},{"line_number":32,"context_line":"                            stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE)"},{"line_number":33,"context_line":"    out, err \u003d proc.communicate()"},{"line_number":34,"context_line":"    out \u003d out.decode()"}],"source_content_type":"text/x-python","patch_set":1,"id":"e0848c93_ff044a3e","line":31,"range":{"start_line":31,"start_character":46,"end_line":31,"end_character":56},"in_reply_to":"9bd3f3b2_cacb8055","updated":"2022-06-28 19:23:12.000000000","message":"Done","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9713de2efd9203ad391385b0934d8e28b0a66629","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"}],"source_content_type":"text/x-python","patch_set":1,"id":"cb3e9593_de331529","line":48,"updated":"2022-06-27 14:53:23.000000000","message":"wondering about the cost here :/. Though apparently we can\u0027t call \"healthcheck\" (or health?) command, since it only accepts \"run\". But getting some data about actual cost, potential bottleneck and overall resources would be good imho. Just to avoid seeing things blowing up.","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"4ddf58031930e50ac99b394a74389f307c794187","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e825ea9_ba06783f","line":48,"in_reply_to":"52505165_f971f89e","updated":"2022-06-28 19:22:14.000000000","message":"Some measurements can be found here: https://paste.opendev.org/show/bi4cLuIzVY8c7eYhmiKU/\n\nIt shows that accumulated CPU running time for the script is maximum 200ms (20% of 1s period).\n\nGot any hint on figuring out potential bottleneck?","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"6a097277bf662f8f0098f994571d7dfc2b2c1e47","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"}],"source_content_type":"text/x-python","patch_set":1,"id":"52505165_f971f89e","line":48,"in_reply_to":"cb3e9593_de331529","updated":"2022-06-28 09:59:29.000000000","message":"Yeah I agree, this is not cheap operation indeed. Got any better idea how to achieve the same result using less resources?","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9713de2efd9203ad391385b0934d8e28b0a66629","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"},{"line_number":52,"context_line":"            item \u003d json.loads(fmted)"}],"source_content_type":"text/x-python","patch_set":1,"id":"65574562_70e55d78","line":49,"range":{"start_line":48,"start_character":72,"end_line":49,"end_character":38},"updated":"2022-06-27 14:53:23.000000000","message":"I thought it was a bad practice o actually use | in subprocess.Popen. Maybe you\u0027d rather use the actual stdout param to pipe to jq?","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"ef98fe5d8ef75c5a71ec80e76fa3e99b1200cf87","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"},{"line_number":52,"context_line":"            item \u003d json.loads(fmted)"}],"source_content_type":"text/x-python","patch_set":1,"id":"96e2913b_7e9411c0","line":49,"range":{"start_line":48,"start_character":72,"end_line":49,"end_character":38},"in_reply_to":"31e070cb_48dce022","updated":"2022-06-28 19:23:12.000000000","message":"Done","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"4ddf58031930e50ac99b394a74389f307c794187","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"},{"line_number":52,"context_line":"            item \u003d json.loads(fmted)"}],"source_content_type":"text/x-python","patch_set":1,"id":"31e070cb_48dce022","line":49,"range":{"start_line":48,"start_character":72,"end_line":49,"end_character":38},"in_reply_to":"3ff37d5b_8419cdd9","updated":"2022-06-28 19:22:14.000000000","message":"So yeah, not using shell is slightly faster. Tested on fully deployed OSP17 controller and average results are following:\n\nshell\u003dTrue -\u003e\nreal    0m3.968s\nuser    0m4.467s\nsys     0m1.727s\n\n_________________________\n\nshell\u003dFalse -\u003e\nreal    0m3.578s\nuser    0m4.366s\nsys     0m1.614s","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"6a097277bf662f8f0098f994571d7dfc2b2c1e47","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            if skip in cont:"},{"line_number":46,"context_line":"                break"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            rc, fmted, err \u003d execute(\u0027podman-remote --url %s inspect %s | \u0027"},{"line_number":49,"context_line":"                                   \u0027jq \".[] | %s\"\u0027 % (SOCKET, cont, FORMAT))"},{"line_number":50,"context_line":"            if rc !\u003d 0:"},{"line_number":51,"context_line":"                return rc, \"Failed to fetch status of %s: %s\" % (cont, err)"},{"line_number":52,"context_line":"            item \u003d json.loads(fmted)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ff37d5b_8419cdd9","line":49,"range":{"start_line":48,"start_character":72,"end_line":49,"end_character":38},"in_reply_to":"65574562_70e55d78","updated":"2022-06-28 09:59:29.000000000","message":"Question is what\u0027s faster approach. I can do some measurements and get back","commit_id":"9a04ade9f95d52bd5a7dbb09e52c22413655e896"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"a1e5a4e86a92f8e626bec28ac4af394150dc3d4d","unresolved":true,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def fetch_container_health(containers):"},{"line_number":49,"context_line":"    out \u003d {}"},{"line_number":50,"context_line":"    for cont in containers.split(\u0027\\n\u0027):"},{"line_number":51,"context_line":"        if not cont:"},{"line_number":52,"context_line":"            continue"},{"line_number":53,"context_line":"        for skip in SKIP_LIST:"},{"line_number":54,"context_line":"            if skip in cont:"},{"line_number":55,"context_line":"                break"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            cont \u003d cont.strip(\u0027\"\\\u0027\u0027)"},{"line_number":58,"context_line":"            proc \u003d execute(["}],"source_content_type":"text/x-python","patch_set":2,"id":"107e867f_eb110fc1","line":55,"range":{"start_line":50,"start_character":0,"end_line":55,"end_character":21},"updated":"2022-07-01 11:23:28.000000000","message":"I\u0027m wondering if we can\u0027t use set() to prepare the list before looping. It of course would depend on the length of SKIP_LIST, but if we do something like:\n\nto_check \u003d list(set(containers.split(\u0027\\n\u0027)) - set(SKIP_LIST))\nfor cont in to_check:\n    ....\n\nwe would gain some loops, imho. WDYT?","commit_id":"4b209f11767211b2b6c531fd28f2aed43aea6381"},{"author":{"_account_id":5241,"name":"Martin Magr","email":"mmagr@redhat.com","username":"mmagr"},"change_message_id":"a2a0f8e071fe3f76956ef88bfe8c13fc4f3e659f","unresolved":true,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def fetch_container_health(containers):"},{"line_number":49,"context_line":"    out \u003d {}"},{"line_number":50,"context_line":"    for cont in containers.split(\u0027\\n\u0027):"},{"line_number":51,"context_line":"        if not cont:"},{"line_number":52,"context_line":"            continue"},{"line_number":53,"context_line":"        for skip in SKIP_LIST:"},{"line_number":54,"context_line":"            if skip in cont:"},{"line_number":55,"context_line":"                break"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            cont \u003d cont.strip(\u0027\"\\\u0027\u0027)"},{"line_number":58,"context_line":"            proc \u003d execute(["}],"source_content_type":"text/x-python","patch_set":2,"id":"def62ac8_12574979","line":55,"range":{"start_line":50,"start_character":0,"end_line":55,"end_character":21},"in_reply_to":"107e867f_eb110fc1","updated":"2022-07-04 18:20:56.000000000","message":"Good point, will update.","commit_id":"4b209f11767211b2b6c531fd28f2aed43aea6381"},{"author":{"_account_id":6681,"name":"Brent Eagles","email":"beagles@redhat.com","username":"beagles"},"change_message_id":"6abe7c500c6c713bf9d0c8d3084259e7e42ee39b","unresolved":true,"context_lines":[{"line_number":33,"context_line":"    if type(cmd[0]) is list:  # multiple piped commands"},{"line_number":34,"context_line":"        last \u003d prev_proc"},{"line_number":35,"context_line":"        for c in cmd:"},{"line_number":36,"context_line":"            last \u003d execute(c, workdir, last)"},{"line_number":37,"context_line":"        return last"},{"line_number":38,"context_line":"    else:  # single command"},{"line_number":39,"context_line":"        inpipe \u003d prev_proc.stdout if prev_proc is not None else None"}],"source_content_type":"text/x-python","patch_set":4,"id":"fcada9cb_a2adafa7","line":36,"updated":"2022-07-13 11:37:09.000000000","message":"It makes me happy whenever I see recursive functions!","commit_id":"4832fbfbc9ffbf2a493a3702d3456a763504610b"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f046c491f11425ceb39434c291f65d0bf3034541","unresolved":true,"context_lines":[{"line_number":76,"context_line":"                    \u0027ps\u0027, \u0027--all\u0027, \u0027--format\u0027, \u0027{{.Names}}\u0027])"},{"line_number":77,"context_line":"    o, e \u003d proc.communicate()"},{"line_number":78,"context_line":"    if proc.returncode !\u003d 0:"},{"line_number":79,"context_line":"        print(\"Failed to list containers:\\n%s\\n%s\" % (o.decode(), e.decode()))"},{"line_number":80,"context_line":"        sys.exit(1)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    rc, status \u003d fetch_container_health(o.decode())"}],"source_content_type":"text/x-python","patch_set":4,"id":"43e573b2_a5407a85","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":13},"updated":"2022-07-26 07:38:53.000000000","message":"We might want to send these errors to stderr instead of stdout.","commit_id":"4832fbfbc9ffbf2a493a3702d3456a763504610b"}]}
