)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"006bd44434b2b5d9f19a173f82ec66029db75ae6","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"236338f4_eaf2c988","updated":"2024-02-28 10:58:35.000000000","message":"If flake8 is not suitable for ansible plugins - should we move to ansible-test?","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"c095ecedfbebfd0b9d5dc83547b2fb5a915d168e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"15d2d255_59638d38","in_reply_to":"236338f4_eaf2c988","updated":"2024-02-28 12:21:59.000000000","message":"We are running ansible-test sanity on the collection in the linters job. I think flake8 is ok, we just need to ignore E402.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":34212,"name":"Matt Anson","email":"matta@stackhpc.com","username":"m-anson","status":"StackHPC"},"change_message_id":"15ad57ed039ff6ddcc796e3f03c11e0cdbc28bc4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"23f8e0bd_53871b8b","updated":"2025-02-24 17:43:52.000000000","message":"recheck debian - transient 503 from nova","commit_id":"54bc688fff6422df2e758435df9845a3c43a4eab"},{"author":{"_account_id":14200,"name":"Maksim Malchuk","email":"maksim.malchuk@gmail.com","username":"mmalchuk"},"change_message_id":"74de91e6b805295edb3d0d7880483efcee23e7dd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8a3de8d3_3bdefe3a","updated":"2025-02-25 08:33:09.000000000","message":"shouldn\u0027t we include the piece of documentation on how this plugin can be used by the operator?","commit_id":"54bc688fff6422df2e758435df9845a3c43a4eab"},{"author":{"_account_id":36765,"name":"Seunghun Lee","display_name":"Seunghun Lee","email":"seunghun@stackhpc.com","username":"seunghun1ee","status":"Cloud Engineer at StackHPC"},"change_message_id":"7cd505a28ec7740fdb7c4ee5940270afe8af7abb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7c70e1fc_b3bded45","in_reply_to":"8a3de8d3_3bdefe3a","updated":"2026-05-22 10:23:53.000000000","message":"Done","commit_id":"54bc688fff6422df2e758435df9845a3c43a4eab"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"978509cbf6203755a4a2cde09165816890d427e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"370ae2a6_680a9700","updated":"2026-05-22 15:04:37.000000000","message":"Please could we exercise it in CI. Something like:\n\n1) Add the plugin to the list of enabled callback plugins in `tests/templates/ansible.cfg.j2`\n\n2) Tweak `scenarios/aio.yaml` or similar to run when stats.py is changed. Add \u0027^plugins/\u0027 to the files list.","commit_id":"a6586a1f509f04510a1631b39f2e45d0d128fc6f"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"9c215324a2c8d83edabe360613f559b2ad766aea","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"fc3d5f04_b1cdea9d","updated":"2026-05-22 15:07:41.000000000","message":"This needs a bigger picture in commit message (why are we doing this, how Kayobe/Kolla-Ansible are going to use this)","commit_id":"a6586a1f509f04510a1631b39f2e45d0d128fc6f"},{"author":{"_account_id":36765,"name":"Seunghun Lee","display_name":"Seunghun Lee","email":"seunghun@stackhpc.com","username":"seunghun1ee","status":"Cloud Engineer at StackHPC"},"change_message_id":"09a494e400ad1f7e5349250276744274694a278c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3e079b6e_1fb03454","in_reply_to":"370ae2a6_680a9700","updated":"2026-05-22 15:11:00.000000000","message":"I think we can tweak https://review.opendev.org/c/openstack/kayobe/+/910511 to achieve that","commit_id":"a6586a1f509f04510a1631b39f2e45d0d128fc6f"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"eedc830488ec44866de9cc19f5ee954dfee1e255","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ed6c1bae_ddb18920","in_reply_to":"370ae2a6_680a9700","updated":"2026-05-22 15:10:31.000000000","message":"doh, ignore that, I need to pay attention the repo!","commit_id":"a6586a1f509f04510a1631b39f2e45d0d128fc6f"},{"author":{"_account_id":36765,"name":"Seunghun Lee","display_name":"Seunghun Lee","email":"seunghun@stackhpc.com","username":"seunghun1ee","status":"Cloud Engineer at StackHPC"},"change_message_id":"aca653e93a0e224ea6452daecaf793b034511bc1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b380ef71_44c0e6c5","in_reply_to":"fc3d5f04_b1cdea9d","updated":"2026-06-08 15:20:44.000000000","message":"I added some more on what Kayobe/K-A can do with this new plugin in the commit message. How does it look?","commit_id":"a6586a1f509f04510a1631b39f2e45d0d128fc6f"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"b109584a684600d16d53a5de839d1112d41d6831","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b0c0ab61_745d73e1","updated":"2026-06-08 15:40:37.000000000","message":"In addition to that I have a feeling that the entire current_ok_hosts tracking mechanism is an inaccurate reimplementation of v2_playbook_on_no_hosts_remaining that is already part of ansible-core, and I would hate to maintain this logic so it\u0027s in line with all ansible-core changes.\nMaybe we can simplify this callback plugin and rely on v2_playbook_on_no_hosts_remaining from ansible-core?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"365d09b4_b1f7bf9a","updated":"2026-06-08 15:37:29.000000000","message":"no ansible-test compliant unit tests - please add them","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"eba8c920a021e425b3f0f7aa45a526cd5a7ff647","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8882273e_2866bf0c","in_reply_to":"9871b1c5_4a819d9b","updated":"2026-06-08 15:59:19.000000000","message":"That is fine, although that issue is old and has been raised in 2023 - are we sure nothing has changed in that area?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":36765,"name":"Seunghun Lee","display_name":"Seunghun Lee","email":"seunghun@stackhpc.com","username":"seunghun1ee","status":"Cloud Engineer at StackHPC"},"change_message_id":"15e36d43ae0e1f85d165d703690a97499e188965","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"9871b1c5_4a819d9b","in_reply_to":"b0c0ab61_745d73e1","updated":"2026-06-08 15:56:00.000000000","message":"I think original author had issue with https://github.com/ansible/ansible/issues/81549","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"}],"doc/source/stats-callback.rst":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":6,"context_line":"Ansible playbook run. It produces a JSON file with the following information."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"- Names and number of failed hosts"},{"line_number":9,"context_line":"- Names and number of unreachables hosts"},{"line_number":10,"context_line":"- Whether the execution failed because there are no hosts remaining"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Example:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"35aa1dab_88d6d24d","line":9,"range":{"start_line":9,"start_character":22,"end_line":9,"end_character":34},"updated":"2026-06-08 15:37:29.000000000","message":"minus the s?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"The plugin can be enabled from ``ansible.cfg``"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":".. code-block:: yaml"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    [defaults]"},{"line_number":34,"context_line":"    callbacks_enabled \u003d openstack.kolla.stats"}],"source_content_type":"text/x-rst","patch_set":10,"id":"a5f38e05_7b0ac7bc","line":31,"updated":"2026-06-08 15:37:29.000000000","message":"ini?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"}],"plugins/callback/stats.py":[{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"62494ed153bd80697a48e2a52345c92abe8e9cd6","unresolved":true,"context_lines":[{"line_number":15,"context_line":"                  key: kolla_stats_path"},{"line_number":16,"context_line":"            env:"},{"line_number":17,"context_line":"                - name: ANSIBLE_KOLLA_STATS_PATH"},{"line_number":18,"context_line":"            default: \"~/.ansible/kolla_stats/kolla_stats.json\""},{"line_number":19,"context_line":"            type: path"},{"line_number":20,"context_line":"    description:"},{"line_number":21,"context_line":"        - This plugin produces a JSON dump of statistics in a file."}],"source_content_type":"text/x-python","patch_set":2,"id":"fae784d1_a82d7a68","line":18,"range":{"start_line":18,"start_character":22,"end_line":18,"end_character":23},"updated":"2024-02-28 16:09:53.000000000","message":"is this really a good default to write this to a users home directory?\ndepending on where this is executed the (automation) user might not even have a home directory.\n\nalso, even if a home directory is used, it\u0027s afaik discouraged to reference it via `~`.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1d9232260b20447dda965f63fe1dfd4b50eb762c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"                  key: kolla_stats_path"},{"line_number":16,"context_line":"            env:"},{"line_number":17,"context_line":"                - name: ANSIBLE_KOLLA_STATS_PATH"},{"line_number":18,"context_line":"            default: \"~/.ansible/kolla_stats/kolla_stats.json\""},{"line_number":19,"context_line":"            type: path"},{"line_number":20,"context_line":"    description:"},{"line_number":21,"context_line":"        - This plugin produces a JSON dump of statistics in a file."}],"source_content_type":"text/x-python","patch_set":2,"id":"c26ec464_263c25cb","line":18,"range":{"start_line":18,"start_character":22,"end_line":18,"end_character":23},"in_reply_to":"56acd066_96b4b4ee","updated":"2024-04-12 09:09:08.000000000","message":"I\u0027ve updated it to use $HOME.\n\nbtw, a reason you might use . rather than source is that source is a bash-ism, so . is more portable, if a bit less readable.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"063047dabd45bc171ab630a9eca6749ad8c8a439","unresolved":true,"context_lines":[{"line_number":15,"context_line":"                  key: kolla_stats_path"},{"line_number":16,"context_line":"            env:"},{"line_number":17,"context_line":"                - name: ANSIBLE_KOLLA_STATS_PATH"},{"line_number":18,"context_line":"            default: \"~/.ansible/kolla_stats/kolla_stats.json\""},{"line_number":19,"context_line":"            type: path"},{"line_number":20,"context_line":"    description:"},{"line_number":21,"context_line":"        - This plugin produces a JSON dump of statistics in a file."}],"source_content_type":"text/x-python","patch_set":2,"id":"fdb73f24_3e0c0043","line":18,"range":{"start_line":18,"start_character":22,"end_line":18,"end_character":23},"in_reply_to":"fae784d1_a82d7a68","updated":"2024-02-29 14:34:58.000000000","message":"I took inspiration for this plugin from Ansible\u0027s tree callback plugin: https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/callback/tree.py\n\nIt writes files to ~/.ansible/tree/.\n\nOverall ~/.ansible/ seems to be a common place to store things on the control host, including collections, roles, SSH control path, Galaxy cache \u0026 token and temporary files.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"f46f4ddf37b5fc467435fcb44efe90edc0b38c6c","unresolved":true,"context_lines":[{"line_number":15,"context_line":"                  key: kolla_stats_path"},{"line_number":16,"context_line":"            env:"},{"line_number":17,"context_line":"                - name: ANSIBLE_KOLLA_STATS_PATH"},{"line_number":18,"context_line":"            default: \"~/.ansible/kolla_stats/kolla_stats.json\""},{"line_number":19,"context_line":"            type: path"},{"line_number":20,"context_line":"    description:"},{"line_number":21,"context_line":"        - This plugin produces a JSON dump of statistics in a file."}],"source_content_type":"text/x-python","patch_set":2,"id":"56acd066_96b4b4ee","line":18,"range":{"start_line":18,"start_character":22,"end_line":18,"end_character":23},"in_reply_to":"fdb73f24_3e0c0043","updated":"2024-03-01 14:56:30.000000000","message":"pointing to other people also doing bad things is well, bad?\n\nmany parts of the ansible code base are certainly no example of very clean or good code (sadly).\n\nnevertheless it\u0027s still bad to use \"~\" (one reason is it\u0027s bad to search source code by this, if you are looking for home directories, this is also the case why you should never source bash files in scripts by using `. $file`, write `source $file` instead. And yes I know we do this a lot in files, it\u0027s still just a bad practice.\n\nso if you must write to `$HOME` use `$HOME` in bash, there are other valid variables for this as well, depending on the context.\n\nsee e.g. https://stackoverflow.com/a/4028943 for a \"pythonic way\" using `pathlib` from the python standard lib (and ignore the \"~\" example there, bad practices are spread all over the internet, especially stackoverflow).","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"62494ed153bd80697a48e2a52345c92abe8e9cd6","unresolved":true,"context_lines":[{"line_number":20,"context_line":"    description:"},{"line_number":21,"context_line":"        - This plugin produces a JSON dump of statistics in a file."},{"line_number":22,"context_line":"        - \"Statistics collected include:\""},{"line_number":23,"context_line":"        - the count and names of failed and unreachable hosts"},{"line_number":24,"context_line":"        - whether execution failed with no hosts remaining"},{"line_number":25,"context_line":"\u0027\u0027\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import json"}],"source_content_type":"text/x-python","patch_set":2,"id":"d8b18f25_3c590a7d","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":58},"updated":"2024-02-28 16:09:53.000000000","message":"an example output either here or in an example file would be nice, not strictly necessary though.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"063047dabd45bc171ab630a9eca6749ad8c8a439","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    description:"},{"line_number":21,"context_line":"        - This plugin produces a JSON dump of statistics in a file."},{"line_number":22,"context_line":"        - \"Statistics collected include:\""},{"line_number":23,"context_line":"        - the count and names of failed and unreachable hosts"},{"line_number":24,"context_line":"        - whether execution failed with no hosts remaining"},{"line_number":25,"context_line":"\u0027\u0027\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import json"}],"source_content_type":"text/x-python","patch_set":2,"id":"7fe4786f_f3a87e08","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":58},"in_reply_to":"d8b18f25_3c590a7d","updated":"2024-02-29 14:34:58.000000000","message":"Sure, I\u0027ll provide an example.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"62494ed153bd80697a48e2a52345c92abe8e9cd6","unresolved":true,"context_lines":[{"line_number":38,"context_line":"    \"\"\"Kolla Ansible statistics."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    This class represents the statistics generated by the kolla_stats callback"},{"line_number":41,"context_line":"    plugin, and needs to be kept in sync with it."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    num_failures: int"}],"source_content_type":"text/x-python","patch_set":2,"id":"b7b1b58c_c1e47784","line":41,"range":{"start_line":41,"start_character":16,"end_line":41,"end_character":48},"updated":"2024-02-28 16:09:53.000000000","message":"why? how? this seems important enough to mention it in the doc string, but the doc string doesn\u0027t really explain anything related to it.\n\nalso I fail to see any code in the class that takes care of this, or I\u0027m missing context. Is this docstring targeted at the developer of the class or targeted at the user of this class? if the latter, how should the user keep this in sync?","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"063047dabd45bc171ab630a9eca6749ad8c8a439","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \"\"\"Kolla Ansible statistics."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    This class represents the statistics generated by the kolla_stats callback"},{"line_number":41,"context_line":"    plugin, and needs to be kept in sync with it."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    num_failures: int"}],"source_content_type":"text/x-python","patch_set":2,"id":"276d058b_41d7f90b","line":41,"range":{"start_line":41,"start_character":16,"end_line":41,"end_character":48},"in_reply_to":"b7b1b58c_c1e47784","updated":"2024-02-29 14:34:58.000000000","message":"This comment is actually more applicable to a corresponding class in Kayobe. I\u0027ll remove it from here.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"f15c90d83843196ee2b36019c4919c60c0ab56fb","unresolved":true,"context_lines":[{"line_number":50,"context_line":"class Stats(object):"},{"line_number":51,"context_line":"    \"\"\"Kolla Ansible statistics.\"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    num_failures: int"},{"line_number":54,"context_line":"    num_unreachable: int"},{"line_number":55,"context_line":"    failures: List[str]"},{"line_number":56,"context_line":"    unreachable: List[str]"},{"line_number":57,"context_line":"    no_hosts_remaining: bool"}],"source_content_type":"text/x-python","patch_set":5,"id":"96840b64_585aad7a","line":54,"range":{"start_line":53,"start_character":0,"end_line":54,"end_character":24},"updated":"2024-04-18 15:56:38.000000000","message":"nit: not sure we want to codify the type of the variable into the name (prefix \"num\").\n\nmaybe use \"failed_hosts\" \"unreachable_hosts\" instead? or if we want to be extra explicit \"number_of_failed_hosts\" etc?","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":34212,"name":"Matt Anson","email":"matta@stackhpc.com","username":"m-anson","status":"StackHPC"},"change_message_id":"eaa577c4413a96ca5d45f008134f1215fad21b5a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"class Stats(object):"},{"line_number":51,"context_line":"    \"\"\"Kolla Ansible statistics.\"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    num_failures: int"},{"line_number":54,"context_line":"    num_unreachable: int"},{"line_number":55,"context_line":"    failures: List[str]"},{"line_number":56,"context_line":"    unreachable: List[str]"},{"line_number":57,"context_line":"    no_hosts_remaining: bool"}],"source_content_type":"text/x-python","patch_set":5,"id":"81535f77_08936b9a","line":54,"range":{"start_line":53,"start_character":0,"end_line":54,"end_character":24},"in_reply_to":"96840b64_585aad7a","updated":"2025-02-21 15:20:43.000000000","message":"failed_hosts is a list of failed host names, and the _count suffix is now used to describe the number of failed hosts","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"f15c90d83843196ee2b36019c4919c60c0ab56fb","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    CALLBACK_NEEDS_ENABLED \u003d True"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_options(self, task_keys\u003dNone, var_options\u003dNone, direct\u003dNone):"},{"line_number":80,"context_line":"        \u0027\u0027\u0027Override to set self.path \u0027\u0027\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        super(CallbackModule, self).set_options(task_keys\u003dtask_keys,"},{"line_number":83,"context_line":"                                                var_options\u003dvar_options,"}],"source_content_type":"text/x-python","patch_set":5,"id":"556e63fb_b940b084","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":2},"updated":"2024-04-18 15:56:38.000000000","message":"I don\u0027t understand the function doc string, could you explain a little bit more?\nThank you!","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":34212,"name":"Matt Anson","email":"matta@stackhpc.com","username":"m-anson","status":"StackHPC"},"change_message_id":"eaa577c4413a96ca5d45f008134f1215fad21b5a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    CALLBACK_NEEDS_ENABLED \u003d True"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_options(self, task_keys\u003dNone, var_options\u003dNone, direct\u003dNone):"},{"line_number":80,"context_line":"        \u0027\u0027\u0027Override to set self.path \u0027\u0027\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        super(CallbackModule, self).set_options(task_keys\u003dtask_keys,"},{"line_number":83,"context_line":"                                                var_options\u003dvar_options,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1e4b9d07_1c8cd0c2","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":2},"in_reply_to":"556e63fb_b940b084","updated":"2025-02-21 15:20:43.000000000","message":"Acknowledged","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"f15c90d83843196ee2b36019c4919c60c0ab56fb","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        self.no_hosts_remaining \u003d False"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def write_stats(self, buf):"},{"line_number":90,"context_line":"        \u0027\u0027\u0027Write statistics to file.\u0027\u0027\u0027"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        buf \u003d to_bytes(buf)"},{"line_number":93,"context_line":"        directory \u003d os.path.dirname(self.path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5beefa6b_06f841b2","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":2},"updated":"2024-04-18 15:56:38.000000000","message":"nit: this doc string on the other hand doesn\u0027t really add any value when compared with the functions name.\n\neither provide more detail, e.g. \"creating statistics directory and writing stats to file, when errors are encountered, these are reported\", or just omit the doc string? It might be necessary to have a docstring to please some linters though, I\u0027m not 100% sure how this is handled in a-c-k.","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"ad110a0ad0d4ac6b3a336573535b5bb61c37d897","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.no_hosts_remaining \u003d False"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def write_stats(self, buf):"},{"line_number":90,"context_line":"        \u0027\u0027\u0027Write statistics to file.\u0027\u0027\u0027"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        buf \u003d to_bytes(buf)"},{"line_number":93,"context_line":"        directory \u003d os.path.dirname(self.path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"eaef8705_7698a9a9","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":2},"in_reply_to":"5beefa6b_06f841b2","updated":"2024-06-25 10:01:00.000000000","message":"Done","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"f15c90d83843196ee2b36019c4919c60c0ab56fb","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def v2_playbook_on_stats(self, stats):"},{"line_number":119,"context_line":"        s \u003d Stats(no_hosts_remaining\u003dself.no_hosts_remaining)"},{"line_number":120,"context_line":"        hosts \u003d sorted(stats.processed.keys())"},{"line_number":121,"context_line":"        for h in hosts:"},{"line_number":122,"context_line":"            t \u003d stats.summarize(h)"},{"line_number":123,"context_line":"            if t[\u0027failures\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"a72238ab_d9b1bcfb","line":120,"range":{"start_line":120,"start_character":0,"end_line":120,"end_character":2},"updated":"2024-04-18 15:56:38.000000000","message":"why do these need to be sorted?","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":34212,"name":"Matt Anson","email":"matta@stackhpc.com","username":"m-anson","status":"StackHPC"},"change_message_id":"eaa577c4413a96ca5d45f008134f1215fad21b5a","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def v2_playbook_on_stats(self, stats):"},{"line_number":119,"context_line":"        s \u003d Stats(no_hosts_remaining\u003dself.no_hosts_remaining)"},{"line_number":120,"context_line":"        hosts \u003d sorted(stats.processed.keys())"},{"line_number":121,"context_line":"        for h in hosts:"},{"line_number":122,"context_line":"            t \u003d stats.summarize(h)"},{"line_number":123,"context_line":"            if t[\u0027failures\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"f517096a_95fed2a7","line":120,"range":{"start_line":120,"start_character":0,"end_line":120,"end_character":2},"in_reply_to":"a72238ab_d9b1bcfb","updated":"2025-02-21 15:20:43.000000000","message":"I don\u0027t think there is any specific reason other than it is easier to search a sorted list by eye - removed the sort.","commit_id":"24cdad4e78adf2100705ffb1dc5c5dac8a38c881"},{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"ad110a0ad0d4ac6b3a336573535b5bb61c37d897","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    CALLBACK_NEEDS_ENABLED \u003d True"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_options(self, task_keys\u003dNone, var_options\u003dNone, direct\u003dNone):"},{"line_number":80,"context_line":"        \u0027\u0027\u0027Collect options used by the plugin.\u0027\u0027\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        super(CallbackModule, self).set_options(task_keys\u003dtask_keys,"},{"line_number":83,"context_line":"                                                var_options\u003dvar_options,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba632385_7585c754","line":80,"range":{"start_line":80,"start_character":11,"end_line":80,"end_character":18},"updated":"2024-06-25 10:01:00.000000000","message":"The docstring doesn\u0027t really match the name of the function and the function body.\nDo we collect, e.g. read something, or do we set (write) something? or both? :)","commit_id":"2f91f93c4aa342c4d4a7e246948e6b8c534e8847"},{"author":{"_account_id":34212,"name":"Matt Anson","email":"matta@stackhpc.com","username":"m-anson","status":"StackHPC"},"change_message_id":"eaa577c4413a96ca5d45f008134f1215fad21b5a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    CALLBACK_NEEDS_ENABLED \u003d True"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def set_options(self, task_keys\u003dNone, var_options\u003dNone, direct\u003dNone):"},{"line_number":80,"context_line":"        \u0027\u0027\u0027Collect options used by the plugin.\u0027\u0027\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        super(CallbackModule, self).set_options(task_keys\u003dtask_keys,"},{"line_number":83,"context_line":"                                                var_options\u003dvar_options,"}],"source_content_type":"text/x-python","patch_set":6,"id":"d6d2b8a4_bf3d3217","line":80,"range":{"start_line":80,"start_character":11,"end_line":80,"end_character":18},"in_reply_to":"ba632385_7585c754","updated":"2025-02-21 15:20:43.000000000","message":"\"set\" is used in in the function name and body, so use \"Set\" in the docstring.","commit_id":"2f91f93c4aa342c4d4a7e246948e6b8c534e8847"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"DOCUMENTATION \u003d \u0027\u0027\u0027"},{"line_number":7,"context_line":"    name: stats"},{"line_number":8,"context_line":"    type: notification"},{"line_number":9,"context_line":"    short_description: Save Ansible statistics to a JSON file"},{"line_number":10,"context_line":"    options:"},{"line_number":11,"context_line":"        kolla_stats_path:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5bbc39a3_3f1e3977","line":8,"updated":"2026-06-08 15:37:29.000000000","message":"Doesn\u0027t that conflict with CALLBACK_TYPE \u003d \u0027aggregate\u0027? Where does that code support type: notification?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"import json"},{"line_number":41,"context_line":"import os"},{"line_number":42,"context_line":"from typing import List"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"from ansible.module_utils._text import to_bytes"},{"line_number":45,"context_line":"from ansible.module_utils._text import to_text"}],"source_content_type":"text/x-python","patch_set":10,"id":"a3e0faca_040faded","line":42,"updated":"2026-06-08 15:37:29.000000000","message":"Unnecessary on Python 3.9+","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":66,"context_line":"        self.no_hosts_remaining \u003d no_hosts_remaining"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def to_json(self):"},{"line_number":69,"context_line":"        return json.dumps(self.__dict__)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class CallbackModule(CallbackBase):"}],"source_content_type":"text/x-python","patch_set":10,"id":"b7fc5e48_38f046e9","line":69,"updated":"2026-06-08 15:37:29.000000000","message":"Documentation shows indented output, are you sure that doesn\u0027t need any indenting?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":85,"context_line":"                                                direct\u003ddirect)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.path \u003d self.get_option(\u0027kolla_stats_path\u0027)"},{"line_number":88,"context_line":"        self.no_hosts_remaining \u003d False"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def write_stats(self, buf):"},{"line_number":91,"context_line":"        \"\"\"Write Kolla Ansible statistics to kolla_stats_path file.\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"c2633dc2_3240cfec","line":88,"updated":"2026-06-08 15:37:29.000000000","message":"Where is this used?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":116,"context_line":"        succeeds, and removed from it when a task targeting it fails,"},{"line_number":117,"context_line":"        or the host is unreachable."},{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":"        self.current_ok_hosts \u003d []"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def v2_runner_on_ok(self, result, **kwargs):"},{"line_number":122,"context_line":"        \"\"\"Add host to list of ok hosts when a task succeeds.\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"8d27012a_8bc31fa2","line":119,"updated":"2026-06-08 15:37:29.000000000","message":"It\u0027s only initialised here, if playbook will have no plays - we\u0027ll get a backtrace","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"68d0eaf904054251375df0afe42f43839872deeb","unresolved":true,"context_lines":[{"line_number":131,"context_line":"            self.current_ok_hosts.remove(host)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def v2_runner_on_failed(self, result, **kwargs):"},{"line_number":134,"context_line":"        \"\"\"Remove host from list of ok hosts a task fails.\"\"\""},{"line_number":135,"context_line":"        host \u003d result._host.name"},{"line_number":136,"context_line":"        if host in self.current_ok_hosts:"},{"line_number":137,"context_line":"            self.current_ok_hosts.remove(host)"}],"source_content_type":"text/x-python","patch_set":10,"id":"0b8490e8_e19b7be7","line":134,"range":{"start_line":134,"start_character":45,"end_line":134,"end_character":58},"updated":"2026-06-08 15:37:29.000000000","message":"when a task fails?","commit_id":"d23c457f1a83bf0ca1dab6dd7b4182ce836cf412"}],"tox.ini":[{"author":{"_account_id":32553,"name":"Sven Kieske","email":"sven_oss@posteo.de","username":"skieske"},"change_message_id":"62494ed153bd80697a48e2a52345c92abe8e9cd6","unresolved":true,"context_lines":[{"line_number":100,"context_line":"show-source \u003d True"},{"line_number":101,"context_line":"# NOTE: Default ignore list is *not* empty!"},{"line_number":102,"context_line":"# W504 line break after binary operator"},{"line_number":103,"context_line":"# E402 module level import not at top of file"},{"line_number":104,"context_line":"# (W503 and W504 are incompatible and we need to choose one of them."},{"line_number":105,"context_line":"#  Existing codes follows W503, so we disable W504.):"},{"line_number":106,"context_line":"ignore \u003d E402,W504"}],"source_content_type":"text/x-properties","patch_set":2,"id":"f3ab32e6_e1f19b0c","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":2},"updated":"2024-02-28 16:09:53.000000000","message":"why can\u0027t the import not be at top of file?","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"1d9232260b20447dda965f63fe1dfd4b50eb762c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"show-source \u003d True"},{"line_number":101,"context_line":"# NOTE: Default ignore list is *not* empty!"},{"line_number":102,"context_line":"# W504 line break after binary operator"},{"line_number":103,"context_line":"# E402 module level import not at top of file"},{"line_number":104,"context_line":"# (W503 and W504 are incompatible and we need to choose one of them."},{"line_number":105,"context_line":"#  Existing codes follows W503, so we disable W504.):"},{"line_number":106,"context_line":"ignore \u003d E402,W504"}],"source_content_type":"text/x-properties","patch_set":2,"id":"ea319500_0248574e","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":2},"in_reply_to":"63c2e446_e2d2ca72","updated":"2024-04-12 09:09:08.000000000","message":"Done","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"},{"author":{"_account_id":14826,"name":"Mark Goddard","email":"markgoddard86@gmail.com","username":"mgoddard"},"change_message_id":"063047dabd45bc171ab630a9eca6749ad8c8a439","unresolved":true,"context_lines":[{"line_number":100,"context_line":"show-source \u003d True"},{"line_number":101,"context_line":"# NOTE: Default ignore list is *not* empty!"},{"line_number":102,"context_line":"# W504 line break after binary operator"},{"line_number":103,"context_line":"# E402 module level import not at top of file"},{"line_number":104,"context_line":"# (W503 and W504 are incompatible and we need to choose one of them."},{"line_number":105,"context_line":"#  Existing codes follows W503, so we disable W504.):"},{"line_number":106,"context_line":"ignore \u003d E402,W504"}],"source_content_type":"text/x-properties","patch_set":2,"id":"63c2e446_e2d2ca72","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":2},"in_reply_to":"f3ab32e6_e1f19b0c","updated":"2024-02-29 14:34:58.000000000","message":"Ansible sanity tests complain. I\u0027m not sure of the reason.","commit_id":"ec35c76b8e14b6d8c74c93130410340023ed9063"}]}
