)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d204ae1f2134d05e11004f6ed3ad3e7d540bb061","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Migrate vtysh commands from rootwrap to oslo_privsep"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch changes both production and test code calls to vtysh to use"},{"line_number":10,"context_line":"oslo_privsep. I should have used privsep when I first wrote"},{"line_number":11,"context_line":"the FrrDriver, but I did not know any better at that time :)"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #2165183"},{"line_number":14,"context_line":"Assisted-By: Cursor Grok 4.5"},{"line_number":15,"context_line":"Change-Id: I12b03dd2bec88a4a72583dc69471f4f9ce945c8c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bb1fc73e_6714a5a1","line":12,"range":{"start_line":10,"start_character":13,"end_line":12,"end_character":0},"updated":"2026-08-26 19:52:50.000000000","message":"nit: I don\u0027t think such things belong to commit messages.","commit_id":"715ae4e0a8ca9ab7de9b2674f0445ac0b1acf8a6"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"71799427d23656ddb00e0478610207918eff0cab","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Migrate vtysh commands from rootwrap to oslo_privsep"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch changes both production and test code calls to vtysh to use"},{"line_number":10,"context_line":"oslo_privsep. I should have used privsep when I first wrote"},{"line_number":11,"context_line":"the FrrDriver, but I did not know any better at that time :)"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #2165183"},{"line_number":14,"context_line":"Assisted-By: Cursor Grok 4.5"},{"line_number":15,"context_line":"Change-Id: I12b03dd2bec88a4a72583dc69471f4f9ce945c8c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"489f5cd6_a843d3d3","line":12,"range":{"start_line":10,"start_character":13,"end_line":12,"end_character":0},"in_reply_to":"bb1fc73e_6714a5a1","updated":"2026-08-27 17:03:12.000000000","message":"Done","commit_id":"715ae4e0a8ca9ab7de9b2674f0445ac0b1acf8a6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d204ae1f2134d05e11004f6ed3ad3e7d540bb061","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"24da6026_6f03557c","updated":"2026-08-26 19:52:50.000000000","message":"LGTM, thanks!","commit_id":"715ae4e0a8ca9ab7de9b2674f0445ac0b1acf8a6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"96e33ef5c10d3a241e77a1a3636f4877fc70230a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2baa1c46_e0533503","updated":"2026-08-28 13:09:55.000000000","message":"good point to move more things away from rootwrap","commit_id":"b0803075f06ac5715546a33b8646358c1eec56bd"}],"neutron/privileged/agent/linux/vtysh.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0e55c202b0152fa3eff5c87eb9f76c7530c28420","unresolved":true,"context_lines":[{"line_number":32,"context_line":"    return processutils.execute(*cmd)[0]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _dryrun_file(vty_socket, path, extra_args\u003dNone):"},{"line_number":36,"context_line":"    cmd \u003d _base_cmd(vty_socket, extra_args) + [\u0027--dryrun\u0027, \u0027-f\u0027, path]"},{"line_number":37,"context_line":"    return processutils.execute(*cmd)[0]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _apply_file(vty_socket, path, extra_args\u003dNone):"},{"line_number":41,"context_line":"    cmd \u003d _base_cmd(vty_socket, extra_args) + [\u0027-f\u0027, path]"},{"line_number":42,"context_line":"    return processutils.execute(*cmd)[0]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"@privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":1,"id":"0bd3ad2f_1180bda7","line":42,"range":{"start_line":35,"start_character":0,"end_line":42,"end_character":40},"updated":"2026-08-25 15:00:00.000000000","message":"Was this AI generated? Seems like you can just use the `execute_cli` with the extra_args.\n\nAlso it seems it just got inspired by the dhcp privileged module but I think we should be able to wrap all this around `execute_process` from `privileged/agent/linux/utils.py` that also handles the standard pipes. So this file wouldn\u0027t even exist as just a wrapper would call into privileged module.\n\nLet me know what you think.","commit_id":"53abf6434011066be09c7db63d9b6db9f6590f7e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"71799427d23656ddb00e0478610207918eff0cab","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    return processutils.execute(*cmd)[0]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _dryrun_file(vty_socket, path, extra_args\u003dNone):"},{"line_number":36,"context_line":"    cmd \u003d _base_cmd(vty_socket, extra_args) + [\u0027--dryrun\u0027, \u0027-f\u0027, path]"},{"line_number":37,"context_line":"    return processutils.execute(*cmd)[0]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _apply_file(vty_socket, path, extra_args\u003dNone):"},{"line_number":41,"context_line":"    cmd \u003d _base_cmd(vty_socket, extra_args) + [\u0027-f\u0027, path]"},{"line_number":42,"context_line":"    return processutils.execute(*cmd)[0]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"@privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":1,"id":"29ecc1d3_ded13912","line":42,"range":{"start_line":35,"start_character":0,"end_line":42,"end_character":40},"in_reply_to":"0bd3ad2f_1180bda7","updated":"2026-08-27 17:03:12.000000000","message":"Done","commit_id":"53abf6434011066be09c7db63d9b6db9f6590f7e"}],"neutron/tests/unit/agent/linux/evpn_router/frr/test_frr_driver.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d204ae1f2134d05e11004f6ed3ad3e7d540bb061","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        self.execute \u003d mock.patch.object("},{"line_number":96,"context_line":"            frr_driver.linux_utils, \u0027execute\u0027).start()"},{"line_number":97,"context_line":"        self.executor \u003d frr_driver.FrrVtyshExecutor()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_execute_cli_cmd(self):"},{"line_number":100,"context_line":"        self.execute.return_value \u003d \"BGP summary output\""},{"line_number":101,"context_line":"        mock_cmd \u003d \u0027show me something\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"e2e4b456_ef0271e5","line":98,"updated":"2026-08-26 19:52:50.000000000","message":"nit: I\u0027d be fine if this test module required 0 changes as it doesn\u0027t really validate anything and we have the functional tests that really exercise the interaction between the code, privsep, system and vtysh.","commit_id":"715ae4e0a8ca9ab7de9b2674f0445ac0b1acf8a6"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"71799427d23656ddb00e0478610207918eff0cab","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        self.execute \u003d mock.patch.object("},{"line_number":96,"context_line":"            frr_driver.linux_utils, \u0027execute\u0027).start()"},{"line_number":97,"context_line":"        self.executor \u003d frr_driver.FrrVtyshExecutor()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def test_execute_cli_cmd(self):"},{"line_number":100,"context_line":"        self.execute.return_value \u003d \"BGP summary output\""},{"line_number":101,"context_line":"        mock_cmd \u003d \u0027show me something\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"e3517bad_e06e990d","line":98,"in_reply_to":"e2e4b456_ef0271e5","updated":"2026-08-27 17:03:12.000000000","message":"I kept the mock check, which confirm that calls are done with `run_as_root` and `privsep_exec`","commit_id":"715ae4e0a8ca9ab7de9b2674f0445ac0b1acf8a6"}]}
