)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"2f17e57e8fb9efc4b1b5459322d2343e49825532","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3070d5a6_41e78f22","updated":"2026-01-19 17:57:48.000000000","message":"I\u0027m still working on the discover mechanism.","commit_id":"1c1045a606561baad4181541131fe0bffcbd08f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"2fb3e13abbb69af24e9139a6192f673a68e55c91","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"55a53170_4e4fca6b","updated":"2026-01-29 18:15:59.000000000","message":"Looks like there is bug in the iterated container handler - try again with this: https://review.opendev.org/c/openstack/kolla-ansible/+/975192\n\nI think there is another issue with when the feature is off, will come back to that.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"f73ce9ffd7b32bc247fb4cb010dae5e3c8b3de22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"7f2c5146_69a3e105","updated":"2026-02-23 10:07:22.000000000","message":"CI fail is reassuring, since required groups are not defined:\n\n```\nfailed: [primary] (item\u003d4) \u003d\u003e {\n\"ansible_loop_var\": \"item\",\n\"changed\": false,\n\"item\": 4,\n\"msg\": \"Ansible inventory does not contain the expected group nova-compute-ironic-4 for service nova-compute-ironic in nova.\"\n}\nfailed: [secondary2] (item\u003d3) \u003d\u003e {\n\"ansible_loop_var\": \"item\",\n\"changed\": false,\n\"item\": 3,\n\"msg\": \"Ansible inventory does not contain the expected group nova-compute-ironic-3 for service nova-compute-ironic in nova.\"\n}\nfailed: [secondary2] (item\u003d4) \u003d\u003e {\n\"ansible_loop_var\": \"item\",\n\"changed\": false,\n\"item\": 4,\n\"msg\": \"Ansible inventory does not contain the expected group nova-compute-ironic-4 for service nova-compute-ironic in nova.\"\n}\nfailed: [secondary1] (item\u003d4) \u003d\u003e {\n\"ansible_loop_var\": \"item\",\n\"changed\": false,\n\"item\": 4,\n\"msg\": \"Ansible inventory does not contain the expected group nova-compute-ironic-4 for service nova-compute-ironic in nova.\"\n}\n```","commit_id":"74127ccebbe0013cc8ad531585d5d14ba1edd548"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"b47f90dfce2d3d38e397c4c8501d596646ed420e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"27130e39_ebe2f558","updated":"2026-04-09 08:28:37.000000000","message":"It\u0027s also worth noting that in the multi-compute-ironic job, the nova-compute-ironic-2 service on host secondary1 has picked up the \u0027tenks node\u0027 which is as expected, since it manages nodes in shard_1, location_1. We see this *only* in the nova-compute-ironic-2 logs:\n```\n2026-04-08 22:38:57.643 7 DEBUG nova.scheduler.client.report [None req-a10bf607-d613-4202-b3a7-83c38fb174e6 - - - - - -] Inventory has not changed for provider 19954c05-07d6-465a-99a6-ef7122c8844d based on inventory data: {\u0027CUSTOM_TEST_RC\u0027: {\u0027total\u0027: 1, \u0027reserved\u0027: 1, \u0027min_unit\u0027: 1, \u0027max_unit\u0027: 1, \u0027step_size\u0027: 1, \u0027allocation_ratio\u0027: 1.0}} set_inventory_for_provider /var/lib/kolla/venv/lib/python3.12/site-packages/nova/scheduler/client/report.py:958\n```","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"d50ecc8316d5ba1be14197a4606315dfc6a2cfa0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"242c2d06_78e6ec5c","updated":"2026-04-09 08:20:43.000000000","message":"The Ironic job looks happy with the feature off which is encouraging.\n\nI\u0027m seeing a power sync failure with the \u0027tenks node\u0027 on the multi-compute-ironic job. It\u0027s not clear what\u0027s causing that yet, or if it\u0027s some sporadic failure. The node is bound to the conductor on secondary1, which looks to be correct, since that has conductor_group \u003d location_1, which matches how the node is configured.","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"3cd0ecb9cf998f62897f11d3ef604ea263cee43f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":39,"id":"16e31a92_cdfd2b97","updated":"2026-04-09 13:22:59.000000000","message":"What is the upgrade path from the legacy single-instance config? The cleanup task only iterates numbered instances (_1, _2, …) and won\u0027t remove the legacy nova-compute-ironic/ config directory. Does the user need to handle that manually?\n\nI think we should add this to the reno ?","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"ed79e63224e7170a2fdb4884567baf10a01200bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"db7308b7_6a59d2a0","in_reply_to":"16e31a92_cdfd2b97","updated":"2026-04-09 14:06:06.000000000","message":"Thanks, yeah, I\u0027ve added a note in the documentation, and the reno as you suggest.\n\nThe cleanup task could be improved in a follow up patch. The current functionality is most useful for moving the numbered instances around between controllers, which you might want to do if you took a controller out for maintenance etc.","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"615550f7d1c7916e26411e60ec55e6db5bee025d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"809b7509_ac29aee6","in_reply_to":"242c2d06_78e6ec5c","updated":"2026-04-09 09:59:43.000000000","message":"Tenks is only installed on the primary node, so I think we need to ensure that the conductor managing the tenks node is running on the same node for the purposes of the test.","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"2ff7372855e76500c82ec1e8d317506b464f2743","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":40,"id":"a3d1e5ca_0244eeb5","updated":"2026-04-09 10:27:46.000000000","message":"I\u0027m starting to feel that nova-cell role complexity is starting to go over the roof - can you break out nova-compute-ironic to a separate role?","commit_id":"dc0dd21b34c9239ffaeb074cb8722d8a57f5de50"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"0dcbd08562591b0bb93a71c8b3304d0ac67f824d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":40,"id":"a5b9d242_fab5908b","in_reply_to":"7f15d5c7_41a8f748","updated":"2026-04-09 10:56:57.000000000","message":"I think it\u0027s extremely late in the cycle to drop things last minute before release, especially it\u0027s not like we\u0027re dropping a whole role.\n\nI\u0027m happy to lift my -1 if there are other core reviewers interested in reviewing this to be merged.","commit_id":"dc0dd21b34c9239ffaeb074cb8722d8a57f5de50"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"6189c5c54ecb20f855a44b8e9e4584e856075d0b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":40,"id":"7f15d5c7_41a8f748","in_reply_to":"a3d1e5ca_0244eeb5","updated":"2026-04-09 10:53:02.000000000","message":"I could consider it as a separate patch, but I don\u0027t have time for it right now, and this feature is in demand by various sites. I really want to get it merged this cycle.\n\nI think another way of reducing complexity is to propose dropping support for the \u0027legacy mode\u0027 and move to supporting only this new mode. What do you think about that?","commit_id":"dc0dd21b34c9239ffaeb074cb8722d8a57f5de50"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"d2465b3c4f11871290e292e9c17d1580d599b3bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"e862073f_c2749f2e","in_reply_to":"a5b9d242_fab5908b","updated":"2026-04-09 11:01:14.000000000","message":"Thanks for removing that. Sorry, what I meant was to propose the deprecation of the legacy mode this cycle.","commit_id":"dc0dd21b34c9239ffaeb074cb8722d8a57f5de50"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"c9a6e613e768c6c098475bf34b1b53a1a64cfafb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"b214c353_1ef6d99a","updated":"2026-04-09 16:34:22.000000000","message":"CI fail waiting for the tenks node to inspect. The tenks node PXE boots and loads IPA - it\u0027s not clear if it just needed more time.","commit_id":"37a29f5f96464e11623ad9a14ff4d3e220422a94"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"ed79e63224e7170a2fdb4884567baf10a01200bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"76eedc0d_9cdd56cf","updated":"2026-04-09 14:06:06.000000000","message":"Many thanks for reviewing Bertrand! I have hopefully addressed your comments but please let me know if I\u0027ve missed something.","commit_id":"37a29f5f96464e11623ad9a14ff4d3e220422a94"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"3e83aca149cc3dde7d0739890eb80c0241073aca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":42,"id":"6d2d490f_09f5ce35","updated":"2026-04-09 14:07:53.000000000","message":"looks like the last CI run failed on AI crawler opendev overload right at the end","commit_id":"7becfacae72bf0bcf2d55602107e49ae7810a06e"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"4414d0a10ad041b6eb1a328dde7f2570dff72d65","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"03494496_81d5046e","updated":"2026-04-10 10:07:16.000000000","message":"seems close to be mergable","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"868293498e8b619dc026cb82b91bd19eb9d693c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":47,"id":"e99ba70c_d20b6d64","updated":"2026-04-13 17:06:04.000000000","message":"Many thanks for reviewing @bartosz@stackhpc.com, some good points you raised.\n\nI think the CI is failing because of routing issues. We see the tenks node PXE boot, but I think there is an asymmetric route when IPA tries to call back which causes it to hang. The gateway from the inspection network is set as the primary node IP on the API network, and all nodes have IPs on both networks. I think that needs cleaning up - and we need to add a router. For now I\u0027ve tried scaling back the control plane to test the theory.","commit_id":"e23c10acb998c2ab6e8c79da9888daccca5d111e"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":49,"id":"38a908b1_b472eb46","updated":"2026-04-17 14:07:08.000000000","message":"I\u0027m not convinced we need a separate scenario for that, can\u0027t we wire that in the ironic scenario?","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"6c4cf000205a9dfbb2cc8586eaddca86e70fe706","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"bc689584_2dad72ab","updated":"2026-04-16 12:37:12.000000000","message":"recheck IPA fetch timeout","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"0141ba8727a5e5563926c87984bf14e9cf817e11","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":49,"id":"3810103d_52b825da","in_reply_to":"075027a3_40392a5c","updated":"2026-04-17 14:34:26.000000000","message":"I was rather proposing extending the current ironic scenario with multimode? Do we loose anything then?","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"2b8c2a28_a3098752","in_reply_to":"3810103d_52b825da","updated":"2026-04-17 16:24:00.000000000","message":"Yeah, that makes sense. I can take it on as a separate task. What we need is to add a router and configure source path routing. I was also thinking that we could add a couple more tenks nodes, so we can assign them to different shards / conductor groups etc. I\u0027m happy to pick that up and then we can have a single multi-node ironic job. I have something in the works, can discuss more at the PTG perhaps, but I don\u0027t want to start adding it in this patch.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"69ae70e9f348f2aed74756abf9265a07d2a38198","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":49,"id":"075027a3_40392a5c","in_reply_to":"38a908b1_b472eb46","updated":"2026-04-17 14:15:19.000000000","message":"The reason for the multi-node scenario is to test that you can place nova-compute-ironic-foo on host bar only. We would lose that coverage if I drop back to a single node.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"}],"ansible/roles/ironic/defaults/main.yml":[{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"c77e4eea9664ded2ac54b3d96a2eba456a696184","unresolved":true,"context_lines":[{"line_number":215,"context_line":"  - \"/dev:/dev\""},{"line_number":216,"context_line":"  - \"/run:/run{{ \u0027:shared\u0027 if kolla_container_engine \u003d\u003d \u0027docker\u0027 else \u0027\u0027 }}\""},{"line_number":217,"context_line":"  - \"kolla_logs:/var/log/kolla\""},{"line_number":218,"context_line":"  - \"ironic:/var/lib/ironic\""},{"line_number":219,"context_line":"  - \"{{ kolla_dev_repos_directory ~ \u0027/ironic:/dev-mode/ironic\u0027 if ironic_dev_mode | bool else \u0027\u0027 }}\""},{"line_number":220,"context_line":"  - \"{{ \u0027ironic_prometheus_exporter_data:/var/lib/ironic-metrics\u0027 if enable_ironic_prometheus_exporter | bool else \u0027\u0027 }}\""},{"line_number":221,"context_line":"ironic_tftp_default_volumes:"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"161fab95_b3339073","line":218,"updated":"2026-01-19 17:57:11.000000000","message":"note: this is shared with other containers - we need to unpick it and create conductor specific volumes for some of the state","commit_id":"1c1045a606561baad4181541131fe0bffcbd08f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"b84bcc48e08542ca02640be48a0010dbc4fde5de","unresolved":false,"context_lines":[{"line_number":215,"context_line":"  - \"/dev:/dev\""},{"line_number":216,"context_line":"  - \"/run:/run{{ \u0027:shared\u0027 if kolla_container_engine \u003d\u003d \u0027docker\u0027 else \u0027\u0027 }}\""},{"line_number":217,"context_line":"  - \"kolla_logs:/var/log/kolla\""},{"line_number":218,"context_line":"  - \"ironic:/var/lib/ironic\""},{"line_number":219,"context_line":"  - \"{{ kolla_dev_repos_directory ~ \u0027/ironic:/dev-mode/ironic\u0027 if ironic_dev_mode | bool else \u0027\u0027 }}\""},{"line_number":220,"context_line":"  - \"{{ \u0027ironic_prometheus_exporter_data:/var/lib/ironic-metrics\u0027 if enable_ironic_prometheus_exporter | bool else \u0027\u0027 }}\""},{"line_number":221,"context_line":"ironic_tftp_default_volumes:"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"5389f4fa_34c40111","line":218,"in_reply_to":"161fab95_b3339073","updated":"2026-03-26 17:53:27.000000000","message":"Done","commit_id":"1c1045a606561baad4181541131fe0bffcbd08f7"}],"ansible/roles/nova-cell/defaults/main.yml":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a606ac60cfba4f00f45c5dedbab0d2b505f1f77b","unresolved":true,"context_lines":[{"line_number":72,"context_line":"    volumes: \"{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}\""},{"line_number":73,"context_line":"    dimensions: \"{{ nova_compute_ironic_dimensions }}\""},{"line_number":74,"context_line":"    healthcheck: \"{{ nova_compute_ironic_healthcheck }}\""},{"line_number":75,"context_line":"    iterate: \"{{ true if nova_multi_compute_ironic_config is defined else false }}\""},{"line_number":76,"context_line":"    iterate_var: \"{{ nova_multi_compute_ironic_config | length }}\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"####################"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"be9d79bb_1849eb85","line":75,"updated":"2026-02-02 09:32:59.000000000","message":"Should we define nova_multi_compute_ironic_config default in this file? I have forgotten what is normal for that.","commit_id":"1c1045a606561baad4181541131fe0bffcbd08f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"915c0e7d1d83f89eb4f9918a38d3e27b9bc6b6e0","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    volumes: \"{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}\""},{"line_number":73,"context_line":"    dimensions: \"{{ nova_compute_ironic_dimensions }}\""},{"line_number":74,"context_line":"    healthcheck: \"{{ nova_compute_ironic_healthcheck }}\""},{"line_number":75,"context_line":"    iterate: \"{{ true if nova_multi_compute_ironic_config is defined else false }}\""},{"line_number":76,"context_line":"    iterate_var: \"{{ nova_multi_compute_ironic_config | length }}\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"####################"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"f35799d1_2a3f5ec1","line":75,"in_reply_to":"3b7b6314_b5773438","updated":"2026-03-26 17:52:59.000000000","message":"Done","commit_id":"1c1045a606561baad4181541131fe0bffcbd08f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"08ca5d8a8347063baa5ecc564ea38368122c6cdc","unresolved":true,"context_lines":[{"line_number":72,"context_line":"    volumes: \"{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}\""},{"line_number":73,"context_line":"    dimensions: \"{{ nova_compute_ironic_dimensions }}\""},{"line_number":74,"context_line":"    healthcheck: \"{{ nova_compute_ironic_healthcheck }}\""},{"line_number":75,"context_line":"    iterate: \"{{ true if nova_multi_compute_ironic_config is defined else false }}\""},{"line_number":76,"context_line":"    iterate_var: \"{{ nova_multi_compute_ironic_config | length }}\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"####################"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"3b7b6314_b5773438","line":75,"in_reply_to":"be9d79bb_1849eb85","updated":"2026-02-02 12:39:08.000000000","message":"We could do. Or in ``globals.yml``. I will come back to that","commit_id":"1c1045a606561baad4181541131fe0bffcbd08f7"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"3cd0ecb9cf998f62897f11d3ef604ea263cee43f","unresolved":true,"context_lines":[{"line_number":72,"context_line":"    volumes: \"{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}\""},{"line_number":73,"context_line":"    dimensions: \"{{ nova_compute_ironic_dimensions }}\""},{"line_number":74,"context_line":"    healthcheck: \"{{ nova_compute_ironic_healthcheck }}\""},{"line_number":75,"context_line":"    iterate: \"{{ true if nova_multi_compute_ironic_config | length \u003e 0 else false }}\""},{"line_number":76,"context_line":"    iterate_var: \"{{ nova_multi_compute_ironic_config | length }}\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"####################"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"3f88edda_6d69c2a8","line":75,"updated":"2026-04-09 13:22:59.000000000","message":"```suggestion\n    iterate: \"{{ nova_multi_compute_ironic_config | length \u003e 0 }}\"\n```","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"ed79e63224e7170a2fdb4884567baf10a01200bf","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    volumes: \"{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}\""},{"line_number":73,"context_line":"    dimensions: \"{{ nova_compute_ironic_dimensions }}\""},{"line_number":74,"context_line":"    healthcheck: \"{{ nova_compute_ironic_healthcheck }}\""},{"line_number":75,"context_line":"    iterate: \"{{ true if nova_multi_compute_ironic_config | length \u003e 0 else false }}\""},{"line_number":76,"context_line":"    iterate_var: \"{{ nova_multi_compute_ironic_config | length }}\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"####################"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"3fc76ab7_99f2ebfe","line":75,"in_reply_to":"3f88edda_6d69c2a8","updated":"2026-04-09 14:06:06.000000000","message":"Done","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"}],"ansible/roles/nova-cell/handlers/main.yml":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a606ac60cfba4f00f45c5dedbab0d2b505f1f77b","unresolved":true,"context_lines":[{"line_number":163,"context_line":"    service_name: \"nova-compute-ironic\""},{"line_number":164,"context_line":"    service: \"{{ nova_cell_services[service_name] }}\""},{"line_number":165,"context_line":"    range_start: \"{{ (1 if nova_multi_compute_ironic_config is defined else 0) }}\""},{"line_number":166,"context_line":"    range_end: \"{{ nova_multi_compute_ironic_config | default([]) | length + 1 }}\""},{"line_number":167,"context_line":"    container_name_postfix: \"{{ \u0027_\u0027 + item | string if item | int \u003e 0 else \u0027\u0027 }}\""},{"line_number":168,"context_line":"  become: true"},{"line_number":169,"context_line":"  kolla_container:"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"0737438b_03e29e78","line":166,"updated":"2026-02-02 09:32:59.000000000","message":"Would it be easier to do something like a list per inventory hostname? Not sure myself:\n\n    nova_multi_compute_ironic_config[inventory_hostname] | length","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"08ca5d8a8347063baa5ecc564ea38368122c6cdc","unresolved":true,"context_lines":[{"line_number":163,"context_line":"    service_name: \"nova-compute-ironic\""},{"line_number":164,"context_line":"    service: \"{{ nova_cell_services[service_name] }}\""},{"line_number":165,"context_line":"    range_start: \"{{ (1 if nova_multi_compute_ironic_config is defined else 0) }}\""},{"line_number":166,"context_line":"    range_end: \"{{ nova_multi_compute_ironic_config | default([]) | length + 1 }}\""},{"line_number":167,"context_line":"    container_name_postfix: \"{{ \u0027_\u0027 + item | string if item | int \u003e 0 else \u0027\u0027 }}\""},{"line_number":168,"context_line":"  become: true"},{"line_number":169,"context_line":"  kolla_container:"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"ef3f2041_84e5e30f","line":166,"in_reply_to":"0737438b_03e29e78","updated":"2026-02-02 12:39:08.000000000","message":"This could lead to services changing their name when moving host (see comment below).","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"4f04e7faa96d5684171d844a88a31ddd77c8e1f8","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    service_name: \"nova-compute-ironic\""},{"line_number":164,"context_line":"    service: \"{{ nova_cell_services[service_name] }}\""},{"line_number":165,"context_line":"    range_start: \"{{ (1 if nova_multi_compute_ironic_config is defined else 0) }}\""},{"line_number":166,"context_line":"    range_end: \"{{ nova_multi_compute_ironic_config | default([]) | length + 1 }}\""},{"line_number":167,"context_line":"    container_name_postfix: \"{{ \u0027_\u0027 + item | string if item | int \u003e 0 else \u0027\u0027 }}\""},{"line_number":168,"context_line":"  become: true"},{"line_number":169,"context_line":"  kolla_container:"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"4154ab62_736d61e8","line":166,"in_reply_to":"ef3f2041_84e5e30f","updated":"2026-03-06 17:17:24.000000000","message":"Done","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"}],"ansible/roles/nova-cell/tasks/cleanup.yml":[{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"3cd0ecb9cf998f62897f11d3ef604ea263cee43f","unresolved":true,"context_lines":[{"line_number":10,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":11,"context_line":"  when:"},{"line_number":12,"context_line":"    - service.iterate | bool"},{"line_number":13,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"- name: Removing config for unmanaged services"},{"line_number":16,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"80a19dd3_b98540f0","line":13,"updated":"2026-04-09 13:22:59.000000000","message":"If nova_multi_compute_ironic_config was previously longer (e.g. 4 entries) and is now shorter (e.g. 2 entries), the cleanup task iterates over indices 1–4 but groups nova-compute-ironic-3 and nova-compute-ironic-4 may no longer exist in inventory, causing a hard error instead of a no-op. Should guard with something like:\n\n`\"\u0027nova-compute-ironic-\u0027 ~ item not in groups or inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]\"`","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"ed79e63224e7170a2fdb4884567baf10a01200bf","unresolved":true,"context_lines":[{"line_number":10,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":11,"context_line":"  when:"},{"line_number":12,"context_line":"    - service.iterate | bool"},{"line_number":13,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"- name: Removing config for unmanaged services"},{"line_number":16,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"dcc4c510_e0a26310","line":13,"in_reply_to":"80a19dd3_b98540f0","updated":"2026-04-09 14:06:06.000000000","message":"It\u0027s a good point. I think if you reduce the length of ``nova_multi_compute_ironic_config``, then the old services will be left hanging around since ``iterate_var`` comes from there.\n\nI\u0027ve added a note about the limitations. I think a manual cleanup is required if you decrease the number of instances. At least I don\u0027t think this will be a common event. Do you think that is enough, or maybe I missed something?","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"81c22042368c06207ed5fced798805c79469142d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":11,"context_line":"  when:"},{"line_number":12,"context_line":"    - service.iterate | bool"},{"line_number":13,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"- name: Removing config for unmanaged services"},{"line_number":16,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"d64ab082_00a1bc78","line":13,"in_reply_to":"dcc4c510_e0a26310","updated":"2026-04-09 14:40:34.000000000","message":"Yh I kind of agree, even tho my idealistic self would like it to be handled, it\u0027s probbly too much effort for too little result. Adding a mention of it in documentation is probbly the right move.","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"3cd0ecb9cf998f62897f11d3ef604ea263cee43f","unresolved":true,"context_lines":[{"line_number":23,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":24,"context_line":"  when:"},{"line_number":25,"context_line":"    - service.iterate | bool"},{"line_number":26,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"dcd596ad_0df121bc","line":26,"updated":"2026-04-09 13:22:59.000000000","message":"ditto","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"ed79e63224e7170a2fdb4884567baf10a01200bf","unresolved":false,"context_lines":[{"line_number":23,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":24,"context_line":"  when:"},{"line_number":25,"context_line":"    - service.iterate | bool"},{"line_number":26,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"2c0200dc_faf92e44","line":26,"in_reply_to":"dcd596ad_0df121bc","updated":"2026-04-09 14:06:06.000000000","message":"please see above","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"f4281ae8abed12fcec54faa2e44420ec5cf07c97","unresolved":true,"context_lines":[{"line_number":7,"context_line":"  kolla_container:"},{"line_number":8,"context_line":"    action: \"stop_and_remove_container\""},{"line_number":9,"context_line":"    name: \"{{ service.container_name + \u0027_\u0027 ~ item }}\""},{"line_number":10,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":11,"context_line":"  when:"},{"line_number":12,"context_line":"    - service.iterate | bool"},{"line_number":13,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"7eaea256_0485b156","line":10,"updated":"2026-04-10 11:30:43.000000000","message":"It only checks instances from current config, so this is only for moving existing instances to other hosts? If before it was 4 and now it is 2, old nova_compute_ironic_3 and _4 are never checked and can stay running.\nAlso upgrade path does not call this cleanup, as it probably should.","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"868293498e8b619dc026cb82b91bd19eb9d693c9","unresolved":true,"context_lines":[{"line_number":7,"context_line":"  kolla_container:"},{"line_number":8,"context_line":"    action: \"stop_and_remove_container\""},{"line_number":9,"context_line":"    name: \"{{ service.container_name + \u0027_\u0027 ~ item }}\""},{"line_number":10,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":11,"context_line":"  when:"},{"line_number":12,"context_line":"    - service.iterate | bool"},{"line_number":13,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"874bb351_6e56077d","line":10,"in_reply_to":"7eaea256_0485b156","updated":"2026-04-13 17:06:04.000000000","message":"That\u0027s correct. Please see discussion above with Bertrand. I added a note in the documentation about the limitations. The intended use case is to help with moving running service instances around to support maintenance operations.\n\nFor this reason, I don\u0027t think it /needs/ to go in the upgrade path, but I can add it there if you want.\n\nI could look at extending cleanup in a later patch - it is a more general issue that applies to all services.","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"fca3cc350c394ac3cb292a4af5be75a0d7414f16","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  kolla_container:"},{"line_number":8,"context_line":"    action: \"stop_and_remove_container\""},{"line_number":9,"context_line":"    name: \"{{ service.container_name + \u0027_\u0027 ~ item }}\""},{"line_number":10,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""},{"line_number":11,"context_line":"  when:"},{"line_number":12,"context_line":"    - service.iterate | bool"},{"line_number":13,"context_line":"    - inventory_hostname not in groups[\u0027nova-compute-ironic-\u0027 ~ item]"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"82f51757_d647a000","line":10,"in_reply_to":"874bb351_6e56077d","updated":"2026-04-17 13:20:49.000000000","message":"Acknowledged","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"}],"ansible/roles/nova-cell/tasks/config-compute-ironic.yml":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":26,"context_line":"- name: \"Generate config files for Nova Compute Ironic {{ item }}\""},{"line_number":27,"context_line":"  vars:"},{"line_number":28,"context_line":"    service_name: \"nova-compute-ironic\""},{"line_number":29,"context_line":"    nova_compute_shard_key: \"{{ nova_multi_compute_ironic_instance_config.get(\u0027shard_key\u0027, \u0027default\u0027) }}\""},{"line_number":30,"context_line":"    nova_compute_conductor_group: \"{{ nova_multi_compute_ironic_instance_config.get(\u0027conductor_group\u0027, \u0027default\u0027) }}\""},{"line_number":31,"context_line":"    nova_compute_ironic_custom_host: \"{{ nova_multi_compute_ironic_instance_config.get(\u0027custom_host\u0027, \u0027\u0027) }}\""},{"line_number":32,"context_line":"    nova_compute_ironic_id: \"{{ item }}\""}],"source_content_type":"text/x-yaml","patch_set":49,"id":"7e04b916_26d7dc54","line":29,"updated":"2026-04-17 14:07:08.000000000","message":"I\u0027m not convinced to that, .get() will only work when the dict variable is undefined. If it will be an empty string - we\u0027re going most probably to have a problem? Jinja2 default filter would handle empty strings as well and we wouldn\u0027t have the ,,type rigidity\u0027\u0027 problem - because if for some reason that dict doesn\u0027t get to be a dict - it\u0027s going to fail again.\nNot even mentioning that the coding standard in Kolla-Ansible is rather using the Jinja2 default filter, no need to introduce coding to a DSL based configuration management tool (especially that you\u0027re using default filter in Jinja2 template - so some consistency would be nice)","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"- name: \"Generate config files for Nova Compute Ironic {{ item }}\""},{"line_number":27,"context_line":"  vars:"},{"line_number":28,"context_line":"    service_name: \"nova-compute-ironic\""},{"line_number":29,"context_line":"    nova_compute_shard_key: \"{{ nova_multi_compute_ironic_instance_config.get(\u0027shard_key\u0027, \u0027default\u0027) }}\""},{"line_number":30,"context_line":"    nova_compute_conductor_group: \"{{ nova_multi_compute_ironic_instance_config.get(\u0027conductor_group\u0027, \u0027default\u0027) }}\""},{"line_number":31,"context_line":"    nova_compute_ironic_custom_host: \"{{ nova_multi_compute_ironic_instance_config.get(\u0027custom_host\u0027, \u0027\u0027) }}\""},{"line_number":32,"context_line":"    nova_compute_ironic_id: \"{{ item }}\""}],"source_content_type":"text/x-yaml","patch_set":49,"id":"d5416f39_666ce0f5","line":29,"in_reply_to":"7e04b916_26d7dc54","updated":"2026-04-17 16:24:00.000000000","message":"You can see it working in the CI job - there is a `default-default-ironic` host. But I have changed it none-the-less. get() should be more performant fwiw.\n\nFor reference, please could you share a link to the coding standard?","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"38b811da42a265e83e17aa16587d76284061ba49","unresolved":true,"context_lines":[{"line_number":37,"context_line":"      - \"{{ node_custom_config }}/nova.conf\""},{"line_number":38,"context_line":"      - \"{{ node_custom_config }}/nova/{{ service_name }}.conf\""},{"line_number":39,"context_line":"      - \"{{ node_custom_config }}/nova/{{ service_name }}-{{ item }}.conf\""},{"line_number":40,"context_line":"      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/nova.conf\""},{"line_number":41,"context_line":"      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/{{ service_name }}-{{ item }}.conf\""},{"line_number":42,"context_line":"    dest: \"{{ node_config_directory }}/nova-compute-ironic-{{ item }}/nova.conf\""},{"line_number":43,"context_line":"    mode: \"0660\""},{"line_number":44,"context_line":"  become: true"}],"source_content_type":"text/x-yaml","patch_set":53,"id":"20771fe0_58e6d48a","line":41,"range":{"start_line":40,"start_character":1,"end_line":41,"end_character":1},"updated":"2026-04-23 09:26:23.000000000","message":"```suggestion\n      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/nova.conf\"\n      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/{{ service_name }}.conf\"\n      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/{{ service_name }}-{{ item }}.conf\"\n```","commit_id":"9b7d7a903533528359c8f5ea08f74786f0ec7550"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"372b8ffbae0c0efd9fb89ee4c82aadf6e1b1759d","unresolved":true,"context_lines":[{"line_number":37,"context_line":"      - \"{{ node_custom_config }}/nova.conf\""},{"line_number":38,"context_line":"      - \"{{ node_custom_config }}/nova/{{ service_name }}.conf\""},{"line_number":39,"context_line":"      - \"{{ node_custom_config }}/nova/{{ service_name }}-{{ item }}.conf\""},{"line_number":40,"context_line":"      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/nova.conf\""},{"line_number":41,"context_line":"      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/{{ service_name }}-{{ item }}.conf\""},{"line_number":42,"context_line":"    dest: \"{{ node_config_directory }}/nova-compute-ironic-{{ item }}/nova.conf\""},{"line_number":43,"context_line":"    mode: \"0660\""},{"line_number":44,"context_line":"  become: true"}],"source_content_type":"text/x-yaml","patch_set":53,"id":"f201f766_1be06b11","line":41,"range":{"start_line":40,"start_character":1,"end_line":41,"end_character":1},"in_reply_to":"20771fe0_58e6d48a","updated":"2026-04-23 09:28:16.000000000","message":"I think it can be useful for older style override","commit_id":"9b7d7a903533528359c8f5ea08f74786f0ec7550"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"4307ab0f1a9d5ac3c77439f0aac284349eb4dac2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"      - \"{{ node_custom_config }}/nova.conf\""},{"line_number":38,"context_line":"      - \"{{ node_custom_config }}/nova/{{ service_name }}.conf\""},{"line_number":39,"context_line":"      - \"{{ node_custom_config }}/nova/{{ service_name }}-{{ item }}.conf\""},{"line_number":40,"context_line":"      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/nova.conf\""},{"line_number":41,"context_line":"      - \"{{ node_custom_config }}/nova/{{ inventory_hostname }}/{{ service_name }}-{{ item }}.conf\""},{"line_number":42,"context_line":"    dest: \"{{ node_config_directory }}/nova-compute-ironic-{{ item }}/nova.conf\""},{"line_number":43,"context_line":"    mode: \"0660\""},{"line_number":44,"context_line":"  become: true"}],"source_content_type":"text/x-yaml","patch_set":53,"id":"cde5085e_8e0b4f88","line":41,"range":{"start_line":40,"start_character":1,"end_line":41,"end_character":1},"in_reply_to":"f201f766_1be06b11","updated":"2026-04-23 10:57:16.000000000","message":"Done","commit_id":"9b7d7a903533528359c8f5ea08f74786f0ec7550"}],"ansible/roles/nova-cell/tasks/config.yml":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a606ac60cfba4f00f45c5dedbab0d2b505f1f77b","unresolved":true,"context_lines":[{"line_number":7,"context_line":"    owner: \"{{ config_owner_user }}\""},{"line_number":8,"context_line":"    group: \"{{ config_owner_group }}\""},{"line_number":9,"context_line":"    mode: \"0770\""},{"line_number":10,"context_line":"  when:"},{"line_number":11,"context_line":"    - (item.key \u003d\u003d \"nova-compute-ironic\" and nova_multi_compute_ironic_config is not defined) or item.key !\u003d \"nova-compute-ironic\""},{"line_number":12,"context_line":"  with_dict: \"{{ nova_cell_services | select_services_enabled_and_mapped_to_host }}\""},{"line_number":13,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"46e8e02b_2187f100","line":10,"updated":"2026-02-02 09:32:59.000000000","message":"I think I was expecting that we always keep nova-compute-ironic turned on, its just there is the option to turn that off independently of nova-compute-ironic-[1-3] etc.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"4f04e7faa96d5684171d844a88a31ddd77c8e1f8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    owner: \"{{ config_owner_user }}\""},{"line_number":8,"context_line":"    group: \"{{ config_owner_group }}\""},{"line_number":9,"context_line":"    mode: \"0770\""},{"line_number":10,"context_line":"  when:"},{"line_number":11,"context_line":"    - (item.key \u003d\u003d \"nova-compute-ironic\" and nova_multi_compute_ironic_config is not defined) or item.key !\u003d \"nova-compute-ironic\""},{"line_number":12,"context_line":"  with_dict: \"{{ nova_cell_services | select_services_enabled_and_mapped_to_host }}\""},{"line_number":13,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"08e1a1f6_fac145b7","line":10,"in_reply_to":"46e8e02b_2187f100","updated":"2026-03-06 17:17:24.000000000","message":"I think the easiest way to implement this would be to create a new \u0027service\u0027 in the Kolla Ansible nova-cell role, called ``nova-compute-ironic-multi`` and leave ``nova-compute-ironic`` alone. You\u0027d still need the conditional logic in this file I think, and then defining all the vars in defaults (volumes etc) for the new \u0027service\u0027.\n\nI can see pros and cons for both approaches. I think there is a migration path with either approach.\n\nI\u0027m going to mark as resolved, but I\u0027m open to changing the approach if there is a strong reason.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"4414d0a10ad041b6eb1a328dde7f2570dff72d65","unresolved":true,"context_lines":[{"line_number":224,"context_line":"  when:"},{"line_number":225,"context_line":"    - vendordata_file_path is defined"},{"line_number":226,"context_line":"    - service | service_enabled_and_mapped_to_host"},{"line_number":227,"context_line":"    - item.key !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0"},{"line_number":228,"context_line":"  with_items:"},{"line_number":229,"context_line":"    - nova-compute"},{"line_number":230,"context_line":"    - nova-compute-ironic"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"1426ed31_8ae2a56e","line":227,"updated":"2026-04-10 10:07:16.000000000","message":"```suggestion\n    - item !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0\n```","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"868293498e8b619dc026cb82b91bd19eb9d693c9","unresolved":false,"context_lines":[{"line_number":224,"context_line":"  when:"},{"line_number":225,"context_line":"    - vendordata_file_path is defined"},{"line_number":226,"context_line":"    - service | service_enabled_and_mapped_to_host"},{"line_number":227,"context_line":"    - item.key !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0"},{"line_number":228,"context_line":"  with_items:"},{"line_number":229,"context_line":"    - nova-compute"},{"line_number":230,"context_line":"    - nova-compute-ironic"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"deeb6cee_7e6d57a5","line":227,"in_reply_to":"1426ed31_8ae2a56e","updated":"2026-04-13 17:06:04.000000000","message":"Good spot","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"050a1a5789b2672164032fd693aaad610c4faffa","unresolved":false,"context_lines":[{"line_number":224,"context_line":"  when:"},{"line_number":225,"context_line":"    - vendordata_file_path is defined"},{"line_number":226,"context_line":"    - service | service_enabled_and_mapped_to_host"},{"line_number":227,"context_line":"    - item.key !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0"},{"line_number":228,"context_line":"  with_items:"},{"line_number":229,"context_line":"    - nova-compute"},{"line_number":230,"context_line":"    - nova-compute-ironic"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"99e7e3ed_33d7993e","line":227,"in_reply_to":"4c35e754_612724a6","updated":"2026-04-17 13:56:04.000000000","message":"sorry, thought i\u0027d applied it","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"fca3cc350c394ac3cb292a4af5be75a0d7414f16","unresolved":true,"context_lines":[{"line_number":224,"context_line":"  when:"},{"line_number":225,"context_line":"    - vendordata_file_path is defined"},{"line_number":226,"context_line":"    - service | service_enabled_and_mapped_to_host"},{"line_number":227,"context_line":"    - item.key !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0"},{"line_number":228,"context_line":"  with_items:"},{"line_number":229,"context_line":"    - nova-compute"},{"line_number":230,"context_line":"    - nova-compute-ironic"}],"source_content_type":"text/x-yaml","patch_set":43,"id":"4c35e754_612724a6","line":227,"in_reply_to":"deeb6cee_7e6d57a5","updated":"2026-04-17 13:20:49.000000000","message":"this doesn\u0027t seem to be changed","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    group: \"{{ config_owner_group }}\""},{"line_number":9,"context_line":"    mode: \"0770\""},{"line_number":10,"context_line":"  when:"},{"line_number":11,"context_line":"    - item.key !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0"},{"line_number":12,"context_line":"  with_dict: \"{{ nova_cell_services | select_services_enabled_and_mapped_to_host }}\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"- name: Copying over TLS certificates"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"ffa7e3f0_4d765128","line":11,"updated":"2026-04-17 14:07:08.000000000","message":"nit: loop_var: would be nice to understand what is item.key (applies to all other item.key references)","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    group: \"{{ config_owner_group }}\""},{"line_number":9,"context_line":"    mode: \"0770\""},{"line_number":10,"context_line":"  when:"},{"line_number":11,"context_line":"    - item.key !\u003d \"nova-compute-ironic\" or nova_multi_compute_ironic_config | length \u003d\u003d 0"},{"line_number":12,"context_line":"  with_dict: \"{{ nova_cell_services | select_services_enabled_and_mapped_to_host }}\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"- name: Copying over TLS certificates"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"17eef754_e79645cf","line":11,"in_reply_to":"ffa7e3f0_4d765128","updated":"2026-04-17 16:24:00.000000000","message":"item.key is a widely used pattern - like for example line 82, line 212 which are not in the scope of this change (and other roles). I think it could be addressed in a separate change, otherwise I have to start changing code not touched by this patch to be consistent. It\u0027s fairly obvious what the key is.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"}],"ansible/roles/nova-cell/tasks/reload.yml":[{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"4d1f3c81fd13fa5e228748b2370bc543dd6eea4a","unresolved":true,"context_lines":[{"line_number":37,"context_line":"  when:"},{"line_number":38,"context_line":"    - kolla_action \u003d\u003d \u0027upgrade\u0027"},{"line_number":39,"context_line":"    - service | service_enabled_and_mapped_to_host"},{"line_number":40,"context_line":"    - service !\u003d \u0027nova-compute-ironic\u0027 or not service.iterate | bool"},{"line_number":41,"context_line":"  with_items: \"{{ nova_cell_services_require_nova_conf }}\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"- name: Reload nova-compute-ironic to remove RPC version cap (iterated)"}],"source_content_type":"text/x-yaml","patch_set":59,"id":"f85d856b_06df9921","line":40,"updated":"2026-04-24 13:40:43.000000000","message":"```suggestion\n    - item !\u003d \u0027nova-compute-ironic\u0027 or not service.iterate | bool\n```","commit_id":"7fe24f6328aabed6ca0cc42655f696ab6c7472ea"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"0f569cd9f83050e4b6279bbcb60f7b8b3959543e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"  when:"},{"line_number":38,"context_line":"    - kolla_action \u003d\u003d \u0027upgrade\u0027"},{"line_number":39,"context_line":"    - service | service_enabled_and_mapped_to_host"},{"line_number":40,"context_line":"    - service !\u003d \u0027nova-compute-ironic\u0027 or not service.iterate | bool"},{"line_number":41,"context_line":"  with_items: \"{{ nova_cell_services_require_nova_conf }}\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"- name: Reload nova-compute-ironic to remove RPC version cap (iterated)"}],"source_content_type":"text/x-yaml","patch_set":59,"id":"0592782d_f1638e0b","line":40,"in_reply_to":"f85d856b_06df9921","updated":"2026-04-24 13:46:09.000000000","message":"Done","commit_id":"7fe24f6328aabed6ca0cc42655f696ab6c7472ea"}],"ansible/roles/nova-cell/tasks/wait_discover_computes.yml":[{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"fca3cc350c394ac3cb292a4af5be75a0d7414f16","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        any_failed_services: \u003e-"},{"line_number":78,"context_line":"          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or"},{"line_number":79,"context_line":"             ((ansible_facts.hostname | default()) ~ \"-ironic\") in failed_compute_service_hosts }}"},{"line_number":80,"context_line":"      ansible.builtin.fail:"},{"line_number":81,"context_line":"        msg: \u003e-"},{"line_number":82,"context_line":"          The Nova compute service failed to register itself on the following"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"38f4c9bb_ed04b679","line":79,"updated":"2026-04-17 13:20:49.000000000","message":"This only checks {{ ansible_facts.hostname }}-ironic. Multi compute ironic can now use different hostname, so it won\u0027t check them","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"1cf55cd3c1850486984bf4df2a6ed64937e7cc9e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        any_failed_services: \u003e-"},{"line_number":78,"context_line":"          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or"},{"line_number":79,"context_line":"             ((ansible_facts.hostname | default()) ~ \"-ironic\") in failed_compute_service_hosts }}"},{"line_number":80,"context_line":"      ansible.builtin.fail:"},{"line_number":81,"context_line":"        msg: \u003e-"},{"line_number":82,"context_line":"          The Nova compute service failed to register itself on the following"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"68fe20fe_f27476c2","line":79,"in_reply_to":"14e20119_7b7db306","updated":"2026-04-17 13:56:16.000000000","message":"Done","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"050a1a5789b2672164032fd693aaad610c4faffa","unresolved":true,"context_lines":[{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        any_failed_services: \u003e-"},{"line_number":78,"context_line":"          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or"},{"line_number":79,"context_line":"             ((ansible_facts.hostname | default()) ~ \"-ironic\") in failed_compute_service_hosts }}"},{"line_number":80,"context_line":"      ansible.builtin.fail:"},{"line_number":81,"context_line":"        msg: \u003e-"},{"line_number":82,"context_line":"          The Nova compute service failed to register itself on the following"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"14e20119_7b7db306","line":79,"in_reply_to":"38f4c9bb_ed04b679","updated":"2026-04-17 13:56:04.000000000","message":"Good spot - this is a bug since we added the custom host name. I think I\u0027ve fixed it. I can backport the fix separately.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"673df19ffeea59e0ebef566b360ebe79d1d61212","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        failed_compute_service_hosts: \u003e-"},{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        any_failed_services: \u003e-"},{"line_number":78,"context_line":"          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or"},{"line_number":79,"context_line":"             failed_compute_service_hosts | select(\u0027match\u0027, \u0027.*-ironic$\u0027) | list | length \u003e 0 }}"},{"line_number":80,"context_line":"      ansible.builtin.fail:"},{"line_number":81,"context_line":"        msg: \u003e-"},{"line_number":82,"context_line":"          The Nova compute service failed to register itself on the following"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"36e539ad_d5f260e7","line":79,"range":{"start_line":77,"start_character":0,"end_line":79,"end_character":96},"updated":"2026-04-17 21:55:19.000000000","message":"This isn\u0027t per-host. This check will fail batch-wide if any service fails.\n\nSuggestion is probbly not exactly working but it should be close I think\n\n```suggestion\n        _my_ironic_host_info:\n          classic:\n            - \"{{ nova_compute_ironic_custom_host | default(ansible_facts.hostname) }}\"\n          multi:\n            - \"{{ group_names }}\"\n        my_ironic_compute_service_hosts: \u003e-\n          {{ _my_ironic_host_info | get_expected_ironic_compute_services(nova_multi_compute_ironic_config) }}\n        any_failed_services: \u003e-\n          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or\n              my_ironic_compute_service_hosts | intersect(failed_compute_service_hosts) | length \u003e 0 }}\n```","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"02efe5633bd9746392f7dfb467d522a1d645eccb","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        failed_compute_service_hosts: \u003e-"},{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        any_failed_services: \u003e-"},{"line_number":78,"context_line":"          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or"},{"line_number":79,"context_line":"             failed_compute_service_hosts | select(\u0027match\u0027, \u0027.*-ironic$\u0027) | list | length \u003e 0 }}"},{"line_number":80,"context_line":"      ansible.builtin.fail:"},{"line_number":81,"context_line":"        msg: \u003e-"},{"line_number":82,"context_line":"          The Nova compute service failed to register itself on the following"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"4997e3f8_69dddcc4","line":79,"range":{"start_line":77,"start_character":0,"end_line":79,"end_character":96},"in_reply_to":"070c2aa1_599131c0","updated":"2026-04-20 15:45:10.000000000","message":"I\u0027ve updated - feel free to add yourself as a co-author","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"179bacd6b8ae0710bbf661801fb36a42450b7c50","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        failed_compute_service_hosts: \u003e-"},{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        any_failed_services: \u003e-"},{"line_number":78,"context_line":"          {{ (ansible_facts.nodename | default()) in failed_compute_service_hosts or"},{"line_number":79,"context_line":"             failed_compute_service_hosts | select(\u0027match\u0027, \u0027.*-ironic$\u0027) | list | length \u003e 0 }}"},{"line_number":80,"context_line":"      ansible.builtin.fail:"},{"line_number":81,"context_line":"        msg: \u003e-"},{"line_number":82,"context_line":"          The Nova compute service failed to register itself on the following"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"070c2aa1_599131c0","line":79,"range":{"start_line":77,"start_character":0,"end_line":79,"end_character":96},"in_reply_to":"36e539ad_d5f260e7","updated":"2026-04-20 11:35:47.000000000","message":"It\u0027s a good point - thanks Bertrand.\n\nTaking a step back - I think the motivation behind only a failing a single host is that in environments with a very large number of compute nodes, there is always a compute node that has sporadically failed and it\u0027s very hard to get a successful run against all of them in a single shot.  \n\nIt\u0027s different for nova-compute-ironic, because it only runs on the controllers and typically you don\u0027t expect those to become unreachable part way through a run. It\u0027s also much faster to run again, since you don\u0027t have thousands of hypervisors to go through. \n\nIt\u0027s tempting to split the `Fail if nova-compute service failed to register` into two tasks, one for hypervisors and a simpler one for Ironic that doesn\u0027t fail at the host level. That would be simpler I think. However, your suggestion is good. I think we just need to tweak ``classic:`` so that it\u0027s only set if the host is in the ``nova-compute-ironic`` group. Otherwise it looks good I think. I\u0027ll give that a go.","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"38b811da42a265e83e17aa16587d76284061ba49","unresolved":true,"context_lines":[{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        ironic_compute_service_config_for_host:"},{"line_number":78,"context_line":"          classic: \"[{{ (nova_compute_ironic_custom_host | default(ansible_facts.hostname)) if inventory_hostname in ironic_computes_in_batch }}]\""},{"line_number":79,"context_line":"          multi: \"[{{ group_names }}]\""},{"line_number":80,"context_line":"        expected_ironic_compute_services: \u003e-"},{"line_number":81,"context_line":"          {{ ironic_compute_service_config_for_host | get_expected_ironic_compute_services(nova_multi_compute_ironic_config) }}"},{"line_number":82,"context_line":"        any_failed_services: \u003e-"}],"source_content_type":"text/x-yaml","patch_set":53,"id":"543449b6_a9109271","line":79,"range":{"start_line":78,"start_character":0,"end_line":79,"end_character":38},"updated":"2026-04-23 09:26:23.000000000","message":"```suggestion\n          classic: \"{{ [(nova_compute_ironic_custom_host | default(ansible_facts.hostname))] if inventory_hostname in ironic_computes_in_batch else [] }}\"\n          multi: \"{{ [group_names] }}\"\n```","commit_id":"9b7d7a903533528359c8f5ea08f74786f0ec7550"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"372b8ffbae0c0efd9fb89ee4c82aadf6e1b1759d","unresolved":true,"context_lines":[{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        ironic_compute_service_config_for_host:"},{"line_number":78,"context_line":"          classic: \"[{{ (nova_compute_ironic_custom_host | default(ansible_facts.hostname)) if inventory_hostname in ironic_computes_in_batch }}]\""},{"line_number":79,"context_line":"          multi: \"[{{ group_names }}]\""},{"line_number":80,"context_line":"        expected_ironic_compute_services: \u003e-"},{"line_number":81,"context_line":"          {{ ironic_compute_service_config_for_host | get_expected_ironic_compute_services(nova_multi_compute_ironic_config) }}"},{"line_number":82,"context_line":"        any_failed_services: \u003e-"}],"source_content_type":"text/x-yaml","patch_set":53,"id":"a6fff2af_a1f078f0","line":79,"range":{"start_line":78,"start_character":0,"end_line":79,"end_character":38},"in_reply_to":"543449b6_a9109271","updated":"2026-04-23 09:28:16.000000000","message":"it needs to be lists here, as ``get_expected_ironic_compute_services`` would receive strings instead","commit_id":"9b7d7a903533528359c8f5ea08f74786f0ec7550"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"4307ab0f1a9d5ac3c77439f0aac284349eb4dac2","unresolved":false,"context_lines":[{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        ironic_compute_service_config_for_host:"},{"line_number":78,"context_line":"          classic: \"[{{ (nova_compute_ironic_custom_host | default(ansible_facts.hostname)) if inventory_hostname in ironic_computes_in_batch }}]\""},{"line_number":79,"context_line":"          multi: \"[{{ group_names }}]\""},{"line_number":80,"context_line":"        expected_ironic_compute_services: \u003e-"},{"line_number":81,"context_line":"          {{ ironic_compute_service_config_for_host | get_expected_ironic_compute_services(nova_multi_compute_ironic_config) }}"},{"line_number":82,"context_line":"        any_failed_services: \u003e-"}],"source_content_type":"text/x-yaml","patch_set":53,"id":"f46497e3_caa090d7","line":79,"range":{"start_line":78,"start_character":0,"end_line":79,"end_character":38},"in_reply_to":"a6fff2af_a1f078f0","updated":"2026-04-23 10:57:16.000000000","message":"Done","commit_id":"9b7d7a903533528359c8f5ea08f74786f0ec7550"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"650d587652a2ba2a0afd6e8d40152ed0f0bde6b8","unresolved":true,"context_lines":[{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        ironic_compute_service_config_for_host:"},{"line_number":78,"context_line":"          classic: \"{{ [(nova_compute_ironic_custom_host | default(ansible_facts.hostname)) if inventory_hostname in ironic_computes_in_batch] }}\""},{"line_number":79,"context_line":"          multi: \"{{ [group_names] }}\""},{"line_number":80,"context_line":"        expected_ironic_compute_services: \u003e-"},{"line_number":81,"context_line":"          {{ ironic_compute_service_config_for_host | get_expected_ironic_compute_services(nova_multi_compute_ironic_config, nova_cell_compute_ironic_group) }}"}],"source_content_type":"text/x-yaml","patch_set":55,"id":"892748a8_0b9e22d3","line":78,"updated":"2026-04-23 16:01:26.000000000","message":"```suggestion\n          classic: \"{{ [(nova_compute_ironic_custom_host | default(ansible_facts.hostname))] if inventory_hostname in ironic_computes_in_batch else [] }}\"\n```","commit_id":"ff3bf69f9ee64ad9e1f2ea46235f98f879019891"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"1c467d5b5f91e6c0db28e764314bb5b815e8c93d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        ironic_compute_service_config_for_host:"},{"line_number":78,"context_line":"          classic: \"{{ [(nova_compute_ironic_custom_host | default(ansible_facts.hostname)) if inventory_hostname in ironic_computes_in_batch] }}\""},{"line_number":79,"context_line":"          multi: \"{{ [group_names] }}\""},{"line_number":80,"context_line":"        expected_ironic_compute_services: \u003e-"},{"line_number":81,"context_line":"          {{ ironic_compute_service_config_for_host | get_expected_ironic_compute_services(nova_multi_compute_ironic_config, nova_cell_compute_ironic_group) }}"}],"source_content_type":"text/x-yaml","patch_set":55,"id":"460c8d5d_543cd212","line":78,"in_reply_to":"42a7adce_342773fd","updated":"2026-04-23 18:30:19.000000000","message":"Done","commit_id":"ff3bf69f9ee64ad9e1f2ea46235f98f879019891"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"e88b1aeb93526a78150b4e2ac97139f061f14dcf","unresolved":true,"context_lines":[{"line_number":75,"context_line":"          {{ expected_compute_service_hosts | difference(nova_compute_service_hosts) | list }}"},{"line_number":76,"context_line":"        # Whether any compute services failed on this host."},{"line_number":77,"context_line":"        ironic_compute_service_config_for_host:"},{"line_number":78,"context_line":"          classic: \"{{ [(nova_compute_ironic_custom_host | default(ansible_facts.hostname)) if inventory_hostname in ironic_computes_in_batch] }}\""},{"line_number":79,"context_line":"          multi: \"{{ [group_names] }}\""},{"line_number":80,"context_line":"        expected_ironic_compute_services: \u003e-"},{"line_number":81,"context_line":"          {{ ironic_compute_service_config_for_host | get_expected_ironic_compute_services(nova_multi_compute_ironic_config, nova_cell_compute_ironic_group) }}"}],"source_content_type":"text/x-yaml","patch_set":55,"id":"42a7adce_342773fd","line":78,"in_reply_to":"892748a8_0b9e22d3","updated":"2026-04-23 16:01:42.000000000","message":"I think this will be also resolved for all compute nodes - so in mixed environment it can be resolved to undefined, let\u0027s guard it","commit_id":"ff3bf69f9ee64ad9e1f2ea46235f98f879019891"}],"ansible/roles/nova-cell/templates/nova.conf.j2":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a606ac60cfba4f00f45c5dedbab0d2b505f1f77b","unresolved":true,"context_lines":[{"line_number":12,"context_line":"{% set nova_compute_conductor_group \u003d nova_compute_conductor_group | default(none) %}"},{"line_number":13,"context_line":"{% if service_name \u003d\u003d \"nova-compute-ironic\" %}"},{"line_number":14,"context_line":"{%     if nova_compute_shard_key is not none and nova_compute_conductor_group is not none %}"},{"line_number":15,"context_line":"host \u003d {{ nova_compute_conductor_group }}-{{ nova_compute_shard_key }}-ironic"},{"line_number":16,"context_line":"{%     elif nova_compute_shard_key is not none %}"},{"line_number":17,"context_line":"host \u003d {{ nova_compute_shard_key }}-ironic"},{"line_number":18,"context_line":"{%     elif nova_compute_conductor_group is not none %}"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"715cc7c1_a48a39cc","line":15,"updated":"2026-02-02 09:32:59.000000000","message":"Can we make this simpler by defaulting the two vars to \"default\" when they are None / not defined?\n\n    host \u003d {{ nova_compute_conductor_group | default(\"default\") }}-{{ nova_compute_shard_key | default(\"default\") }}-ironic","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"915c0e7d1d83f89eb4f9918a38d3e27b9bc6b6e0","unresolved":false,"context_lines":[{"line_number":12,"context_line":"{% set nova_compute_conductor_group \u003d nova_compute_conductor_group | default(none) %}"},{"line_number":13,"context_line":"{% if service_name \u003d\u003d \"nova-compute-ironic\" %}"},{"line_number":14,"context_line":"{%     if nova_compute_shard_key is not none and nova_compute_conductor_group is not none %}"},{"line_number":15,"context_line":"host \u003d {{ nova_compute_conductor_group }}-{{ nova_compute_shard_key }}-ironic"},{"line_number":16,"context_line":"{%     elif nova_compute_shard_key is not none %}"},{"line_number":17,"context_line":"host \u003d {{ nova_compute_shard_key }}-ironic"},{"line_number":18,"context_line":"{%     elif nova_compute_conductor_group is not none %}"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"5a85cf52_197fcc9e","line":15,"in_reply_to":"715cc7c1_a48a39cc","updated":"2026-03-26 17:52:59.000000000","message":"Done","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a606ac60cfba4f00f45c5dedbab0d2b505f1f77b","unresolved":true,"context_lines":[{"line_number":202,"context_line":"[oslo_messaging_rabbit]"},{"line_number":203,"context_line":"use_queue_manager \u003d true"},{"line_number":204,"context_line":"{% if service_name \u003d\u003d \"nova-compute-ironic\" %}"},{"line_number":205,"context_line":"{%     if nova_compute_shard_key is not none and nova_compute_conductor_group is not none %}"},{"line_number":206,"context_line":"hostname \u003d {{ nova_compute_conductor_group }}-{{ nova_compute_shard_key }}-ironic"},{"line_number":207,"context_line":"{%     elif nova_compute_shard_key is not none %}"},{"line_number":208,"context_line":"hostname \u003d {{ nova_compute_shard_key }}-ironic"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"276aec7f_541b36bb","line":205,"updated":"2026-02-02 09:32:59.000000000","message":"Maybe we should have a new variable, so this logic is always identical to what happens on line 15?","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"915c0e7d1d83f89eb4f9918a38d3e27b9bc6b6e0","unresolved":false,"context_lines":[{"line_number":202,"context_line":"[oslo_messaging_rabbit]"},{"line_number":203,"context_line":"use_queue_manager \u003d true"},{"line_number":204,"context_line":"{% if service_name \u003d\u003d \"nova-compute-ironic\" %}"},{"line_number":205,"context_line":"{%     if nova_compute_shard_key is not none and nova_compute_conductor_group is not none %}"},{"line_number":206,"context_line":"hostname \u003d {{ nova_compute_conductor_group }}-{{ nova_compute_shard_key }}-ironic"},{"line_number":207,"context_line":"{%     elif nova_compute_shard_key is not none %}"},{"line_number":208,"context_line":"hostname \u003d {{ nova_compute_shard_key }}-ironic"}],"source_content_type":"text/x-jinja2","patch_set":7,"id":"f7c29f6e_06cdd992","line":205,"in_reply_to":"276aec7f_541b36bb","updated":"2026-03-26 17:52:59.000000000","message":"agree - it is a lot simpler for it!","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":127,"context_line":"conductor_group \u003d {{ nova_compute_conductor_group }}"},{"line_number":128,"context_line":"{%     endif %}"},{"line_number":129,"context_line":"{%     if nova_compute_conductor_group is not in [\u0027default\u0027, \u0027\u0027] and nova_compute_shard_key is in [\u0027default\u0027, \u0027\u0027] %}"},{"line_number":130,"context_line":"# NOTE(dougszu): In this case only, Nova Compute Ironic won\u0027t start unless the peer_list"},{"line_number":131,"context_line":"# is populated. peer_list is a deprecated config option and should never have more than"},{"line_number":132,"context_line":"# one host in it. This appears to be a bug."},{"line_number":133,"context_line":"peer_list \u003d {{ host_value }}"}],"source_content_type":"text/x-jinja2","patch_set":49,"id":"0ad7ca79_1ac83e63","line":130,"updated":"2026-04-17 14:07:08.000000000","message":"jinja2 comment please","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":127,"context_line":"conductor_group \u003d {{ nova_compute_conductor_group }}"},{"line_number":128,"context_line":"{%     endif %}"},{"line_number":129,"context_line":"{%     if nova_compute_conductor_group is not in [\u0027default\u0027, \u0027\u0027] and nova_compute_shard_key is in [\u0027default\u0027, \u0027\u0027] %}"},{"line_number":130,"context_line":"# NOTE(dougszu): In this case only, Nova Compute Ironic won\u0027t start unless the peer_list"},{"line_number":131,"context_line":"# is populated. peer_list is a deprecated config option and should never have more than"},{"line_number":132,"context_line":"# one host in it. This appears to be a bug."},{"line_number":133,"context_line":"peer_list \u003d {{ host_value }}"}],"source_content_type":"text/x-jinja2","patch_set":49,"id":"3ca57c54_a21efb0c","line":130,"in_reply_to":"0ad7ca79_1ac83e63","updated":"2026-04-17 16:24:00.000000000","message":"Done","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"}],"ansible/roles/service-cert-copy/tasks/main.yml":[{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"673df19ffeea59e0ebef566b360ebe79d1d61212","unresolved":true,"context_lines":[{"line_number":10,"context_line":"    - not (item.value.iterate | default(False)) | bool"},{"line_number":11,"context_line":"  with_dict: \"{{ project_services | select_services_enabled_and_mapped_to_host }}\""},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# NOTE(dougszu): For current iterable services, we only need CA certs"},{"line_number":14,"context_line":"- name: \"Check containers that require iteration for {{ kolla_role_name | default(project_name) }}\""},{"line_number":15,"context_line":"  vars:"},{"line_number":16,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":17,"context_line":"  ansible.builtin.include_tasks: iterated.yml"},{"line_number":18,"context_line":"  loop: \"{{ project_services | select_services_enabled_and_mapped_to_host | dict2items }}\""},{"line_number":19,"context_line":"  loop_control:"},{"line_number":20,"context_line":"    loop_var: outer_item"},{"line_number":21,"context_line":"  when: (service.iterate | default(False)) | bool"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"- name: \"Copying over backend internal TLS certificate for {{ project_name }}\""},{"line_number":24,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"64ef6012_9c760509","line":21,"range":{"start_line":13,"start_character":0,"end_line":21,"end_character":49},"updated":"2026-04-17 21:55:19.000000000","message":"```suggestion\n# NOTE(dougszu): For current iterable services, we only need CA certs\n- name: \"Check containers that require iteration for {{ kolla_role_name | default(project_name) }}\"\n  vars:\n    service: \"{{ outer_item.value }}\"\n  ansible.builtin.include_tasks: iterated.yml\n  loop: \"{{ project_services | select_services_enabled_and_mapped_to_host | dict2items }}\"\n  loop_control:\n    loop_var: outer_item\n  when:\n    - kolla_copy_ca_into_containers | bool\n    - (service.iterate | default(False)) | bool\n```","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"fb42eae40701e2494c6f473dc040a53b0cf4773d","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    - not (item.value.iterate | default(False)) | bool"},{"line_number":11,"context_line":"  with_dict: \"{{ project_services | select_services_enabled_and_mapped_to_host }}\""},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# NOTE(dougszu): For current iterable services, we only need CA certs"},{"line_number":14,"context_line":"- name: \"Check containers that require iteration for {{ kolla_role_name | default(project_name) }}\""},{"line_number":15,"context_line":"  vars:"},{"line_number":16,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":17,"context_line":"  ansible.builtin.include_tasks: iterated.yml"},{"line_number":18,"context_line":"  loop: \"{{ project_services | select_services_enabled_and_mapped_to_host | dict2items }}\""},{"line_number":19,"context_line":"  loop_control:"},{"line_number":20,"context_line":"    loop_var: outer_item"},{"line_number":21,"context_line":"  when: (service.iterate | default(False)) | bool"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"- name: \"Copying over backend internal TLS certificate for {{ project_name }}\""},{"line_number":24,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"12433766_2c3cf2fe","line":21,"range":{"start_line":13,"start_character":0,"end_line":21,"end_character":49},"in_reply_to":"64ef6012_9c760509","updated":"2026-04-20 10:02:39.000000000","message":"Agree, thanks!","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"}],"ansible/roles/service-check-containers/tasks/iterated.yml":[{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"3cd0ecb9cf998f62897f11d3ef604ea263cee43f","unresolved":true,"context_lines":[{"line_number":27,"context_line":"    # NOTE(dougszu): Due to issues with nova-compute-ironic HA, we can\u0027t have"},{"line_number":28,"context_line":"    # more than one instance for a given \u0027item\u0027. Eg. nova_compute_ironic_1"},{"line_number":29,"context_line":"    # should never run on more than one host."},{"line_number":30,"context_line":"    - service_name !\u003d \u0027nova-compute-ironic\u0027 or (service_name \u003d\u003d \u0027nova-compute-ironic\u0027 and inventory_hostname in groups[\u0027nova-compute-ironic-\u0027 + item | string])"},{"line_number":31,"context_line":"  register: container_check"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"- name: \"Store changed containers to pass to the handler\""}],"source_content_type":"text/x-yaml","patch_set":39,"id":"84844b25_4ac9d4c9","line":30,"updated":"2026-04-09 13:22:59.000000000","message":"The inner service_name \u003d\u003d \u0027nova-compute-ironic\u0027 is always true when the outer !\u003d is false.\n\n`service_name !\u003d \u0027nova-compute-ironic\u0027 or inventory_hostname in groups[\u0027nova-compute-ironic-\u0027 + item | string]`","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"ed79e63224e7170a2fdb4884567baf10a01200bf","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # NOTE(dougszu): Due to issues with nova-compute-ironic HA, we can\u0027t have"},{"line_number":28,"context_line":"    # more than one instance for a given \u0027item\u0027. Eg. nova_compute_ironic_1"},{"line_number":29,"context_line":"    # should never run on more than one host."},{"line_number":30,"context_line":"    - service_name !\u003d \u0027nova-compute-ironic\u0027 or (service_name \u003d\u003d \u0027nova-compute-ironic\u0027 and inventory_hostname in groups[\u0027nova-compute-ironic-\u0027 + item | string])"},{"line_number":31,"context_line":"  register: container_check"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"- name: \"Store changed containers to pass to the handler\""}],"source_content_type":"text/x-yaml","patch_set":39,"id":"0254ed4f_560fa883","line":30,"in_reply_to":"84844b25_4ac9d4c9","updated":"2026-04-09 14:06:06.000000000","message":"Done","commit_id":"d8f67c36b89840bc6c5a8d2a0544c6bdbd2c38ee"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":24,"context_line":"    cgroupns_mode: \"{{ service.cgroupns_mode | default(omit) }}\""},{"line_number":25,"context_line":"  loop: \"{{ range(1, (iterate_count | int) + 1) | list }}\""},{"line_number":26,"context_line":"  when:"},{"line_number":27,"context_line":"    # NOTE(dougszu): Due to issues with nova-compute-ironic HA, we can\u0027t have"},{"line_number":28,"context_line":"    # more than one instance for a given \u0027item\u0027. Eg. nova_compute_ironic_1"},{"line_number":29,"context_line":"    # should never run on more than one host."},{"line_number":30,"context_line":"    - service_name !\u003d \u0027nova-compute-ironic\u0027 or inventory_hostname in groups[\u0027nova-compute-ironic-\u0027 + item | string]"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"f6ff59ea_bc8023a2","line":27,"updated":"2026-04-17 14:07:08.000000000","message":"What issues? bug report linked? A better description maybe? e.g. Due to current limitation in nova-compute-ironic code?","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    cgroupns_mode: \"{{ service.cgroupns_mode | default(omit) }}\""},{"line_number":25,"context_line":"  loop: \"{{ range(1, (iterate_count | int) + 1) | list }}\""},{"line_number":26,"context_line":"  when:"},{"line_number":27,"context_line":"    # NOTE(dougszu): Due to issues with nova-compute-ironic HA, we can\u0027t have"},{"line_number":28,"context_line":"    # more than one instance for a given \u0027item\u0027. Eg. nova_compute_ironic_1"},{"line_number":29,"context_line":"    # should never run on more than one host."},{"line_number":30,"context_line":"    - service_name !\u003d \u0027nova-compute-ironic\u0027 or inventory_hostname in groups[\u0027nova-compute-ironic-\u0027 + item | string]"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"5fff2f34_d1649eb1","line":27,"in_reply_to":"f6ff59ea_bc8023a2","updated":"2026-04-17 16:24:00.000000000","message":"There were many bugs which led to a spec where they essentially gave up on the original HA mechanism.  I\u0027ve added a link.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"7ef67896b2f39b55a0dabe747227615e4d63e3fb","unresolved":true,"context_lines":[{"line_number":24,"context_line":"    cgroupns_mode: \"{{ service.cgroupns_mode | default(omit) }}\""},{"line_number":25,"context_line":"  loop: \"{{ range(1, (iterate_count | int) + 1) | list }}\""},{"line_number":26,"context_line":"  when:"},{"line_number":27,"context_line":"    # NOTE(dougszu): Due to issues with nova-compute-ironic HA, we can\u0027t have"},{"line_number":28,"context_line":"    # more than one instance for a given \u0027item\u0027. Eg. nova_compute_ironic_1"},{"line_number":29,"context_line":"    # should never run on more than one host."},{"line_number":30,"context_line":"    # See: https://specs.openstack.org/openstack/nova-specs/specs/2024.1/implemented/ironic-shards.html"}],"source_content_type":"text/x-yaml","patch_set":54,"id":"7443753b_dc7b51ce","line":27,"updated":"2026-04-23 11:38:31.000000000","message":"it may be good to have a precheck for that condition, I sense that people may be confused and add multiple hosts to nova-compute-ironic-1 group","commit_id":"2859119d5d18b520ea80f6bda58a01ef897968c2"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"0d1986d72501d11f3a6e1d38dd792c27f95ed102","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    cgroupns_mode: \"{{ service.cgroupns_mode | default(omit) }}\""},{"line_number":25,"context_line":"  loop: \"{{ range(1, (iterate_count | int) + 1) | list }}\""},{"line_number":26,"context_line":"  when:"},{"line_number":27,"context_line":"    # NOTE(dougszu): Due to issues with nova-compute-ironic HA, we can\u0027t have"},{"line_number":28,"context_line":"    # more than one instance for a given \u0027item\u0027. Eg. nova_compute_ironic_1"},{"line_number":29,"context_line":"    # should never run on more than one host."},{"line_number":30,"context_line":"    # See: https://specs.openstack.org/openstack/nova-specs/specs/2024.1/implemented/ironic-shards.html"}],"source_content_type":"text/x-yaml","patch_set":54,"id":"65c13a18_5882fa1a","line":27,"in_reply_to":"7443753b_dc7b51ce","updated":"2026-04-23 14:19:55.000000000","message":"Added. I thought it was best outside `service-precheck/iterated.yml` since it\u0027s a Nova specific quirk.","commit_id":"2859119d5d18b520ea80f6bda58a01ef897968c2"}],"ansible/roles/service-precheck/tasks/iterated.yml":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  vars:"},{"line_number":4,"context_line":"    service_name: \"{{ item.key }}\""},{"line_number":5,"context_line":"    service: \"{{ item.value }}\""},{"line_number":6,"context_line":"  ansible.builtin.fail:"},{"line_number":7,"context_line":"    msg: \u003e-"},{"line_number":8,"context_line":"      Ansible inventory does not contain the expected group {{ service.group }}"},{"line_number":9,"context_line":"      for service {{ service_name }} in {{ project_name }}."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"b566001d_e21d7ca3","line":6,"updated":"2026-04-17 14:07:08.000000000","message":"ansible.builtin.assert please","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  vars:"},{"line_number":4,"context_line":"    service_name: \"{{ item.key }}\""},{"line_number":5,"context_line":"    service: \"{{ item.value }}\""},{"line_number":6,"context_line":"  ansible.builtin.fail:"},{"line_number":7,"context_line":"    msg: \u003e-"},{"line_number":8,"context_line":"      Ansible inventory does not contain the expected group {{ service.group }}"},{"line_number":9,"context_line":"      for service {{ service_name }} in {{ project_name }}."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"2be376c6_efccba29","line":6,"in_reply_to":"b566001d_e21d7ca3","updated":"2026-04-17 16:24:00.000000000","message":"Done","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":20,"context_line":"    service_name: \"{{ outer_item.key }}\""},{"line_number":21,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":22,"context_line":"    service_group: \"{{ service.group + \u0027-\u0027 + item | string }}\""},{"line_number":23,"context_line":"  ansible.builtin.fail:"},{"line_number":24,"context_line":"    msg: \u003e-"},{"line_number":25,"context_line":"      Ansible inventory does not contain the expected group {{ service_group }}"},{"line_number":26,"context_line":"      for service {{ service_name }} in {{ project_name }}."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"9e978973_1b85df78","line":23,"updated":"2026-04-17 14:07:08.000000000","message":"ditto","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    service_name: \"{{ outer_item.key }}\""},{"line_number":21,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":22,"context_line":"    service_group: \"{{ service.group + \u0027-\u0027 + item | string }}\""},{"line_number":23,"context_line":"  ansible.builtin.fail:"},{"line_number":24,"context_line":"    msg: \u003e-"},{"line_number":25,"context_line":"      Ansible inventory does not contain the expected group {{ service_group }}"},{"line_number":26,"context_line":"      for service {{ service_name }} in {{ project_name }}."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"c4eba798_e1f12ada","line":23,"in_reply_to":"9e978973_1b85df78","updated":"2026-04-17 16:24:00.000000000","message":"Done","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"fb42eae40701e2494c6f473dc040a53b0cf4773d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    service_name: \"{{ outer_item.key }}\""},{"line_number":21,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":22,"context_line":"    service_group: \"{{ service.group + \u0027-\u0027 + item | string }}\""},{"line_number":23,"context_line":"  ansible.builtin.fail:"},{"line_number":24,"context_line":"    msg: \u003e-"},{"line_number":25,"context_line":"      Ansible inventory does not contain the expected group {{ service_group }}"},{"line_number":26,"context_line":"      for service {{ service_name }} in {{ project_name }}."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"46cb2657_eec1d3d9","line":23,"in_reply_to":"c4eba798_e1f12ada","updated":"2026-04-20 10:02:39.000000000","message":"I\u0027m don\u0027t think assert fits well here because I have to get rid of the service_group task var which would affect readability.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"673df19ffeea59e0ebef566b360ebe79d1d61212","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"- name: \"Validate inventory groups for {{ project_name }}\""},{"line_number":3,"context_line":"  vars:"},{"line_number":4,"context_line":"    service_name: \"{{ item.key }}\""},{"line_number":5,"context_line":"    service: \"{{ item.value }}\""},{"line_number":6,"context_line":"  ansible.builtin.assert:"},{"line_number":7,"context_line":"    msg: \u003e-"},{"line_number":8,"context_line":"      Ansible inventory does not contain the expected group {{ service.group }}"},{"line_number":9,"context_line":"      for service {{ service_name }} in {{ project_name }}."},{"line_number":10,"context_line":"    that:"},{"line_number":11,"context_line":"      - not (service.iterate | default(False)) | bool"},{"line_number":12,"context_line":"      - \"\u0027group\u0027 in service\""},{"line_number":13,"context_line":"      - service.group not in groups"},{"line_number":14,"context_line":"  loop: \"{{ query(\u0027dict\u0027, service_precheck_services) }}\""},{"line_number":15,"context_line":"  loop_control:"},{"line_number":16,"context_line":"    label: \"{{ service_name }}\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- name: \"Validate inventory groups (iterated) for {{ project_name }}\""},{"line_number":19,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"7a123f89_5d2b1072","line":16,"range":{"start_line":2,"start_character":0,"end_line":16,"end_character":31},"updated":"2026-04-17 21:55:19.000000000","message":"The semantics are opposite: This will pass when a group is missing (wrong) and raises an error when groups exist (also wrong).\n\nAlso I believe when the inner loop hits `nova-compute-ironic`, `not service.iterate \u003d False` and it\u0027ll break any deployment with `multi-compute-ironic` enabled ?","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"fb42eae40701e2494c6f473dc040a53b0cf4773d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"- name: \"Validate inventory groups for {{ project_name }}\""},{"line_number":3,"context_line":"  vars:"},{"line_number":4,"context_line":"    service_name: \"{{ item.key }}\""},{"line_number":5,"context_line":"    service: \"{{ item.value }}\""},{"line_number":6,"context_line":"  ansible.builtin.assert:"},{"line_number":7,"context_line":"    msg: \u003e-"},{"line_number":8,"context_line":"      Ansible inventory does not contain the expected group {{ service.group }}"},{"line_number":9,"context_line":"      for service {{ service_name }} in {{ project_name }}."},{"line_number":10,"context_line":"    that:"},{"line_number":11,"context_line":"      - not (service.iterate | default(False)) | bool"},{"line_number":12,"context_line":"      - \"\u0027group\u0027 in service\""},{"line_number":13,"context_line":"      - service.group not in groups"},{"line_number":14,"context_line":"  loop: \"{{ query(\u0027dict\u0027, service_precheck_services) }}\""},{"line_number":15,"context_line":"  loop_control:"},{"line_number":16,"context_line":"    label: \"{{ service_name }}\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- name: \"Validate inventory groups (iterated) for {{ project_name }}\""},{"line_number":19,"context_line":"  vars:"}],"source_content_type":"text/x-yaml","patch_set":51,"id":"e8beb6f0_917dd989","line":16,"range":{"start_line":2,"start_character":0,"end_line":16,"end_character":31},"in_reply_to":"7a123f89_5d2b1072","updated":"2026-04-20 10:02:39.000000000","message":"Done","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":37203,"name":"Bertrand Lanson","display_name":"Bertrand Lanson","email":"bertrand.lanson@infomaniak.com","username":"lanson","status":"Infomaniak Network SA"},"change_message_id":"673df19ffeea59e0ebef566b360ebe79d1d61212","unresolved":true,"context_lines":[{"line_number":15,"context_line":"  loop_control:"},{"line_number":16,"context_line":"    label: \"{{ service_name }}\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- name: \"Validate inventory groups (iterated) for {{ project_name }}\""},{"line_number":19,"context_line":"  vars:"},{"line_number":20,"context_line":"    service_name: \"{{ outer_item.key }}\""},{"line_number":21,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":22,"context_line":"    service_group: \"{{ service.group + \u0027-\u0027 + item | string }}\""},{"line_number":23,"context_line":"  ansible.builtin.assert:"},{"line_number":24,"context_line":"    msg: \u003e-"},{"line_number":25,"context_line":"      Ansible inventory does not contain the expected group {{ service_group }}"},{"line_number":26,"context_line":"      for service {{ service_name }} in {{ project_name }}."},{"line_number":27,"context_line":"    that:"},{"line_number":28,"context_line":"      - (service.iterate | default(False)) | bool"},{"line_number":29,"context_line":"      - \"\u0027group\u0027 in service\""},{"line_number":30,"context_line":"      - service_group not in groups"},{"line_number":31,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""}],"source_content_type":"text/x-yaml","patch_set":51,"id":"34b22669_a0755581","line":31,"range":{"start_line":18,"start_character":0,"end_line":31,"end_character":64},"updated":"2026-04-17 21:55:19.000000000","message":"same inversion: `service_group not in groups` as a that will fail inversely to what is desired I think","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"fb42eae40701e2494c6f473dc040a53b0cf4773d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"  loop_control:"},{"line_number":16,"context_line":"    label: \"{{ service_name }}\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- name: \"Validate inventory groups (iterated) for {{ project_name }}\""},{"line_number":19,"context_line":"  vars:"},{"line_number":20,"context_line":"    service_name: \"{{ outer_item.key }}\""},{"line_number":21,"context_line":"    service: \"{{ outer_item.value }}\""},{"line_number":22,"context_line":"    service_group: \"{{ service.group + \u0027-\u0027 + item | string }}\""},{"line_number":23,"context_line":"  ansible.builtin.assert:"},{"line_number":24,"context_line":"    msg: \u003e-"},{"line_number":25,"context_line":"      Ansible inventory does not contain the expected group {{ service_group }}"},{"line_number":26,"context_line":"      for service {{ service_name }} in {{ project_name }}."},{"line_number":27,"context_line":"    that:"},{"line_number":28,"context_line":"      - (service.iterate | default(False)) | bool"},{"line_number":29,"context_line":"      - \"\u0027group\u0027 in service\""},{"line_number":30,"context_line":"      - service_group not in groups"},{"line_number":31,"context_line":"  loop: \"{{ range(1, (service.iterate_var | int) + 1) | list }}\""}],"source_content_type":"text/x-yaml","patch_set":51,"id":"0525beea_f89cc20d","line":31,"range":{"start_line":18,"start_character":0,"end_line":31,"end_character":64},"in_reply_to":"34b22669_a0755581","updated":"2026-04-20 10:02:39.000000000","message":"yeah, sorry, was in a rush to address feedback. I think we don\u0027t actually need this task anyway.","commit_id":"6aedd2b9d4579a80d1e717f0f05c4da83d7cc1e3"}],"doc/source/admin/advanced-configuration.rst":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a606ac60cfba4f00f45c5dedbab0d2b505f1f77b","unresolved":true,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: yaml"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  nova_multi_compute_ironic_config:"},{"line_number":218,"context_line":"    - \"shard_key\": \"shard_1\""},{"line_number":219,"context_line":"      \"conductor_group\": \"location_1\""},{"line_number":220,"context_line":"    - \"shard_key\": \"shard_2\""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a609500_888d1995","line":217,"updated":"2026-02-02 09:32:59.000000000","message":"What about we go for only supporting a slightly simpler combination, where we have multiple shards across a specific conductor group, for each host? Its not the most general, but I think it covers most of the key use cases:\n\n    nova_multi_compute_ironic_config:\n      host1:\n        shard_keys: [\"shard1\", \"shard2\"]\n      host2:\n        shard_keys: [\"shard3\", \"shard4\"]\n      host89:\n        shard_keys: [\"shard1\", \"shard2\"]\n        conductor_group: \"foo\"\n      host96:\n        shard_keys: [\"shard1\", \"shard2\"]\n        conductor_group: \"bar\"\n\nThe main bonus of the above idea is that its easy to move things between nodes, should a node fail. And we could make sure kolla-ansible, eventually, is able to remove the services on the dead hosts, potentially.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e3a3d141233942485717418426025f8d515b2c8e","unresolved":true,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: yaml"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  nova_multi_compute_ironic_config:"},{"line_number":218,"context_line":"    - \"shard_key\": \"shard_1\""},{"line_number":219,"context_line":"      \"conductor_group\": \"location_1\""},{"line_number":220,"context_line":"    - \"shard_key\": \"shard_2\""}],"source_content_type":"text/x-rst","patch_set":7,"id":"78960665_6ab0458f","line":217,"in_reply_to":"26b0116b_cb3f747a","updated":"2026-02-02 13:08:23.000000000","message":"Ah, true, that breaks that.\n\nIt is a shame we can\u0027t just go for nova_compute_ironic_[conductor_group]_[shard_name] I guess, because that would be able to stay the same as things move above.\n\n(I am not sure supporting customer config per shard is wise, or needed, but I can see people making use of that...)","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"4f04e7faa96d5684171d844a88a31ddd77c8e1f8","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: yaml"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  nova_multi_compute_ironic_config:"},{"line_number":218,"context_line":"    - \"shard_key\": \"shard_1\""},{"line_number":219,"context_line":"      \"conductor_group\": \"location_1\""},{"line_number":220,"context_line":"    - \"shard_key\": \"shard_2\""}],"source_content_type":"text/x-rst","patch_set":7,"id":"ae60af10_eaafc85d","line":217,"in_reply_to":"35ad2a91_cff56f73","updated":"2026-03-06 17:17:24.000000000","message":"Done","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"f83383734b995f6a24eee5b74707a5c18f0ff38f","unresolved":true,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: yaml"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  nova_multi_compute_ironic_config:"},{"line_number":218,"context_line":"    - \"shard_key\": \"shard_1\""},{"line_number":219,"context_line":"      \"conductor_group\": \"location_1\""},{"line_number":220,"context_line":"    - \"shard_key\": \"shard_2\""}],"source_content_type":"text/x-rst","patch_set":7,"id":"35ad2a91_cff56f73","line":217,"in_reply_to":"78960665_6ab0458f","updated":"2026-02-02 13:45:18.000000000","message":"``nova_compute_ironic_[conductor_group]_[shard_name]`` would be good, I agree. I\u0027ve started with the numerical postfix because it\u0027s an existing pattern. It\u0027s a step in the same direction at least.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"08ca5d8a8347063baa5ecc564ea38368122c6cdc","unresolved":true,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: yaml"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  nova_multi_compute_ironic_config:"},{"line_number":218,"context_line":"    - \"shard_key\": \"shard_1\""},{"line_number":219,"context_line":"      \"conductor_group\": \"location_1\""},{"line_number":220,"context_line":"    - \"shard_key\": \"shard_2\""}],"source_content_type":"text/x-rst","patch_set":7,"id":"26b0116b_cb3f747a","line":217,"in_reply_to":"9a609500_888d1995","updated":"2026-02-02 12:39:08.000000000","message":"I was planning on mapping the services using the inventory, rather than the config variable. So like:\n\n```\n[host1]\nnova_compute_ironic_2\nnova_compute_ironic_3\n\n[host2]\nnova_compute_ironic_1\n```\n\nThe main reason is because of group vars. Eg. if you have a custom ``nova.conf`` for group ``nova_compute_ironic_2``, then those custom settings will automatically follow the ``nova_compute_ironic_2`` service instance around when it is reassigned to another host via the inventory. That is perhaps more useful for ``ironic.conf``, but still.\n\nWith what you are suggesting above, ``nova_compute_ironic_2`` for example, could get renamed to ``nova_compute_ironic_something_else`` when it was moved to another host. It would then lose any custom config from ``nova_compute_ironic_2`` group vars.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"13cde25e747110ddc74c2ca6c15fc38aa98abb96","unresolved":true,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":".. code-block:: yaml"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"  nova_multi_compute_ironic_config:"},{"line_number":218,"context_line":"    - \"shard_key\": \"shard_1\""},{"line_number":219,"context_line":"      \"conductor_group\": \"location_1\""},{"line_number":220,"context_line":"    - \"shard_key\": \"shard_2\""}],"source_content_type":"text/x-rst","patch_set":7,"id":"fe1fc890_27952da8","line":217,"in_reply_to":"9a609500_888d1995","updated":"2026-02-02 09:40:04.000000000","message":"Maybe keeping each host having a list of dicts with shard_key and conductor group is fine too, on reflection. I think I was miss-reading it.","commit_id":"8cb995a60a68f10a6f0b2fb502379787dece0e22"}],"kolla_ansible/nova_filters.py":[{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"4414d0a10ad041b6eb1a328dde7f2570dff72d65","unresolved":true,"context_lines":[{"line_number":97,"context_line":"    expected_services \u003d []"},{"line_number":98,"context_line":"    if len(multi_compute_config) \u003d\u003d 0:"},{"line_number":99,"context_line":"        if len(classic_config) \u003e 0:"},{"line_number":100,"context_line":"            expected_services.append(classic_config[0] + \u0027-ironic\u0027)"},{"line_number":101,"context_line":"        return expected_services"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    for item in multi_compute_config[0]:"}],"source_content_type":"text/x-python","patch_set":43,"id":"b1e61a80_54a2dea6","line":100,"updated":"2026-04-10 10:07:16.000000000","message":"This only takes classic_config[0]. If there are 2 or more classic nova-compute-ironic hosts, we stop waiting after first one registers - added unit test for that on top current patch https://review.opendev.org/c/openstack/kolla-ansible/+/983991\n\nThere can be still some people who runs multiple nova-compute-ironic in old-school \"HA\" mode, and that can break them - although this model is discouraged, but somewhat possible.","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"868293498e8b619dc026cb82b91bd19eb9d693c9","unresolved":true,"context_lines":[{"line_number":97,"context_line":"    expected_services \u003d []"},{"line_number":98,"context_line":"    if len(multi_compute_config) \u003d\u003d 0:"},{"line_number":99,"context_line":"        if len(classic_config) \u003e 0:"},{"line_number":100,"context_line":"            expected_services.append(classic_config[0] + \u0027-ironic\u0027)"},{"line_number":101,"context_line":"        return expected_services"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    for item in multi_compute_config[0]:"}],"source_content_type":"text/x-python","patch_set":43,"id":"f4990cf0_63583048","line":100,"in_reply_to":"b1e61a80_54a2dea6","updated":"2026-04-13 17:06:04.000000000","message":"Thanks, fair point, it is a regression, even if you shouldn\u0027t be doing it. I will update","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"1db3a667621f90dfeab2e56709435769dca90810","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    expected_services \u003d []"},{"line_number":98,"context_line":"    if len(multi_compute_config) \u003d\u003d 0:"},{"line_number":99,"context_line":"        if len(classic_config) \u003e 0:"},{"line_number":100,"context_line":"            expected_services.append(classic_config[0] + \u0027-ironic\u0027)"},{"line_number":101,"context_line":"        return expected_services"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    for item in multi_compute_config[0]:"}],"source_content_type":"text/x-python","patch_set":43,"id":"00dc9d58_977df9f1","line":100,"in_reply_to":"f4990cf0_63583048","updated":"2026-04-16 08:59:09.000000000","message":"Done","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":23084,"name":"Bartosz Bezak","email":"bartosz@stackhpc.com","username":"b.bezak"},"change_message_id":"4414d0a10ad041b6eb1a328dde7f2570dff72d65","unresolved":true,"context_lines":[{"line_number":100,"context_line":"            expected_services.append(classic_config[0] + \u0027-ironic\u0027)"},{"line_number":101,"context_line":"        return expected_services"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    for item in multi_compute_config[0]:"},{"line_number":104,"context_line":"        cg \u003d item.get(\"conductor_group\") or \"default\""},{"line_number":105,"context_line":"        sk \u003d item.get(\"shard_key\") or \"default\""},{"line_number":106,"context_line":"        expected_services.append(f\"{cg}-{sk}-ironic\")"}],"source_content_type":"text/x-python","patch_set":43,"id":"e89e5321_f6d738d1","line":103,"updated":"2026-04-10 10:07:16.000000000","message":"This uses full multi config from first host, not actual hosts in current batch. Not sure how --limit would behave now, and with custom_host we wait for wrong host name. Registration can timeout even if service is fine - added unit test for that - https://review.opendev.org/c/openstack/kolla-ansible/+/983994","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"1db3a667621f90dfeab2e56709435769dca90810","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            expected_services.append(classic_config[0] + \u0027-ironic\u0027)"},{"line_number":101,"context_line":"        return expected_services"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    for item in multi_compute_config[0]:"},{"line_number":104,"context_line":"        cg \u003d item.get(\"conductor_group\") or \"default\""},{"line_number":105,"context_line":"        sk \u003d item.get(\"shard_key\") or \"default\""},{"line_number":106,"context_line":"        expected_services.append(f\"{cg}-{sk}-ironic\")"}],"source_content_type":"text/x-python","patch_set":43,"id":"e775d6db_55f63aa5","line":103,"in_reply_to":"448bfecf_e59ffecb","updated":"2026-04-16 08:59:09.000000000","message":"Done","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"868293498e8b619dc026cb82b91bd19eb9d693c9","unresolved":true,"context_lines":[{"line_number":100,"context_line":"            expected_services.append(classic_config[0] + \u0027-ironic\u0027)"},{"line_number":101,"context_line":"        return expected_services"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    for item in multi_compute_config[0]:"},{"line_number":104,"context_line":"        cg \u003d item.get(\"conductor_group\") or \"default\""},{"line_number":105,"context_line":"        sk \u003d item.get(\"shard_key\") or \"default\""},{"line_number":106,"context_line":"        expected_services.append(f\"{cg}-{sk}-ironic\")"}],"source_content_type":"text/x-python","patch_set":43,"id":"448bfecf_e59ffecb","line":103,"in_reply_to":"e89e5321_f6d738d1","updated":"2026-04-13 17:06:04.000000000","message":"The \u0027multi config\u0027 is not supposed to be customised via hostvars - it must always be the same for each host. It would normally be set in `globals.yml`. I will add a note to this effect. \n\nI will leave this unresolved, because I should clean up the way it is passed into the filter - we can just pass the var directly, rather than getting from the first host.","commit_id":"14f6ec27af79a3d49ef131800cf82c90a451554c"},{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":96,"context_line":"      :param multi_compute_conf: Ironic multi-compute config"},{"line_number":97,"context_line":"      :returns: A list of Nova Compute Ironic service hostnames."},{"line_number":98,"context_line":"    \"\"\""},{"line_number":99,"context_line":"    classic_info \u003d ironic_compute_batch_info[\u0027classic\u0027]"},{"line_number":100,"context_line":"    multi_compute_info \u003d ironic_compute_batch_info[\u0027multi\u0027]"},{"line_number":101,"context_line":"    if len(multi_compute_conf) \u003d\u003d 0:"},{"line_number":102,"context_line":"        return [f\u0027{host}-ironic\u0027 for host in classic_info]"}],"source_content_type":"text/x-python","patch_set":49,"id":"ac6e7920_3964097e","line":99,"updated":"2026-04-17 14:07:08.000000000","message":"If that\u0027s not in the dictionary (e.g. json_query silently fails or anything similar), we just fail with nice python backtrace, which might not be user readable","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":96,"context_line":"      :param multi_compute_conf: Ironic multi-compute config"},{"line_number":97,"context_line":"      :returns: A list of Nova Compute Ironic service hostnames."},{"line_number":98,"context_line":"    \"\"\""},{"line_number":99,"context_line":"    classic_info \u003d ironic_compute_batch_info[\u0027classic\u0027]"},{"line_number":100,"context_line":"    multi_compute_info \u003d ironic_compute_batch_info[\u0027multi\u0027]"},{"line_number":101,"context_line":"    if len(multi_compute_conf) \u003d\u003d 0:"},{"line_number":102,"context_line":"        return [f\u0027{host}-ironic\u0027 for host in classic_info]"}],"source_content_type":"text/x-python","patch_set":49,"id":"eab9b85a_a1eb982c","line":99,"in_reply_to":"ac6e7920_3964097e","updated":"2026-04-17 16:24:00.000000000","message":"Other than a bug in json_query, I can\u0027t think of a reason why it would not return a dict where this is used. Can you give an example? I don\u0027t think it\u0027s worth over engineering otherwise? happy to raise an exception if you think it\u0027s really worth it.","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"}],"releasenotes/notes/add-nova-multi-compute-ironic-support-1bf5c64f8a530cc9.yaml":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"cb3d589e499716e60ed4519d962e487f0396ff15","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for deploying multiple instances of the Nova Compute Ironic"},{"line_number":5,"context_line":"    service on the same host. This is useful in large baremetal deployments."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    If you are migrating to the new feature to deploy multiple instances of"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"064e9232_6c777138","line":6,"updated":"2026-04-17 14:07:08.000000000","message":"That extra newline is not needed","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"},{"author":{"_account_id":17669,"name":"Doug Szumski","email":"doug@stackhpc.com","username":"DougSzumski"},"change_message_id":"63f03938d6188c2056a7f2a3a6fdb1440fed16e7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for deploying multiple instances of the Nova Compute Ironic"},{"line_number":5,"context_line":"    service on the same host. This is useful in large baremetal deployments."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"},{"line_number":9,"context_line":"    If you are migrating to the new feature to deploy multiple instances of"}],"source_content_type":"text/x-yaml","patch_set":49,"id":"1be23844_1bd80817","line":6,"in_reply_to":"064e9232_6c777138","updated":"2026-04-17 16:24:00.000000000","message":"Done","commit_id":"0f1623f99c93edfee30b247992f37fc5f6c957f7"}]}
