)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6348f5a3f800a58b6e7bfffbdca793e1fd658a31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3b48f349_f673ce92","updated":"2025-10-21 04:53:54.000000000","message":"Hello Hervé and Wu, Thanks for the comments and sorry for the delay. I understand that I need to update the patches and I will do it this weekend.","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"c13093ed447494f908aa491cfa66e12a6b2ff662","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ea1cad3b_cb833cf6","updated":"2025-09-07 23:20:59.000000000","message":"Hello Wu, Thanks you very much for the comment. Sorry for my late reply. I will update the patch this week.","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"bffda170232716aa6ea5565abc591bbbcb9e1ad4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6296dd57_293c44fa","updated":"2025-10-23 08:58:53.000000000","message":"Thank you very much and kudos for your the great work!","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"93901404709f3bd7b7faa9715ae383fed6e8b5b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"08805b87_369a2800","in_reply_to":"3b48f349_f673ce92","updated":"2025-10-22 06:11:07.000000000","message":"thanks for the great work!","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"46505c9201135f1e5feb03983123256462c8cc61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"14f074b0_5228954b","in_reply_to":"a2d21296_1ab73854","updated":"2025-12-13 06:13:25.000000000","message":"Hello Wu, thanks for the advice! yes, octavia uses the standard library\u0027s wsgiref, and we can support either wsgiref or asgiref in these patches. \n\nI think we should use asgiref(with uvicorn) as the default, and keep wsgiref as an optional, non‑production fallback. because wsgiref should not be used as a frontend in production environments due to security concerns, as stated in the official Python documentation[1]:\n1: https://github.com/python/cpython/blob/main/Lib/wsgiref/simple_server.py#L5C31-L7C16","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"d44a94e17e258f6c14d2dc7f6ef5125a47c2238e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a2d21296_1ab73854","in_reply_to":"ea1cad3b_cb833cf6","updated":"2025-09-08 01:41:14.000000000","message":"shall we refer to the implementation in Octavia project. for more details in : https://github.com/openstack/octavia/blob/master/octavia/cmd/api.py#L53","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"}],"integration/scripts/files/elements/guest-agent/install.d/guest-agent-source-install/31-guest-agent-install":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"6e02b446ab06ba30b28825ecaf246b5e652407ef","unresolved":true,"context_lines":[{"line_number":23,"context_line":"/usr/bin/python3 -m venv ${GUEST_VENV}"},{"line_number":24,"context_line":"${GUEST_VENV}/bin/pip install pip --upgrade"},{"line_number":25,"context_line":"${GUEST_VENV}/bin/pip install -U -c /opt/upper-constraints.txt /opt/guest-agent"},{"line_number":26,"context_line":"${GUEST_VENV}/bin/pip install cotyledon"},{"line_number":27,"context_line":"chown -R ${GUEST_USERNAME}:root ${GUEST_VENV}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# this should only happen in zuul system."}],"source_content_type":"application/x-shellscript","patch_set":1,"id":"cb5c3885_fa2a7d58","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":39},"updated":"2025-08-20 13:26:29.000000000","message":"why do we need to install this package?","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"d348d0b0b6f7b2b82084d5e3ae2de9eed17a9548","unresolved":false,"context_lines":[{"line_number":23,"context_line":"/usr/bin/python3 -m venv ${GUEST_VENV}"},{"line_number":24,"context_line":"${GUEST_VENV}/bin/pip install pip --upgrade"},{"line_number":25,"context_line":"${GUEST_VENV}/bin/pip install -U -c /opt/upper-constraints.txt /opt/guest-agent"},{"line_number":26,"context_line":"${GUEST_VENV}/bin/pip install cotyledon"},{"line_number":27,"context_line":"chown -R ${GUEST_USERNAME}:root ${GUEST_VENV}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# this should only happen in zuul system."}],"source_content_type":"application/x-shellscript","patch_set":1,"id":"c3946c21_4dc7a44b","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":39},"in_reply_to":"cb5c3885_fa2a7d58","updated":"2025-12-13 05:21:11.000000000","message":"Hello wu, sorry, I have removed the package. The hardcoding is wrongly pushed(it is for debugging purpose in my local environment).","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"}],"trove/common/wsgi.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"6e02b446ab06ba30b28825ecaf246b5e652407ef","unresolved":true,"context_lines":[{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    LOG.debug(\"Trove started on %s\", host)"},{"line_number":78,"context_line":"    app \u003d pastedeploy.paste_deploy_app(paste_config_file, app_name, data)"},{"line_number":79,"context_line":"    server \u003d base_wsgi.Service(app, port, host\u003dhost)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    if workers is not None and not isinstance(workers, int):"},{"line_number":82,"context_line":"        raise TypeError(_(\"Type of workers should be int!\"))"},{"line_number":83,"context_line":"    if workers is not None and workers \u003c\u003d 0:"},{"line_number":84,"context_line":"        raise ValueError(_(\"Number of workers should be positive!\"))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    launcher \u003d TroveLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":87,"context_line":"    launcher.launch_service(server, workers\u003dworkers)"},{"line_number":88,"context_line":"    launcher.wait()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# Note: taken from Nova"},{"line_number":92,"context_line":"def serializers(**serializers):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1be42fb6_4581a708","line":89,"range":{"start_line":79,"start_character":0,"end_line":89,"end_character":0},"updated":"2025-08-20 13:26:29.000000000","message":"In my opinion,  we even do not need to use launch function from oslo_service library because in production, we usually  use uswgi or apache to run trove api, The way of staring trove api via trove-api script is only used for test or development. how do you think that?","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"cb64d3ea1b3ba18a1678cfd80976443670e34f0e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    LOG.debug(\"Trove started on %s\", host)"},{"line_number":78,"context_line":"    app \u003d pastedeploy.paste_deploy_app(paste_config_file, app_name, data)"},{"line_number":79,"context_line":"    server \u003d base_wsgi.Service(app, port, host\u003dhost)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    if workers is not None and not isinstance(workers, int):"},{"line_number":82,"context_line":"        raise TypeError(_(\"Type of workers should be int!\"))"},{"line_number":83,"context_line":"    if workers is not None and workers \u003c\u003d 0:"},{"line_number":84,"context_line":"        raise ValueError(_(\"Number of workers should be positive!\"))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    launcher \u003d TroveLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":87,"context_line":"    launcher.launch_service(server, workers\u003dworkers)"},{"line_number":88,"context_line":"    launcher.wait()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# Note: taken from Nova"},{"line_number":92,"context_line":"def serializers(**serializers):"}],"source_content_type":"text/x-python","patch_set":1,"id":"31de48e6_fa90acac","line":89,"range":{"start_line":79,"start_character":0,"end_line":89,"end_character":0},"in_reply_to":"1be42fb6_4581a708","updated":"2025-12-10 14:02:57.000000000","message":"Hello, sorry for the late response as I didn\u0027t notice the comment. I think trove-api script is typically used to start the trove API with a reverse proxy in front of the WSGI server. Mod_wsgi was introduced in Pike to enhance flexibility in deployment, performance, configuration, and scaling[1]. I am not familiar with uwsgi.\n\n1: https://governance.openstack.org/tc/goals/completed/pike/deploy-api-in-wsgi.html","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"6e02b446ab06ba30b28825ecaf246b5e652407ef","unresolved":true,"context_lines":[{"line_number":668,"context_line":"        return \"\""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"class TroveLauncher:"},{"line_number":672,"context_line":"    \"\"\"Launch one or more services and wait for them to complete.\"\"\""},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":675,"context_line":"        \"\"\"Initialize the service launcher."},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        :param restart_method: If \u0027reload\u0027, calls reload_config_files on"},{"line_number":678,"context_line":"            SIGHUP. If \u0027mutate\u0027, calls mutate_config_files on SIGHUP. Other"},{"line_number":679,"context_line":"            values produce a ValueError."},{"line_number":680,"context_line":"        :returns: None"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        \"\"\""},{"line_number":683,"context_line":"        self.conf \u003d conf"},{"line_number":684,"context_line":"        self.service \u003d None    # migration from Services"},{"line_number":685,"context_line":"        self.tg \u003d threadgroup.ThreadGroup()    # migration from Services"},{"line_number":686,"context_line":"        self.done \u003d threading.Event()"},{"line_number":687,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"    def launch_service(self, service, workers\u003d1):"},{"line_number":690,"context_line":"        \"\"\"Load and start the given service."},{"line_number":691,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2c82c5a7_53285c6a","line":688,"range":{"start_line":671,"start_character":1,"end_line":688,"end_character":0},"updated":"2025-08-20 13:26:29.000000000","message":"Hello， I think we don\u0027t have to implement such functionality as oslo-service have already done this, refer to: https://github.com/openstack/oslo.service/blob/master/oslo_service/backend/_threading/service.py","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"572cc5c3b6bf967bde75091a118f167cd3bf2418","unresolved":false,"context_lines":[{"line_number":668,"context_line":"        return \"\""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"class TroveLauncher:"},{"line_number":672,"context_line":"    \"\"\"Launch one or more services and wait for them to complete.\"\"\""},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":675,"context_line":"        \"\"\"Initialize the service launcher."},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        :param restart_method: If \u0027reload\u0027, calls reload_config_files on"},{"line_number":678,"context_line":"            SIGHUP. If \u0027mutate\u0027, calls mutate_config_files on SIGHUP. Other"},{"line_number":679,"context_line":"            values produce a ValueError."},{"line_number":680,"context_line":"        :returns: None"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        \"\"\""},{"line_number":683,"context_line":"        self.conf \u003d conf"},{"line_number":684,"context_line":"        self.service \u003d None    # migration from Services"},{"line_number":685,"context_line":"        self.tg \u003d threadgroup.ThreadGroup()    # migration from Services"},{"line_number":686,"context_line":"        self.done \u003d threading.Event()"},{"line_number":687,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"    def launch_service(self, service, workers\u003d1):"},{"line_number":690,"context_line":"        \"\"\"Load and start the given service."},{"line_number":691,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"0e79cc41_99094b57","line":688,"range":{"start_line":671,"start_character":1,"end_line":688,"end_character":0},"in_reply_to":"2c82c5a7_53285c6a","updated":"2025-12-10 10:01:48.000000000","message":"Hello Wu, thanks for the comment! oslo-service\u0027s threadgroup works fine now. We use the oslo-service again :)","commit_id":"2361e15c1358122d6472d48ce827c1e31fe2c4b5"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"5ff116c82c68e4f67f0e4fa3bca5598c187f6b75","unresolved":true,"context_lines":[{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":"    LOG.debug(\"Trove started on %s\", host)"},{"line_number":84,"context_line":"    app \u003d pastedeploy.paste_deploy_app(paste_config_file, app_name, data)"},{"line_number":85,"context_line":"    server \u003d base_wsgi.Service(app, port, host\u003dhost,"},{"line_number":86,"context_line":"                               server\u003dCONF.service_server)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    if workers is not None and not isinstance(workers, int):"},{"line_number":89,"context_line":"        raise TypeError(_(\"Type of workers should be int!\"))"},{"line_number":90,"context_line":"    if workers is not None and workers \u003c\u003d 0:"},{"line_number":91,"context_line":"        raise ValueError(_(\"Number of workers should be positive!\"))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    launcher \u003d TroveLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":94,"context_line":"    launcher.launch_service(server, workers\u003dworkers)"},{"line_number":95,"context_line":"    launcher.wait()"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# Note: taken from Nova"}],"source_content_type":"text/x-python","patch_set":12,"id":"9b5cfeac_d29ebf86","line":95,"range":{"start_line":85,"start_character":0,"end_line":95,"end_character":19},"updated":"2026-05-26 06:51:15.000000000","message":"In my opinion, using simple_server.make_server(host, port, app) is sufficient for development.\nFor production deployments, users should use standard deployment tools for Trove.\nTypically, the launcher is managed by deployment tools such as `kolla-ansible` and `openstack-ansible`. therefore,\nWe don’t need to maintain such a full-featured implementation.\n\nIn a devstack installation, the Trove API is set up as a uWSGI service.\n\nIn other words, in what scenario do you think this launcher should be used?","commit_id":"ff564ca49b5ba8071a7f2b1f20969542d4e77f66"}]}
