)]}'
{"id":"openstack%2Fhorizon~977939","triplet_id":"openstack%2Fhorizon~master~Icb8d65521dce07118eef3a7c76d221d51f3ff17b","project":"openstack/horizon","branch":"master","attention_set":{"36082":{"account":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"last_update":"2026-10-10 17:08:19.000000000","reason":"A robot voted negatively on a label"},"36012":{"account":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"last_update":"2026-10-10 17:08:19.000000000","reason":"A robot voted negatively on a label"}},"removed_from_attention_set":{"32432":{"account":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"last_update":"2026-06-24 12:18:40.000000000","reason":"Change was abandoned"},"6914":{"account":{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},"last_update":"2026-06-24 12:18:40.000000000","reason":"Change was abandoned"},"8648":{"account":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"last_update":"2026-06-24 12:18:40.000000000","reason":"Change was abandoned"},"35133":{"account":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"last_update":"2026-10-12 07:36:00.000000000","reason":"\u003cGERRIT_ACCOUNT_35133\u003e replied on the change","reason_account":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"}},"37598":{"account":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"last_update":"2026-06-24 12:18:40.000000000","reason":"Change was abandoned"}},"hashtags":[],"change_id":"Icb8d65521dce07118eef3a7c76d221d51f3ff17b","subject":"Add Horizon panel to enable TOTP MFA enrollment","status":"NEW","created":"2026-02-25 10:48:38.000000000","updated":"2026-10-12 08:31:11.000000000","submit_type":"MERGE_IF_NECESSARY","mergeable":true,"submittable":false,"total_comment_count":90,"unresolved_comment_count":6,"has_review_started":true,"meta_rev_id":"84d80ef3ed939f3bbbe0e47c671b9e0bf3a4518f","_number":977939,"virtual_id_number":977939,"owner":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"actions":{},"labels":{"Verified":{"recommended":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},{"tag":"autogenerated:zuul:check","value":1,"date":"2026-10-12 08:31:11.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":1,"default_value":0,"optional":true},"Code-Review":{"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},{"value":0,"permitted_voting_range":{"min":-2,"max":2},"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},{"value":0,"permitted_voting_range":{"min":-2,"max":2},"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":0,"permitted_voting_range":{"min":-2,"max":2},"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","default_value":0,"optional":true},"Workflow":{"all":[{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true},"Review-Priority":{"all":[{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},{"value":0,"permitted_voting_range":{"min":-1,"max":2},"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},{"value":0,"permitted_voting_range":{"min":-1,"max":2},"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":0,"permitted_voting_range":{"min":-1,"max":2},"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"}],"values":{"-1":"Release Freeze"," 0":"No Priority","+1":"Important Change","+2":"Gate Blocker Fix / Urgent Change"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"}],"CC":[{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-02-25 11:30:24.000000000","updated_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"reviewer":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2026-02-25 12:01:31.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"state":"CC"},{"updated":"2026-03-10 13:11:15.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},"state":"REVIEWER"},{"updated":"2026-03-10 13:11:15.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"state":"REVIEWER"},{"updated":"2026-03-10 13:11:15.000000000","updated_by":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"reviewer":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"state":"REVIEWER"},{"updated":"2026-06-18 18:46:43.000000000","updated_by":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"reviewer":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"state":"REVIEWER"},{"updated":"2026-08-29 16:18:37.000000000","updated_by":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"reviewer":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"state":"CC"}],"messages":[{"id":"40176e03f558ccc616db2471d107fbfa3c251ab7","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-25 10:48:38.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"0a17f00478128ebcee1e286fde808ecd0cd06ac5","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-02-25 11:30:24.000000000","message":"Patch Set 1: Verified-1\n\n(21 comments)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/19f47c0b3c63479cb731d723c70b622f\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/03cf2f2aef3249a88713eb368c4f3450 : SUCCESS in 3m 50s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/637f2a264d9d4125957e84d070c2461f : SUCCESS in 3m 38s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/462f16a5f84f4404aeaeb8d2fe8d6387 : SUCCESS in 3m 12s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/7c673c214f384c18b50f274bc7b7c43a : FAILURE in 8m 05s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/3e7260f2f33b455b82215c760f875592 : FAILURE in 7m 22s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/2b2a57e5225b4cc2b71f36fcd41256ba : FAILURE in 15m 46s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/65012d737c1d4dadbd7385f1287609f6 : FAILURE in 15m 48s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/759d17d327ac4966b80c375601dfa857 : FAILURE in 3m 41s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/c9f9be702ce74c09aed75a0a905f4ec9 : FAILURE in 15m 07s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/d8cbb1fc5d204007b3354cb04cd63370 : FAILURE in 35m 41s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/4246ab7bb89c46828964172839b8cf14 : SUCCESS in 13m 29s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/1fc87c6a509d4e1cb139266ae1e12557 : FAILURE in 5m 03s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/68777208321c4c8c87d14d91696716c2 : FAILURE in 29m 37s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/9c2c3651cab049cdbce0fe53e737d6f4 : FAILURE in 26m 15s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/0aa1f5b29cdd46ad95b747286b43c659 : SUCCESS in 12m 55s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/e1e789d586f546babdc67f14470a83f2 : SUCCESS in 4m 04s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/dca146a0bf6d446eab767c68248eb594 : SUCCESS in 24m 36s","accounts_in_message":[],"_revision_number":1},{"id":"0b13d149f906ff0dee4aba11372e7fb72662e4dd","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-02-25 12:01:31.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"92a304291c2e07b1e41de8ece6aeba6f2f031d09","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-25 15:41:38.000000000","message":"Uploaded patch set 2: New patch set was added with same tree, parent tree, and commit message as Patch Set 1.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":2},{"id":"d06a9de429d1504560bf9c6076ddd7934456da24","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-02-25 15:46:04.000000000","message":"Patch Set 2:\n\n(1 comment)","accounts_in_message":[],"_revision_number":2},{"id":"fce7e276d5dcf3ce3053ce4f6554031b6c36c32d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-25 15:53:15.000000000","message":"Uploaded patch set 3.","accounts_in_message":[],"_revision_number":3},{"id":"939c4c4ac1502a196d2003eb2cba5f0d322b163a","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-02-25 16:04:50.000000000","message":"Patch Set 3:\n\n(1 comment)","accounts_in_message":[],"_revision_number":3},{"id":"6d3f1fffbf74c9248ef42b88602a45a5033c5640","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-02-25 16:38:10.000000000","message":"Patch Set 3: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/285b1fe550a844b7864cc416672543e6\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/d796930b457c473ebfd95ec6642d287a : SUCCESS in 4m 16s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/93e034f633004cd5b3f34b741116ef65 : SUCCESS in 3m 34s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/b434ae2135b8434a8c97989ce86be4bb : SUCCESS in 5m 59s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/d7e0585f21bf4192836eb6f01aaabe09 : FAILURE in 6m 50s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/0fe563c7613e4796925c600069c5a281 : FAILURE in 12m 35s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/df04d2f921c54e6fb89e04d9c41e9197 : FAILURE in 15m 46s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/5bd99f2107c5470e8e8a6a7f73814e6b : FAILURE in 17m 20s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/1b0667bbb83f471da68f88fbc4c54d5a : SUCCESS in 4m 55s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/89e0a7c7657046cc83ce68bad6898212 : FAILURE in 18m 09s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/ae78254b2f94460298755754074cda87 : FAILURE in 14m 33s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/b618c9da2e2a43fa837f6d461de8ab5e : SUCCESS in 16m 36s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/2c01b074634d469f87def2e781dab8bc : SUCCESS in 15m 09s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/c3e5703f62b644cdb377cec43cd173bd : FAILURE in 5m 14s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/7f0b15d4538840edac3fcf8b2c8524bb : FAILURE in 25m 10s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/7fbd860ec9ac47be9eb8f1febd758be5 : FAILURE in 24m 59s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/53e7887482ab4b6d9cba96f78797c336 : SUCCESS in 36m 08s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/2224a396326a48f0911974e9b6e9dca0 : SUCCESS in 4m 25s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/a702e15235d045c8bad5969112576d5f : SUCCESS in 30m 30s","accounts_in_message":[],"_revision_number":3},{"id":"5c6c45765b06b46948bdb66fc7637c1cdbd4f6df","tag":"autogenerated:gerrit:setWorkInProgress","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-26 08:53:40.000000000","message":"Set Work In Progress","accounts_in_message":[],"_revision_number":3},{"id":"51015f32c2ada80725471bb64b78b0ea62eb43fe","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-26 13:10:15.000000000","message":"Uploaded patch set 4.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":4},{"id":"a9083c2f0cde3546efd65b89fb03a99968cc3a8f","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-02-26 13:13:41.000000000","message":"Patch Set 4:\n\n(1 comment)","accounts_in_message":[],"_revision_number":4},{"id":"53cee6298b31aab5268113be18bead2f16247ba7","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-26 13:26:34.000000000","message":"Uploaded patch set 5.","accounts_in_message":[],"_revision_number":5},{"id":"243b50e567e12c06d0e57674138e023c6d575474","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-26 13:35:50.000000000","message":"Uploaded patch set 6.","accounts_in_message":[],"_revision_number":6},{"id":"53ccc6fa08baea45e230c4387f2d6d3e0439c8bf","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-02-26 13:38:01.000000000","message":"Uploaded patch set 7.","accounts_in_message":[],"_revision_number":7},{"id":"7a683712b1a6983ff5f236b9e006ab00c341bb49","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-02-26 14:19:02.000000000","message":"Patch Set 7: Verified-1\n\n(1 comment)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/b3843d54e6954d5ba2f0c9e795a14ef7\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/4195ef9ecaac492ba1b9a356a0c2212a : SUCCESS in 8m 04s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/f16136f5e7f6401c94ccdfcb74c57776 : SUCCESS in 4m 07s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/5a27e35067444e1a82c6d5ca4faabfbd : SUCCESS in 4m 16s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/0d64d72e144a4ff88ec803e9696d0a7f : FAILURE in 7m 02s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/d575be9426f8448eb6089250a0b0c3a1 : SUCCESS in 15m 15s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/ca3a3a94be264195b37863e8d0acd25f : SUCCESS in 16m 30s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/dd912978f77d4245869305f2a58e5105 : FAILURE in 17m 52s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/fb514bf04bf44be7b7475a94bc016782 : FAILURE in 4m 21s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/084fd467678f4c32990246d6324c9c43 : SUCCESS in 8m 36s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/a22c1713c5954f2ebd1d809952680caf : FAILURE in 14m 07s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/cae3285991874e4fa662c01ea473674e : SUCCESS in 15m 47s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/6ee53204b4464b30b69598faaf086f0a : SUCCESS in 16m 08s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/d33b01523c6144fa9932e5c7b680dcd8 : FAILURE in 4m 51s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/23280feca9774cc4b8848383fae8e615 : FAILURE in 12m 03s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/cd466184e93540359aacdaed7fd4f9fc : FAILURE in 25m 50s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/1c1bb8a21f714106b47beb54d3ec8856 : SUCCESS in 29m 23s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/57a7483d3eb44e319f392441832c24b0 : SUCCESS in 3m 47s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/8a07ae6e0d964946a0fef17115061de5 : SUCCESS in 33m 55s","accounts_in_message":[],"_revision_number":7},{"id":"d14aa109101c9cdbcd09ddd407d763d217682aca","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-06 14:54:24.000000000","message":"Uploaded patch set 8.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":8},{"id":"33def46e4560d809504f8ca379780b8c9802469b","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-06 14:59:25.000000000","message":"Uploaded patch set 9.","accounts_in_message":[],"_revision_number":9},{"id":"635b4dcf768364e23cb496af4f7ba94a76f0a41a","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-06 15:33:05.000000000","message":"Patch Set 9:\n\n(2 comments)\n\nThis change is ready for review.","accounts_in_message":[],"_revision_number":9},{"id":"ae29594da97827c2889ad20089b7b8f506b4b43b","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-06 15:33:54.000000000","message":"Patch Set 9: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/f629a5b051394917a9dfde722ca9b475\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/9e33210c58774d368fa51ef778cb739c : FAILURE in 5m 41s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/292af80e93ab4c38bcfd5c3dab28b0df : SUCCESS in 4m 48s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/f66f52549c5f4725bc3864d2b4207243 : FAILURE in 2m 22s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/19dc69c0ccc241a8af3f679c41774bd1 : SUCCESS in 4m 42s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/067d50dbc83b494f9ceada7a567aa574 : SUCCESS in 7m 28s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/493ce355145346518d5e615c0d39f288 : FAILURE in 5m 44s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/77bfd5aa505a4adebea263e6c8718cc6 : FAILURE in 6m 57s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/913d01a5bea54cf7b26be53de2a26dfc : FAILURE in 8m 17s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/7b441baa75ca4c2d89e19ee2b4e51c7a : SUCCESS in 2m 51s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/3fe20e908ef94c80804cfa1328edfeeb : FAILURE in 3m 35s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/bff824b03a1c450eaf97b34c64079197 : FAILURE in 6m 40s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/461b2ae7b7b143c4b47deb3f3b050f36 : SUCCESS in 11m 04s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/218762aa927143c8bc8e4b93eb1fd1c9 : SUCCESS in 12m 20s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/b640dc7d87894901bfea4185a3c60b2b : FAILURE in 4m 30s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/348ec3c5225248458961594da60ab497 : FAILURE in 28m 32s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/2d83e68c50964aa3af88e49b68eefc14 : FAILURE in 24m 58s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/b6ae0f2c2cdf4d4a9eb374e13a394b26 : SUCCESS in 29m 32s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/e5a43d2d911044c3a36a2607ffe2938f : SUCCESS in 4m 04s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/bf3ec35d0c6a41ed8ab1f435a88b3868 : SUCCESS in 19m 47s","accounts_in_message":[],"_revision_number":9},{"id":"279c428597b0093e3e4ea15391da17cb9f82c9ce","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-10 13:06:15.000000000","message":"Uploaded patch set 10.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":10},{"id":"335afe120d3327e7658f3a198bfe00394e5e2ece","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-03-10 13:07:48.000000000","message":"Patch Set 10:\n\n(1 comment)","accounts_in_message":[],"_revision_number":10},{"id":"efa59caad228ea6064c8002f26ae62463105e952","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-03-10 13:09:27.000000000","message":"Patch Set 10:\n\n(1 comment)","accounts_in_message":[],"_revision_number":10},{"id":"fee77c2122a182950cce65e3849e2d5b4c326a6a","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-10 13:21:39.000000000","message":"Patch Set 11: Commit message was updated.","accounts_in_message":[],"_revision_number":11},{"id":"7211aea7272b3619c56951b39dbbc0ce648ecb35","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-10 13:22:39.000000000","message":"Patch Set 11:\n\n(1 comment)","accounts_in_message":[],"_revision_number":11},{"id":"94ad2e76a32baad03eabad603a22b4059b787d8e","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-10 14:26:04.000000000","message":"Patch Set 11: Verified-1\n\n(1 comment)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/491d23d60f514e528659b2569d9f8fed\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/211b854c89c4441b9e9167b66c0915fc : FAILURE in 5m 42s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/f557e87d33224944b99f4cf2a949d882 : SUCCESS in 6m 16s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/3c49b44a44214d6b8e87a368bd4d8435 : FAILURE in 3m 35s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/697b1aa4b86340a1abe86fb6d00f68db : SUCCESS in 6m 28s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/5bc07e4e4fca49a5b495de5c503423d5 : SUCCESS in 6m 12s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/fcd54271ea8e436e95e425c3d14d6ee2 : FAILURE in 15m 56s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/496f7ba0a8a9435d86b7166ad75285e4 : FAILURE in 13m 28s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/f3f0c2fc12094ec79ea4a1e27e734ba8 : FAILURE in 20m 11s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/c5a28df12028450f9cf4e8e718ce51c6 : FAILURE in 4m 06s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/d1c718d3949a4d489e5693ba67686784 : FAILURE in 8m 30s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/998d493aa76f444885c480e5abe2fe21 : FAILURE in 15m 03s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/fc3550eba1474d07a4f8117b8b650f56 : SUCCESS in 8m 23s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/b73e2d0d0cd6486187b7ac37df456fa9 : SUCCESS in 14m 48s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/68778eabcf8c40ba9920ebbf3ddc4980 : SUCCESS in 6m 45s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/fbc62ec88369458cb06dbd4e01efbe92 : FAILURE in 49m 20s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/6e381d2b0a344dfba44947472d5fe3d1 : SUCCESS in 31m 38s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/eaa1e6dfb867433488054f74f4b2a34e : SUCCESS in 30m 47s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/0a5ccfab5545403cade6d00fc9df204a : SUCCESS in 4m 17s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/01415302dec041cc9f2d3ff35ade1136 : SUCCESS in 14m 21s","accounts_in_message":[],"_revision_number":11},{"id":"1dbc0010d474190f6d757ce8462db8ba2379a63b","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-11 12:33:39.000000000","message":"Uploaded patch set 12.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":12},{"id":"3613e36503c18b43d0791e4d1fd90707a092942a","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-11 13:18:25.000000000","message":"Patch Set 12: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/a83b2255ace242b7914986caf7dd4bb1\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/fb5b361c3b69497188c156d32a05752c : SUCCESS in 7m 20s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/415765ef0ad44ffbbe1c403d386c4f53 : SUCCESS in 5m 56s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/564b1a6fb9944bf0a53fbee4cbf4225c : SUCCESS in 3m 40s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/9603730a64864e5ebd1da832cce3f90c : SUCCESS in 2m 52s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/8001cbe2cab749209f22e104d0c64650 : SUCCESS in 4m 19s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/429b50957ce243568b2f763219fd3f9b : SUCCESS in 9m 38s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/b45d903e08404d1683561cc8be1790dc : FAILURE in 8m 44s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/ba4ce478caf5451494481f64e53ed466 : FAILURE in 8m 54s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/e78ef20b21034869b88bee3f0480c3c5 : FAILURE in 9m 27s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/847d75c51aba4309add7bb35ba585172 : SUCCESS in 4m 38s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/995b21f82fb64abd8387f006bd9be4ac : FAILURE in 18m 41s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/33ce39df61fa43af92ba8f552a577b47 : FAILURE in 37m 58s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/f58b30bb98e1495aa1ad31665e87a2b3 : SUCCESS in 15m 54s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/de756fb3932c4d698a4b579dc2ef1f3d : SUCCESS in 9m 35s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/47e3a1b4859041fcab8655c7b4892a13 : SUCCESS in 6m 21s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/4b217e3e110e4843954c46aee288ee2a : FAILURE in 35m 46s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/66b6c9ea4bcf4a0f84904f8dc25e20c9 : SUCCESS in 23m 30s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/5ce1c5ae1bf34a3ea28b3bce27815d4a : SUCCESS in 17m 48s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/5716418c6c284cd18ac6cb460201500d : SUCCESS in 4m 11s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/037c2d9e61ae49eda0c4b8faf9fd77e4 : SUCCESS in 29m 48s","accounts_in_message":[],"_revision_number":12},{"id":"1d625734da2e1ad072ac2258be90ee7d217163df","tag":"autogenerated:gerrit:setWorkInProgress","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-11 13:36:09.000000000","message":"Set Work In Progress","accounts_in_message":[],"_revision_number":12},{"id":"89f7bcaa0f209be5bf9f6c993489d6ff81804035","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-17 08:16:41.000000000","message":"Uploaded patch set 13.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":13},{"id":"846f6d5b9657157786add062b3d4edf6ae31f28a","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-17 09:02:53.000000000","message":"Patch Set 13: Verified-1\n\n(1 comment)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/ad880b1ea12c4fa48e76be419c25818e\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/bc045f00e0d4418b91392582074e5e68 : SUCCESS in 7m 34s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/ef7f379df7e44704a5fed877ad6f10a7 : SUCCESS in 8m 08s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/872cd940d23a44ad90aee3f5ff6c79f1 : SUCCESS in 2m 08s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/0c9f3cda08db4e17817338ab06c54e62 : SUCCESS in 3m 22s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/468c391e940c4d0d8091b22a2362ba84 : SUCCESS in 4m 10s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/1dd912b9c6d947e1bf74585701d29443 : SUCCESS in 4m 40s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/eef51c5e006c4d7ea0afca12de74c83d : FAILURE in 8m 13s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/eef6591aa27440e585e4c4b5cbc9f9d3 : FAILURE in 8m 30s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/de6d9d9a70f54801b580bee6501645eb : FAILURE in 16m 09s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/6055985a1e9249128566d4bd6f31d4f6 : FAILURE in 2m 42s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/0fa81b7dc35b4cf48b2f77cc94db678e : FAILURE in 16m 11s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/a9618829130b47b1be97b7fba7aadf8d : FAILURE in 21m 23s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/1ef72beb92b249d49bb81229835d35e0 : SUCCESS in 8m 47s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/041f7b9920fb43678943fcb4e3c256a7 : SUCCESS in 8m 37s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/7aed3f169fef4b988298e3fa26173009 : SUCCESS in 4m 03s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/40de3238b2e94c12b89e5933c48e6e0d : FAILURE in 44m 02s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/bb3ff144cb2c4a079a9aee33aa17a049 : SUCCESS in 18m 55s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/af3e75dd6406486390e888e5e860a529 : SUCCESS in 17m 50s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/5dd336a2da5641eaa2809ad0beb9be59 : SUCCESS in 2m 53s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/8829d9fba6a84c3694d807ec2b681d10 : SUCCESS in 14m 58s","accounts_in_message":[],"_revision_number":13},{"id":"a5be89099fdf28e6a9c5833423df82151b121b32","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-17 09:30:57.000000000","message":"Uploaded patch set 14.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":14},{"id":"112a178314224fd3bb762966f86dac2ebeff6891","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-17 09:49:44.000000000","message":"Uploaded patch set 15.","accounts_in_message":[],"_revision_number":15},{"id":"2a4c34fc6e07b5d038c6aacc851ee520b40da556","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-03-17 10:48:52.000000000","message":"Patch Set 15:\n\n(5 comments)","accounts_in_message":[],"_revision_number":15},{"id":"9c1c37f5027b8a36d31d6dbdfdd3f1e12ff608bf","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-17 10:55:33.000000000","message":"Patch Set 15: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/82d5dbf4dbda4d2e93bae2a3b63dcabd\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/2f50c39409bd45d0873396a1c70f1758 : SUCCESS in 6m 40s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/7a452a1ada3e4735a326545503e395ec : SUCCESS in 3m 56s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/bab80f03324743dbbeb3812929f02b84 : SUCCESS in 3m 12s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/3b70640cb7a34682aa2e1fefbefce726 : SUCCESS in 2m 06s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/c0a7d1e140a140b48247ec7be1d36dcb : SUCCESS in 3m 50s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/98c09586617e4ccf96055850f2ac6ee2 : SUCCESS in 5m 04s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/655e27870e8a4b12923aea36894eff06 : SUCCESS in 7m 14s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/1be4c6f1086c40c1b5f73e393ca68e9f : SUCCESS in 15m 37s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/119da9876138451c80b2040bd8eeb9cd : SUCCESS in 17m 19s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/44443961f5f54cc4bf9140263b89865c : SUCCESS in 4m 40s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/c6f7ebed4c7647279a62fbe35948ed28 : SUCCESS in 17m 43s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/70d35cea12444b7a9245e41b6ffa8f5b : FAILURE in 36m 41s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/62f6e20698e244d7bae00ebf6be27d74 : SUCCESS in 14m 52s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/2bf8c56dea9f416f9ee7d990a9b9ee76 : SUCCESS in 13m 15s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/19c25c905f074c368852e41338e590ac : SUCCESS in 8m 04s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/d09ec5e3d280446dad3efa02e18f16c5 : FAILURE in 1h 01m 05s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/29d25a094e664a0883dc5a7aa660587a : SUCCESS in 23m 36s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/2e5de2ea19f84a7c8a309720f71eeff1 : SUCCESS in 22m 22s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/00ce1ccd95d54e7d8288b9e0aca54289 : SUCCESS in 4m 01s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/c11dc3c1ea62492aa16b062c5edee3d5 : SUCCESS in 20m 06s","accounts_in_message":[],"_revision_number":15},{"id":"12deb55a51ef6ce6c0b4c0054e6f34a8d8e6757e","tag":"autogenerated:gerrit:newWipPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-17 11:13:00.000000000","message":"Uploaded patch set 16.\n\nOutdated Votes:\n* Verified-1\n","accounts_in_message":[],"_revision_number":16},{"id":"6a1bba05e16e17c743bf15f2a3e416d07b02a637","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-17 11:14:26.000000000","message":"Patch Set 16:\n\n(5 comments)\n\nThis change is ready for review.","accounts_in_message":[],"_revision_number":16},{"id":"883b30a953b375f26fbbc82610579808bd9f0b08","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-03-17 11:18:01.000000000","message":"Patch Set 16:\n\n(4 comments)","accounts_in_message":[],"_revision_number":16},{"id":"0179af38f1cdb679b2d50d71911b5c29d7533f23","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-17 12:41:47.000000000","message":"Patch Set 16: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/5539968a2cc44e72949760fbff1fdb70\n\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/58760451df30404b97c0f4b0c2a018e0 : SUCCESS in 6m 49s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/ae9ff173658a48cdac42f2d87224bbb2 : SUCCESS in 3m 38s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/315ce045977646e1a2884a5ea4bee04d : SUCCESS in 3m 42s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/c701e51776284fb7826d7b8ad19a013f : SUCCESS in 3m 08s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/cc93df97aec74234967a5814804d8cca : SUCCESS in 4m 02s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/6c63dca3759d4956b65da381f61be321 : SUCCESS in 8m 32s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/3e75c0536f2642b9bead5d4ed95d08b7 : SUCCESS in 15m 34s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/72fe7cb3477242b89a7305dc9f5c50ab : SUCCESS in 15m 08s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/47c3dcd271874de5a82a31986baef417 : SUCCESS in 15m 16s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/02254b05bae04c398d15cc8cb8903179 : SUCCESS in 3m 22s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/96be82d6e666449cb3629ad38619af04 : SUCCESS in 8m 58s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/fbe8685560ca449f832eed3748a3bea8 : FAILURE in 33m 12s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/83931e1f007c4639b543f1d2ee2e9b04 : SUCCESS in 11m 46s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/3eda2512e39f459eab84c70782821c65 : SUCCESS in 15m 15s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/18c8b15d5b64405e85010c001fc72305 : SUCCESS in 6m 15s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/d1cd9f2e5de94688bef265aace9ff48d : SUCCESS in 1h 23m 39s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/e1ae7f084b38400a99de612992191956 : SUCCESS in 28m 30s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/a112850dbbc842eaa4265e6f497ca371 : SUCCESS in 14m 27s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/a0ab40b8dc6647d7942d55c397845e2f : SUCCESS in 4m 28s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/c4deb584e5db4031be8921598a2845aa : SUCCESS in 30m 46s","accounts_in_message":[],"_revision_number":16},{"id":"d5ea6f6ecb21c086216cb8e883f0926157bc8549","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-03-25 15:03:25.000000000","message":"Patch Set 16:\n\n(1 comment)","accounts_in_message":[],"_revision_number":16},{"id":"1091f21b6444ad51d6d4c499de9c455d603202fe","author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"date":"2026-04-09 15:03:24.000000000","message":"Patch Set 16:\n\n(6 comments)","accounts_in_message":[],"_revision_number":16},{"id":"e8dbee8e533f253a4b21a164bb6d19088de42930","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-04-10 09:39:25.000000000","message":"Patch Set 16:\n\n(4 comments)","accounts_in_message":[],"_revision_number":16},{"id":"5d22745bfd3e62eddbedde74a4dc5ed2f7510f1c","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-04-13 09:55:41.000000000","message":"Uploaded patch set 17.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":17},{"id":"f8fa5d5e55fa224fe9b47db807e4b5cfd8e57aae","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-13 12:18:28.000000000","message":"Patch Set 17: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/1affaa1fcc1746d8900866c2aa529cd7\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/a4f2470ec6f04997b985cb8bab1a10c0 : SUCCESS in 2m 13s\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/12a89b70582e43689b8db82743af1f6c : SUCCESS in 6m 37s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/cec0021be0b84e4b97f96c4eded330b2 : SUCCESS in 6m 50s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/9b01dc691f5744769eeac6d42847671f : SUCCESS in 3m 27s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/129674ba08594976bcb52bf8cc473d0d : SUCCESS in 5m 43s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/45cf35d75cb84b19bbbed81d3a6777ca : SUCCESS in 4m 48s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/99507711926147b78e4509f0a26dc4c4 : SUCCESS in 6m 20s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/59221a896e164c76a3b362a22b00708a : SUCCESS in 15m 37s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/7431a005962144b9850bec2aeba8a4d0 : SUCCESS in 16m 38s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/7f349bf04a984005a29a4179c0d0228d : SUCCESS in 18m 44s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/e1f24a4c4e7b4905a83f0564a9e97c86 : FAILURE in 4m 44s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/f7da34f00e2f4b50bda0eba7a8f638bc : SUCCESS in 19m 13s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/a73823718f304e6ab3931de2367e6245 : FAILURE in 15m 17s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/ec90b5a844664cd3b9946d363c1faed1 : SUCCESS in 14m 33s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/5a45d293ed054be9917dcd08845f4072 : SUCCESS in 19m 09s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/3556f80771704faba1728a0863116e2e : SUCCESS in 6m 01s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/a9ccb7815c604fd0b0707a86af4112fd : SUCCESS in 1h 24m 31s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/68c7eb9080dd481caa1ce9efee409cdf : SUCCESS in 31m 05s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/0301f10e2f064affa1eb24c6de810bb4 : SUCCESS in 31m 45s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/5e281d9ccda1499bac1ebe6be8c38d97 : SUCCESS in 4m 30s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/3c45a9ab786f4763b11bb24caa4c7000 : SUCCESS in 34m 04s","accounts_in_message":[],"_revision_number":17},{"id":"df9c2b8fa12cb4e626d77783ad523d3980b8f246","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-04-13 12:41:50.000000000","message":"Uploaded patch set 18.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":18},{"id":"ce0944c443a90551f8975635381d9735146f9282","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-13 14:13:41.000000000","message":"Patch Set 18: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/16a735fafacf48a59d6e0b5c6bf24e83\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/3eaf120762774be38372a42f4f193ddd : SUCCESS in 2m 34s\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/f7ee3538748849018be8eb1b704aee14 : SUCCESS in 7m 09s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/3d0ae418b06245e58edd4eda47839465 : SUCCESS in 5m 47s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/f41eea7e37f34334a6720a5400547524 : SUCCESS in 4m 25s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/7ef9784b110e4a88a05265e54151b955 : SUCCESS in 3m 19s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/81b90c3501b14630a83970a2365992a7 : SUCCESS in 4m 25s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/080a8af7868a4036ab5f0b505a66e53c : SUCCESS in 6m 32s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/7cc04cdcc5d1455bb97a1a7cf965b9e4 : SUCCESS in 16m 00s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/227dd569a7cd4ff8ba2ee2c2784ff68e : SUCCESS in 15m 47s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/c2d713b7320b4c3493ca7dd9a2ac4b0c : SUCCESS in 18m 48s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/5566cdb04f7543d2b5c297a53d1a4767 : SUCCESS in 5m 44s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/a36156a9105645a89e50b35246866e65 : SUCCESS in 19m 50s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/940c1bea981346b9b1c4ca1759f999a9 : FAILURE in 37m 28s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/b7bc396241984d9f92e18c5165e299bd : SUCCESS in 19m 58s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/bc98c5c37dab47e89b2f279bd17e6f3f : SUCCESS in 18m 55s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/88f456dbc29348e0aed59efb57e4c7a5 : SUCCESS in 15m 51s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/21d0a8bdaca345e4b61994902a5b1b4a : SUCCESS in 1h 29m 03s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/d3deac057bb5454886e2e3fbcc1b732d : SUCCESS in 35m 02s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/772a7843e2154ea8b519634cfcd87a7d : SUCCESS in 32m 32s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/2cd77bfb7d494f7bab0b3726affe5df2 : SUCCESS in 4m 26s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/81543177745e46189cfd9a1c056fc5b8 : SUCCESS in 38m 12s","accounts_in_message":[],"_revision_number":18},{"id":"045f75e54746b268d79e3aa497f55efd7ba44095","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-04-14 11:21:10.000000000","message":"Uploaded patch set 19.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":19},{"id":"6b89c84debe83b18bf163232977f28e41dcfd1b2","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-04-14 11:22:18.000000000","message":"Uploaded patch set 20.","accounts_in_message":[],"_revision_number":20},{"id":"2d9afcd4555d3200a5fdda8b7d501eee3aca7928","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-04-14 11:55:37.000000000","message":"Uploaded patch set 21.","accounts_in_message":[],"_revision_number":21},{"id":"9b2f0a97a08df7f561360c19802e1896a778eaf1","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-14 13:15:03.000000000","message":"Patch Set 21: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/284978f05e3a49d6826ec4ed0491de74\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/af1addf017ae446d9b6ebec7b2b4710e : SUCCESS in 2m 46s\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/99cc4bc232e14dcc901b2ef635b4014e : SUCCESS in 7m 40s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/e82a9dd086bf4d10af8379034363149b : SUCCESS in 5m 51s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/5841e5d4cff34828bb7deedb79151832 : SUCCESS in 4m 18s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/3cd7469cdf414112a377c4447f7448e3 : SUCCESS in 5m 06s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/53495670ce0147fa99b2f625dbef1160 : SUCCESS in 3m 23s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/0147feb8659d450b8c96c7cceb0733c4 : SUCCESS in 6m 59s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/1a6517469e324ae1b050fb9abbf1efd6 : SUCCESS in 13m 42s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/999ed1aedf7a4e4b9adaf5c06465ccdd : SUCCESS in 16m 53s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/a4a672dee5a24d9b93a8b546f961cde4 : SUCCESS in 18m 40s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/8c36f3d5754848f2a9b89625004bffa0 : SUCCESS in 5m 22s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/a0178a8f57dc412693fa62169cb8827d : SUCCESS in 8m 54s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/bd77132379a046049c4803be0f47e8d8 : FAILURE in 35m 26s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/501d29883fe045f194b89ced40963b82 : SUCCESS in 15m 01s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/42d8bbd6112f41bba764154d35606027 : SUCCESS in 14m 41s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/9efd8bafe37f4370954d02dfe9aa0599 : SUCCESS in 6m 09s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/c6c60a8fc3394d0e8c714587b5b4757d : SUCCESS in 1h 15m 07s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/a0f8650e1d6941409541a4cc875b63d4 : SUCCESS in 30m 41s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/b3ba95cff42e47fd88cf4b3961c5ce47 : SUCCESS in 33m 24s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/5272c92b90ce49d0a8089faef702c654 : SUCCESS in 6m 27s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/bae82533ec964c6cb282ca8f0d746c97 : SUCCESS in 31m 17s","accounts_in_message":[],"_revision_number":21},{"id":"bb2be9fc7fd9050a2673842547c10fa26637d5cb","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-05-28 12:34:31.000000000","message":"Patch Set 21:\n\n(4 comments)","accounts_in_message":[],"_revision_number":21},{"id":"6f1ed42f85b28152f27d121c4c17927b5b1b0bd0","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-05-28 12:53:14.000000000","message":"Patch Set 21:\n\n(1 comment)","accounts_in_message":[],"_revision_number":21},{"id":"d3326fc6049332cdd20bbdbb32402760d7ad9a43","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-06-10 23:56:10.000000000","message":"Patch Set 21:\n\n(3 comments)","accounts_in_message":[],"_revision_number":21},{"id":"ce3fe2fc3fbeea0e2a50a845af2b8c0495b50818","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-06-11 11:47:31.000000000","message":"Patch Set 21: Code-Review-1\n\n(3 comments)","accounts_in_message":[],"_revision_number":21},{"id":"8e9a4d30fb10afcd2e959c157baa1b1cccaf5fbe","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-12 07:04:39.000000000","message":"Patch Set 21:\n\n(1 comment)","accounts_in_message":[],"_revision_number":21},{"id":"1aa96ccf776d7d2bf036695e9f995ccb2d95092b","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-12 09:46:45.000000000","message":"Patch Set 21:\n\n(1 comment)","accounts_in_message":[],"_revision_number":21},{"id":"08e43a4f48b16d319e8690711d91d774cba03321","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-15 09:39:06.000000000","message":"Uploaded patch set 22.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":22},{"id":"abf13164af8b3fb67dc3e1780527f37931c5ad0d","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-15 09:50:00.000000000","message":"Patch Set 22:\n\n(1 comment)","accounts_in_message":[],"_revision_number":22},{"id":"6bc487537f0514020631a26d3111f3cc8f44bb63","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-15 10:56:32.000000000","message":"Patch Set 22: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/e4d62d7b4e6e4e19acdb34a3e2c24dcc\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/02185bb7c26c41bca49a9f9d361b31ab : SUCCESS in 2m 25s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/628471bba5324638b74154c5f6145fb0 : SUCCESS in 3m 13s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/78516916e4ab49e48b0c22f8c4001b31 : SUCCESS in 3m 20s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/fce77fd750b346f4a39205ca0b93bf87 : POST_FAILURE in 5m 14s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/bf23f7f023794de8a82188f8f72666c9 : SUCCESS in 3m 47s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/4ce6431d822d45e5aeda1d2033c8648f : POST_FAILURE in 3m 13s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/0eb75dfb305d4674a1ecf83d3efdd113 : POST_FAILURE in 7m 07s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/8f194ef917794d0f900b973d6ef7cc63 : SUCCESS in 4m 02s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/c97fb0f6d8f547ada82adfebe459c114 : POST_FAILURE in 5m 29s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/6acdeee1f8c44abeb08ba7a49a7418cc : SUCCESS in 17m 49s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/1985749c3a4c448e8a1a6a51fadb89cf : POST_FAILURE in 12m 49s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/7bba5402f2c8488aa207785f88474829 : SUCCESS in 17m 49s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/9675d00ec28b483fb34afd840ec0f5c5 : SUCCESS in 4m 45s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/e9ee9a3a737a4f02bd8d7d91c7b6d175 : POST_FAILURE in 19m 36s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/7c51742a76174b5eaf6a883fb47a8dbe : SUCCESS in 20m 50s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/b3776f71b91e491c8b7e0041d69309c6 : SUCCESS in 15m 37s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/55db3c6c668d4448bb1dcea8f45a3f1d : POST_FAILURE in 13m 23s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/9ad7245f533e4cb097f96b505eaae07b : POST_FAILURE in 6m 06s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/563c9a4da62e4c8bb53f16d03bc0f10e : POST_FAILURE in 1h 14m 28s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/290ac7dc734f4b8ab84a547e7378cce8 : POST_FAILURE in 30m 41s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/9ef2683f40734dfd9fc4e5f46619928c : SUCCESS in 28m 59s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/fade7ef65d354a1ea31915d497f011e7 : SUCCESS in 4m 08s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/b560c5090c034235a454098b8c5f34fb : POST_FAILURE in 29m 13s","accounts_in_message":[],"_revision_number":22},{"id":"ae2cc5c2bb01ac0e06387bfefa56e15f6e4f4fe7","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-15 11:17:18.000000000","message":"Patch Set 22:\n\n(1 comment)","accounts_in_message":[],"_revision_number":22},{"id":"466ea40568d8456bc115ce53650bcdf3d2bb0732","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-15 12:27:48.000000000","message":"Patch Set 22:\n\n(1 comment)","accounts_in_message":[],"_revision_number":22},{"id":"f256c62f99f6c8f122cd0de540a11a1d823db58b","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-15 12:34:00.000000000","message":"Patch Set 22:\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/2c1ff83bf8c349feab9a3fecad3d0047\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/bb2cd53844c34526b3d29d5fe37f410b : SUCCESS in 1m 29s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/bd1d4792d4f14774884d0ceb1b806a7b : SUCCESS in 3m 17s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/756c878f17fd4e3fb0382c9df7176ab5 : SUCCESS in 4m 52s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/d0210d388bce4e19a7c6cf04f5e4ad7e : SUCCESS in 4m 07s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/3a5cbdcd83f442d7b26e646115c02ca8 : SUCCESS in 2m 17s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/544bc5819b6c420e9f0b8f8868ef5ebb : SUCCESS in 2m 31s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/836abe1c8f664978a07d98cfe0e0594b : SUCCESS in 3m 43s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/1f1e580a7e3c42f3975282031d59d69c : POST_FAILURE in 5m 58s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/34ba74d9faca402ead877230b36fa9dd : POST_FAILURE in 3m 17s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/f5a30b33a45b4ebeb67cca9957ed3086 : SUCCESS in 16m 10s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/82388e0f8adf4b81ba80e799733893e3 : SUCCESS in 15m 55s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/93f2ab73c2174da18806657e56c8937a : POST_FAILURE in 13m 31s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/cd3452a44f194877a53b839b50f0f7d9 : SUCCESS in 5m 16s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/d7969f189dfa457f8cb30850194b2cc4 : POST_FAILURE in 18m 28s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/01db84885047443ca2df2c156520657b : SUCCESS in 21m 24s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/6c4c48eef9024de3ade1ed322b127625 : SUCCESS in 13m 44s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/e02d78d7447c489087a386c158bdc9b0 : SUCCESS in 14m 08s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/fb660495cf544275b761da8bbfe8de68 : SUCCESS in 5m 58s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/b440430895e44dc88e11cad1c604347b : POST_FAILURE in 1h 14m 55s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/73499530816149c1860e904a56dc6e75 : SUCCESS in 22m 10s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/25fbf8de9dc442d8a260429e4c21e856 : SUCCESS in 31m 16s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/990d2426f4b84e5ca1280f51b856f9ee : SUCCESS in 4m 13s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/a71cdd0a843f409cbe7fbd92e529e96d : POST_FAILURE in 13m 21s","accounts_in_message":[],"_revision_number":22},{"id":"769746e9e3655d49b8b578a0846454a6b35deeab","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-16 14:51:20.000000000","message":"Uploaded patch set 23.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":23},{"id":"5454985bc4344a8ef6faaf835c16d4650cfcb5b4","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-16 16:48:02.000000000","message":"Patch Set 23: Verified-1\n\n(1 comment)\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/8e772dbfe5da4cd79f915e470ab45750\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/c479aa65bdd945a18d57f124eb71af73 : SUCCESS in 2m 54s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/5a771797fbd2489db2477dc2e5e106a3 : SUCCESS in 4m 49s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/8c1d840d92864f00a144d17848be4b7f : SUCCESS in 4m 22s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/a4d873e363244761aced3d82ce9a0f86 : SUCCESS in 5m 59s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/086809a6af344beca005794ca527b7fb : SUCCESS in 3m 28s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/27c87267ee8443529d6f9b8a5e01105a : SUCCESS in 4m 59s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/fa1b9ab82b6b4f3d82f7e0c77cb9d2d9 : SUCCESS in 16m 53s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/a957caddd1e74a64b2077b09275862f7 : SUCCESS in 6m 04s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/93e9f33be91d46e1b24e5affa676bcf3 : FAILURE in 4m 21s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/d042e5496d5846d99be4212a95667b2c : SUCCESS in 18m 07s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/101e4375c080493fb059fa621028c2b7 : SUCCESS in 9m 16s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/9fdbd3d9e7684824b5d1809411625878 : SUCCESS in 18m 20s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/afe1fd62031a46b08b0500935e1c0870 : FAILURE in 3m 10s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/abfc89b8069e4fd3b1665b22662f969d : FAILURE in 3m 03s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/dd24f10e5b27469ba307026ea6e386f9 : SUCCESS in 24m 04s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/7146e634e0744ffabecd0351b959f9d5 : SUCCESS in 15m 10s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/ce12a08b715940c9a500f82daec0a8f8 : SUCCESS in 13m 59s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/5424c01545504ac2b0583014140bcabf : SUCCESS in 6m 52s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/83cf4c6452da449d83b4bd3cf3c05f4b : SUCCESS in 1h 27m 52s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/9d7d999498164fbeb40fd843f7d151aa : SUCCESS in 16m 07s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/819309e5959040fea9f757d9c4d24c64 : SUCCESS in 34m 23s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/1bd3257876f04524b0c050d86b5aaa0e : SUCCESS in 4m 51s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/acdcd9c4dee74d46a28c57fbdf24d2f0 : SUCCESS in 36m 13s","accounts_in_message":[],"_revision_number":23},{"id":"17891802053b1f1eb73014ce68f52a3be764a56c","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-17 11:47:11.000000000","message":"Uploaded patch set 24.\n\nOutdated Votes:\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":24},{"id":"f6aa1aca8bc0f6e4c04dd1b62b39480dc79effd3","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-17 13:19:31.000000000","message":"Patch Set 24: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/e5ebd2c235f54fafa977b05b0de49f6a\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/d1ffcc0163c74ccd87f4c750165d4e5a : SUCCESS in 2m 23s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/ff371a18eb2444619ff5454d04baeaae : SUCCESS in 2m 29s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/410cc4ea0eaf407e829be609c558b50f : SUCCESS in 3m 42s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/cffe144843604ee6af19502e6809690e : SUCCESS in 5m 22s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/3aa1622138684bb887d34885c4559b13 : SUCCESS in 3m 15s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/4c5f95d808134b08b9c1e921f64b2922 : SUCCESS in 2m 57s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/5c8afb17d39b4513ab6e9bfe07fe84bd : SUCCESS in 6m 05s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/815819cdea3a438583c87d4befc20530 : SUCCESS in 4m 37s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/6906c0e1e5f849bfa1988d675a4f2819 : SUCCESS in 5m 43s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/0a3a6ba0f52b4344ae7cdce244154e05 : SUCCESS in 12m 43s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/a31f46f2246d4d9b9bb495712a6657ca : SUCCESS in 7m 27s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/ffce954ed10341758564991d26930df1 : SUCCESS in 17m 11s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/b594c3a103ec4e51a8ef44a0e4f2e451 : SUCCESS in 5m 07s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/282edde63d4b49208ad60c11102edf6e : SUCCESS in 8m 01s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/e1ed2ac69e6e446394a54149cab8b66a : SUCCESS in 22m 04s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/dc7a96a666fe4a129245fecd02844657 : SUCCESS in 8m 19s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/baf2fffc88ae46d7972cca71919662c6 : SUCCESS in 13m 50s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/71487b743706441ea5b9bc8c5582331b : SUCCESS in 5m 59s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/63a0b6a416bf48939a7ddb43a495a223 : SUCCESS in 1h 31m 24s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/bdc3a79537e949608630d27bd169e170 : SUCCESS in 35m 52s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/90ed16d406bd451688cbd4f5517e6805 : SUCCESS in 34m 22s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/de85996ab76648e58e31a0311a54a56a : SUCCESS in 3m 59s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/2e0518c5dfe24faf8fadc3f018e2aae4 : SUCCESS in 30m 21s","accounts_in_message":[],"_revision_number":24},{"id":"ffad3640a8da131d85fa23bc45fe577d995f4822","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-17 15:42:13.000000000","message":"Uploaded patch set 25.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":25},{"id":"48fef423b8cac1845a3f9e02c43b80c0680ff909","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-17 17:15:16.000000000","message":"Patch Set 25: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/ab6ed1f4481b4256880bce38e0d4d5a1\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/3cdc40be1be646dd8e679c709b725dac : SUCCESS in 2m 20s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/e31d817eced64f5fad94c1989fb79572 : SUCCESS in 3m 24s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/b954f698bbc948e3a2150e9e3b708d84 : SUCCESS in 3m 35s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/467615c205004f4a9226965051b46450 : SUCCESS in 5m 01s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/f6875aa85d604296b9670dc0d68c7f0d : SUCCESS in 3m 51s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/050bc237b66c415ca3d72a4b318a4d6d : SUCCESS in 3m 37s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/3319009ebb374db382789c6f715b8e8b : SUCCESS in 5m 41s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/625a984e2d66430782f65fc2f8952f93 : SUCCESS in 4m 23s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/932042fdd3c6417cab8aaf63d05d6610 : SUCCESS in 7m 00s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/c8398e2df458487c8d7f3a87ab3a5997 : SUCCESS in 17m 04s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/6ac6883c956f4c4888283686c12ce07e : SUCCESS in 15m 17s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/5fc1797e3a52450997ea32bcbd5b8274 : SUCCESS in 18m 00s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/0755e4b5f3794b4da03ee3d3b6b1754e : SUCCESS in 5m 45s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/d5bec3da98e54e56b2d9350a1e085487 : SUCCESS in 14m 24s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/03a27ad2bbdc46e7b97cbaa02d76f2ac : SUCCESS in 16m 58s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/667094316a514443b060fccb53490d4f : SUCCESS in 15m 10s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/080aaec06e03437ea95a271d17049f99 : SUCCESS in 13m 51s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/47dcf5a6728248049a8252b85cdb0720 : SUCCESS in 5m 29s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/f57e89cba9ad461c83f18a3320402e5b : SUCCESS in 1h 28m 50s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/be415f863d96434b9d342f3149e0a432 : SUCCESS in 34m 31s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/fd646981dbb64a13a6f22b9be22e0f4e : SUCCESS in 28m 58s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/0f8b1b1a026f447fbd504bbfc4bb9033 : SUCCESS in 5m 47s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/6ab0554fe8aa4b9ebaa250b022d0e25f : SUCCESS in 32m 41s","accounts_in_message":[],"_revision_number":25},{"id":"890296936024948980ca5dce07958f79c82d42cf","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-18 18:51:29.000000000","message":"Patch Set 25:\n\n(1 comment)","accounts_in_message":[],"_revision_number":25},{"id":"7c0a5d47c8a516fba97c350dccc793dc60b3b5c7","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-06-18 19:00:08.000000000","message":"Patch Set 25:\n\n(1 comment)","accounts_in_message":[],"_revision_number":25},{"id":"173bf4ea64670c20f3cba8b1d3bc10c474a5fbe1","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-18 22:21:13.000000000","message":"Patch Set 25:\n\n(1 comment)","accounts_in_message":[],"_revision_number":25},{"id":"62fd9b633197c898be6cf6607e4c6e2a2008a766","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-18 22:24:55.000000000","message":"Patch Set 25:\n\n(1 comment)","accounts_in_message":[],"_revision_number":25},{"id":"8e3df954dfd3a584a837fe837a35f90d187e4a26","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-18 22:31:04.000000000","message":"Patch Set 25:\n\n(2 comments)","accounts_in_message":[],"_revision_number":25},{"id":"fbe4ac23d549311a0b5206c7801d230ae5afacdc","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 08:15:16.000000000","message":"Patch Set 25:\n\n(4 comments)","accounts_in_message":[],"_revision_number":25},{"id":"59ef26a755d15ee5d8f2f96e9bce9a0ab31e0833","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 08:21:28.000000000","message":"Uploaded patch set 26.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":26},{"id":"601712b92361e487f57293b493f64271b1a4d5b0","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 08:32:53.000000000","message":"Patch Set 26:\n\n(4 comments)","accounts_in_message":[],"_revision_number":26},{"id":"b8bbc6beebb785ce845f2bd50904a1e148e705da","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 08:33:34.000000000","message":"Patch Set 26:\n\n(2 comments)","accounts_in_message":[],"_revision_number":26},{"id":"863d52b986a69ad2f295c4a5d7ea02f9967b829d","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 08:35:54.000000000","message":"Patch Set 26:\n\n(1 comment)","accounts_in_message":[],"_revision_number":26},{"id":"c6d5366ea78743c92c4cec1e3389470a38651c5a","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-22 09:53:29.000000000","message":"Patch Set 26: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/4e8816ada3294e228209f43dec333da5\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/f0979bb2a704404cae29a88a8aa85e4b : SUCCESS in 3m 42s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/0e1eb8ce6b4846b69a38182a15a843c8 : SUCCESS in 3m 21s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/cac3eee464644d2d8d7ef7e4ce837121 : SUCCESS in 6m 17s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/99f911be4f614652b4e2befcd4ce1b7e : SUCCESS in 4m 48s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/65b292c5a83f4a45a00b865948ad84ab : SUCCESS in 3m 29s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/fee209239dd940f489308b5d81384f0c : SUCCESS in 2m 52s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/78d8877809314046a098b3162244d13c : SUCCESS in 9m 04s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/3689381426e448459576080e3b922093 : SUCCESS in 2m 42s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/d7e315d241254467a24e49f17e72de84 : SUCCESS in 5m 25s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/2dd6ffabe5b642918a5ba2c054a573b5 : SUCCESS in 7m 36s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/ed742efcd3a4431e8d71c0958e273756 : SUCCESS in 17m 24s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/2cae6b9f7c5c44c897813f754777419b : SUCCESS in 7m 36s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/c6a271e1c0c647d1a42df82f9645881e : SUCCESS in 4m 40s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/c70f2796391046bcac1d22fbd5a5a8c3 : SUCCESS in 8m 43s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/f2d4bcd643f54751941c8891edf01ccf : SUCCESS in 21m 44s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/5cf55347dce84dfca3d57de2f5f9d10f : SUCCESS in 15m 27s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/53b7b7a9a59d44a0bbcb009740cd5b31 : SUCCESS in 15m 49s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/173df9e0c7b04fd2ac845cb559646d02 : SUCCESS in 8m 32s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/3abe70cbd5d241d3a312165a572759bc : SUCCESS in 1h 25m 58s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/581869183f0a41aa8e740b1b332e5641 : SUCCESS in 13m 53s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/0306321737754a789ab32749135fb1a5 : SUCCESS in 20m 06s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/ceefdc86942c4b119fff792328a9b8a8 : SUCCESS in 2m 23s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/55c035b0c1b945a089dac5a0c7bd27cc : SUCCESS in 29m 42s","accounts_in_message":[],"_revision_number":26},{"id":"1f47c23d20698408ccadcfcaed3fd890997051c8","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-22 13:18:07.000000000","message":"Patch Set 26:\n\n(1 comment)","accounts_in_message":[],"_revision_number":26},{"id":"6258c18a3c4bf0b7b9c3b350d25fb85d8a30d6fa","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-22 13:23:57.000000000","message":"Patch Set 26:\n\n(1 comment)","accounts_in_message":[],"_revision_number":26},{"id":"650a988e3d086796d61913feccde7607b11bcee1","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 13:48:10.000000000","message":"Patch Set 26:\n\n(1 comment)","accounts_in_message":[],"_revision_number":26},{"id":"33fcdded199c2a76a8be52c42f3f105e61280d21","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-22 13:52:18.000000000","message":"Patch Set 26:\n\n(1 comment)","accounts_in_message":[],"_revision_number":26},{"id":"a674edb224883b8a1f2d14f5e31782df19a1fa0d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-22 14:02:18.000000000","message":"Uploaded patch set 27.\n\nOutdated Votes:\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":27},{"id":"ff4babfc1334af2de304208db2efc6b38c9cf1b5","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-22 15:34:13.000000000","message":"Patch Set 27: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/bc637ce814ec4d9988c75f16b58a8f73\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/9556837ad6a84237b7ee16c938645c06 : SUCCESS in 2m 32s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/8f282dbf9c8d4a8285ea7e3cc6c6fc93 : SUCCESS in 3m 10s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/8ab9a897a41f4cab8a6c5116e2092b5a : SUCCESS in 3m 21s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/47343857b7314f18a544f879e0d2cea0 : SUCCESS in 5m 49s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/60c8c7350bf949d38670960ab2ef295c : SUCCESS in 4m 40s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/250d1ddbda414e669756673e9fa42ab8 : SUCCESS in 3m 01s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/78ab884160274dbba22bc22f51cc0a1a : SUCCESS in 7m 34s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/7c516ff75f7b4b518dd61c4a47d53a21 : SUCCESS in 2m 29s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/db8beb5d3f144cbcbd99ff470eee4f98 : SUCCESS in 7m 38s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/d098c8608fd847d09d373445b610e341 : SUCCESS in 16m 56s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/6bb9d2a61ec346d5953e4fefff4ba174 : SUCCESS in 7m 27s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/40a0cb91c5654cf4b1b40a7b3b8d5489 : SUCCESS in 7m 52s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/5f0be3beca6e4560b2a5a7a55f9b9792 : SUCCESS in 2m 52s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/72858ad70f8f4e94abbe16211e4af7f1 : SUCCESS in 8m 08s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/6a8825dd1ec449cdb7fd313f08b629c2 : SUCCESS in 17m 11s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/8f026526360246bd84c98ca894e84943 : SUCCESS in 15m 27s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/8973a79b3d3d4608bd18b173bdc8a49a : SUCCESS in 11m 28s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/6bc6b88b2b9c4a2f8e8bd17524448a9c : SUCCESS in 6m 53s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/ff571426793e4f86b5ea1bb66045de0c : SUCCESS in 1h 25m 17s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/acfd44d6e8e24b9386161802853b3536 : SUCCESS in 35m 59s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/01eca2a9fe304c60a2a8d24e93f1560e : SUCCESS in 30m 45s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/89b5067c22954fc49db44b64ae195afc : SUCCESS in 5m 14s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/1e8c679e3ede4173b062eea7ef1d8cb0 : SUCCESS in 13m 44s","accounts_in_message":[],"_revision_number":27},{"id":"33200ee32c3f82a12697ccfedba26c84633cf1f3","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-23 12:14:47.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"319b09bf358235e687e0d4aca5591f461c2c0d2a","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-23 13:01:28.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"0cf23bf8aa2a7487b4d5cb9d93d2de8dce1a14f2","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-06-24 08:51:47.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"6d6e82f340453f1cde210adaf68871b8347a7c58","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-06-24 09:11:22.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"e3c54ff358f598d9e4ed6acbb528d9eedadf45b1","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-06-24 09:42:58.000000000","message":"Patch Set 27: Code-Review-1\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"c37f2decdf4f8b1af8c1a53a20d5c654c84c8991","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-24 11:46:28.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"65bb145fa9d272bfad464e655af282693c26cdb1","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-24 12:17:25.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"3b88b8759ca15aad3d29a312e4942953956e08de","tag":"autogenerated:gerrit:abandon","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-24 12:18:40.000000000","message":"Abandoned","accounts_in_message":[],"_revision_number":27},{"id":"c90a41ccad41ff20bbd88a6676c8c2ae5905e3b8","tag":"autogenerated:gerrit:restore","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-24 12:19:05.000000000","message":"Restored","accounts_in_message":[],"_revision_number":27},{"id":"8af7770f77072c7cbfffaf487b75f1a36cb4f988","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-06-24 12:19:47.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"f60b9e0cd9102b80633f61b5818043acd2083456","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-06-24 12:47:50.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"2aaef90295c625e9bb2891ce8ea0b8955b1fa1ea","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-06-24 13:59:09.000000000","message":"Patch Set 27:\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/857cb66467944d32868425c3fe40ced1\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/f2a89bf3df3c4dba8d06e1c1fc32bcd6 : SUCCESS in 1m 58s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/4a593f9eae9b4248aa92de05a0b7ddf2 : SUCCESS in 3m 54s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/a10d5ab6452a4653b08986b362dca08c : SUCCESS in 3m 03s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/fc6dcdcad1d04e7ea781d09af0661b43 : SUCCESS in 5m 16s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/da391a6c799a4b88b90440b3e3f27ecb : SUCCESS in 3m 45s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/e96d9e6eb6c24a108b1d341726efda4b : SUCCESS in 2m 19s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/8aa80ea17c3945d08a1bbcba78f371e1 : SUCCESS in 7m 24s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/9996959483334ce5b50e18c8c4f2ee8b : SUCCESS in 7m 01s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/6dcfbbfb59ad428cb0b8e1f6e33a0e2d : SUCCESS in 6m 19s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/c8a3947be15f43a2a724f79bc2ff4aed : SUCCESS in 9m 15s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/58f18be499894692890a87a429c26d0b : SUCCESS in 14m 47s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/a288a1dfb777447781f0ce1d0a497ffc : SUCCESS in 17m 45s\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/6d029be1f8034781b562c85e4c20960f : SUCCESS in 2m 55s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/ada5db692fe74c0ca75ce2881a3cb12c : SUCCESS in 16m 25s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/c02c398845aa409198bf5be4a1237e8b : SUCCESS in 22m 10s (non-voting)\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/7324946999d5469ca336d34989e16273 : SUCCESS in 7m 58s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/2c0f8d2d2ffb4a7db80ea81fd9486979 : SUCCESS in 11m 03s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/8d2d9f4b8d5a4df3a8bcb20045011c59 : SUCCESS in 4m 20s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/f3c2787a94834cb1977afa41e90d63be : SUCCESS in 1h 30m 53s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/d08f454f65a748a895fc19acde4411ec : SUCCESS in 35m 03s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/75808df7ca824cd781ef22310a137d07 : SUCCESS in 33m 32s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/5ee354c344cf49918b1d2ec4978507cb : SUCCESS in 4m 04s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/19bfe1a499754be18850e485d4b03865 : SUCCESS in 31m 17s","accounts_in_message":[],"_revision_number":27},{"id":"4145f0f809b45a7bd3614d92bb9452e6e1f9c237","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-07-14 09:13:46.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"3029faddc6b42999780e0e8ec43959709de71011","author":{"_account_id":32432,"name":"Owen McGonagle","email":"omcgonag@redhat.com","username":"omcgonag"},"date":"2026-07-14 19:35:04.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"9f60de644785ed5c35f83a1ae24b08b197c7fa21","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-08-29 16:18:37.000000000","message":"Patch Set 27:\n\nI reproduced the inconsistency Jan reported by evaluating the template\nconditions of mfa/_index.html directly, and it looks fixable in horizon\nindependently of the keystone lockout.\n\nThe message block has three branches and the footer button has two, but they\nare driven by different variables: the message uses setup_complete, then\n\"not mfa_enabled and has_totp_credential\", while the button uses mfa_enabled\nalone. Over the four states, with the password/totp rule always present:\n\n  mfa_enabled  credential | message              | button\n  True         True       | MFA is enabled       | Disable MFA\n  True         False      | MFA is not enabled   | Disable MFA   \u003c- inconsistent\n  False        True       | MFA setup incomplete | Enable MFA\n  False        False      | MFA is not enabled   | Enable MFA\n\nThe second row is the one Jan describes. There is no branch for\n\"mfa_enabled and not has_totp_credential\", so it falls through to the else.\n\nThat state is also the dangerous one. Keystone still requires a TOTP passcode\nat login while the credential is gone, so the user is locked out on their next\nlogin, and the panel tells them \"MFA is not enabled\", which is the most\nreassuring wording available.\n\nA fourth branch would cover it, for instance:\n\n  {% elif mfa_enabled and not has_totp_credential %}\n    \u003cdiv class\u003d\"alert alert-danger\"\u003e\n      \u003cstrong\u003e{% trans \"MFA credential missing\" %}\u003c/strong\u003e\n      \u003cp\u003e\n        {% trans \"MFA is still enforced on your account but no TOTP credential remains. Create a new one, or disable MFA, before logging out.\" %}\n      \u003c/p\u003e\n    \u003c/div\u003e\n\nThat keeps the warning accurate even once the keystone side is fixed, since a\nuser can still delete their last credential from the User Credentials panel.\n\nUnrelated nit: has_valid_rule is placed in the context in views.py but no\ntemplate reads it. It is only used to compute setup_complete.\n\nNot voting, Jan\u0027s -1 already covers this.","accounts_in_message":[],"_revision_number":27},{"id":"5cf02aa6200a9e04590588f0830389c6dc0b42cb","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-08-29 16:50:26.000000000","message":"Patch Set 27:\n\nFollow-up to my previous comment: I have the change ready locally if that saves\nyou time, on top of patch set 27. Happy to push it as a new patch set, or to\nleave it to you, whichever you prefer. It is three small edits plus tests:\n\n- the fourth branch in mfa/_index.html for\n  \"mfa_enabled and not has_totp_credential\", so the lockout state stops being\n  reported as \"MFA is not enabled\"\n\n- DisableMFAForm.handle() now clears the MFA options before deleting the\n  credentials rather than after. This matters for your keystone change\n  https://review.opendev.org/c/openstack/keystone/+/985969 : with that guard in\n  place, credential_delete() raises Forbidden while the rules still contain\n  totp, the whole handler falls into its except branch, and disabling MFA\n  through the \"delete\" path stops working entirely. Clearing the options first\n  keeps both changes compatible in either merge order. I left the rationale as\n  a comment in the code.\n\n- context[\"has_valid_rule\"] dropped, no template reads it\n\n- two tests: test_index_credential_missing, and an ordering assertion in\n  test_disable_mfa_delete_credentials. I checked that both fail on patch set 27\n  and pass with the change, so they actually guard the behaviour.\n\nThe 14 tests of the panel pass and pep8 is clean. Just say the word.","accounts_in_message":[],"_revision_number":27},{"id":"e1e81c2a188595dd5e62c96d8b7d0724e8dd49f8","author":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"date":"2026-08-31 12:26:41.000000000","message":"Patch Set 27:\n\n(1 comment)","accounts_in_message":[],"_revision_number":27},{"id":"eecebd11021f20b473c423d9b3d7b38190ded1f1","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-08-31 18:51:19.000000000","message":"Uploaded patch set 28.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":28},{"id":"49ef23d9071a7b0b157de5e24098a4f67abd25f8","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-08-31 18:51:50.000000000","message":"Patch Set 28:\n\nPatch set 28, pushed with your agreement. You are still the author, I am only\nthe uploader, and it is one commit away from patch set 27 so the diff between\nthe two shows exactly what I touched.\n\nFour things:\n\n- mfa/_index.html gains a fourth branch for \"mfa_enabled and not\n  has_totp_credential\". That state used to fall through to the else and report\n  \"MFA is not enabled\" next to a red \"Disable MFA\" button, which is what Jan\n  described. It now says the credential is missing, in an alert-danger, since\n  that is the state where the account is about to be locked out.\n\n- DisableMFAForm.handle() clears the MFA options before deleting the\n  credentials rather than after, so the account is never left with rules\n  asking for a passcode it has no credential for. Note this is no longer\n  about your keystone change: patch set 9 there drops the deletion guard, so\n  the reason is now purely horizon side and the code comment says so.\n\n- context[\"has_valid_rule\"] removed, no template reads it.\n\n- Two tests: test_index_credential_missing, and an ordering assertion in\n  test_disable_mfa_delete_credentials. Both fail on patch set 27 and pass\n  here, so they guard the behaviour rather than just describe it.\n\nI also had to rebase onto master, which had moved since February. Two\nconflicts, both purely additive in openstack_dashboard/defaults.py and\nlocal_settings.py.example, where SHOW_RESOURCE_PROVIDER_SUMMARY landed next to\nyour OPENSTACK_TOTP_QRCODE_ISSUER. I kept both sides. Nothing else in your\nchange was touched by the rebase.\n\nThe 14 tests of the panel pass and pep8 is clean. Revert anything you disagree\nwith, it is your change.","accounts_in_message":[],"_revision_number":28},{"id":"2dfb38db0afc2df01ba1c5348ccb0da75546b341","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-08-31 20:18:15.000000000","message":"Patch Set 28: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/6b0bcb8a3c3d41d4b3bdb7b617b41eb9\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/9a7023ceece44e85a9a5e9c5a8619790 : SUCCESS in 2m 18s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/359337c682df45ae883e682fba61b302 : SUCCESS in 2m 02s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/713f46a2536942b68613ee50202123d5 : SUCCESS in 3m 33s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/ffd619bee3ea4971bfb855971990f033 : SUCCESS in 5m 08s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/7679ec1dd6fe4f8c8f6a6af0ca9899c6 : SUCCESS in 3m 32s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/144b583208714d23ba877c169016cc19 : SUCCESS in 2m 44s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/95565cb8c3e748a09c1ab04ecffb1709 : SUCCESS in 5m 13s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/be34ec4c6f7f49a68aee60f59fd060c4 : SUCCESS in 3m 19s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/7880533b609748a5b9fa416bc4cb382a : SUCCESS in 3m 29s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/3f046751c638496f908931984a8f6011 : SUCCESS in 8m 07s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/64df5d32ae2142bb99a5574e7f6bdb43 : SUCCESS in 7m 52s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/40f6185a9aae4999a8a29cfec54856ed : SUCCESS in 9m 55s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/228bcff8b3d24750b247a08f00a83c2f : SUCCESS in 16m 45s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/4df8d336d6d64dc4b570251bd999075e : SUCCESS in 4m 47s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/28428883c9d24cd9ad08918a09d44971 : SUCCESS in 8m 33s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/d82a449f046745d4b7198cebdb77d59d : SUCCESS in 22m 55s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/10e64f83e8f0448b9c70b76857be72e0 : SUCCESS in 15m 20s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/3101c38ae4cb4d67b0ae2237daef85ad : SUCCESS in 11m 57s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/e6c8cf90b83f4a2f90868eb47a5d69a4 : SUCCESS in 4m 58s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/14cd5b34f6bb4f59a99452a77820dd42 : SUCCESS in 1h 21m 17s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/3886d26a347d4e41bb4cdeccc0d5dc79 : SUCCESS in 34m 30s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/3e33971480734109bcad5837e3451cd5 : SUCCESS in 34m 30s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/7460d03040b248b8843977b4ae798062 : SUCCESS in 3m 20s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/88a04f0cdd8f49c4bbc295a36154870b : SUCCESS in 31m 31s","accounts_in_message":[],"_revision_number":28},{"id":"24a8a5788932935b6981a0a34370e461ea5bffdd","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-03 20:09:33.000000000","message":"Patch Set 28:\n\nOne process thing that I think is costing you reviewers.\n\nThe change currently shows 48 unresolved comment threads. Reading through\nthem, most are conversations you already answered and acted on, they were just\nnever marked resolved. Gerrit keeps a thread open until someone clicks the\nbox, so on a change with 28 patch sets spread over six months they pile up.\n\nThe trouble is what that looks like from outside. A core opening this sees\n\"48 unresolved\" and reasonably assumes there is a queue of outstanding work,\nwhich is a discouraging first impression for a change whose CI is green.\n\nI checked the most substantive requests against the patch set 28 code, and\nthey are all done:\n\n- api/keystone.py, Radomir asked that user_update_own_options not duplicate\n  user_update_options. It now delegates to it.\n- settings/mfa/panel.py, Radomir asked whether this should be policy based\n  rather than a separate setting. allowed() now runs policy.check() over the\n  six identity rules, with the setting only gating registration.\n- the release note, Radomir asked that the new settings be mentioned. Both\n  OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED and OPENSTACK_TOTP_QRCODE_ISSUER are\n  described there now.\n- openstack_auth/urls.py, Ivan asked you to drop it from the diff since it was\n  fixed elsewhere. It is no longer touched.\n- settings.rst, Ivan flagged the versionadded values and the RST underline\n  lengths. The new setting reads 2026.2(Hibiscus) and the underlines match\n  their titles.\n\nOnly you or the thread authors can mark those resolved. Going through them\nwould make the change read as what it is, which is close to ready rather than\nhalf finished.\n\nSeparately, Jan is in the attention set on patch set 28 because his -1 was\ndropped by the upload. The state he described, \"MFA is not enabled\" shown next\nto a red Disable MFA button, is the one the new template branch covers, so it\nshould be quick for him to re-check.","accounts_in_message":[],"_revision_number":28},{"id":"edcec03c773462f16005ce0edc22ff19802a48c2","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-04 10:37:58.000000000","message":"Patch Set 28:\n\n@jjasek, this is a nudge rather than anything new: your -1 was dropped\nmechanically when I uploaded patch set 28 with Benjamin\u0027s agreement, and the\npatch set exists to answer exactly what you reported.\n\nYou wrote on views.py line 230:\n\n    When I enable MFA, then there is saved TOTP in User Credentials.\n    Then in MFA I can see: \"MFA is not enabled ...\" But the button there is\n    still red and shows \"Disable MFA\". It does not make much sense.\n\nIt did not, and the cause was that the message and the button read different\nvariables. mfa/_index.html picked the message from setup_complete and then\nfrom \"not mfa_enabled and has_totp_credential\", while the footer picked the\nbutton from mfa_enabled alone. Evaluating the four states:\n\n  mfa_enabled  credential | message              | button\n  True         True       | MFA is enabled       | Disable MFA\n  True         False      | MFA is not enabled   | Disable MFA   \u003c- your case\n  False        True       | MFA setup incomplete | Enable MFA\n  False        False      | MFA is not enabled   | Enable MFA\n\nThere was no branch for \"enabled but no credential left\", so it fell through\nto the else. Patch set 28 adds one, and that state now reads \"MFA credential\nmissing\" in an alert-danger, since it is the state where the account is about\nto lock itself out rather than a benign one.\n\nThere is a regression test for it, test_index_credential_missing, which fails\non patch set 27 and passes here.\n\nTwo other things changed in the same patch set, described in my earlier\ncomment: DisableMFAForm.handle() clears the MFA options before deleting the\ncredentials, and the unused has_valid_rule context entry is gone.","accounts_in_message":[],"_revision_number":28},{"id":"7ea8cf25f7dd60958c408367032b245322ff23a3","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-09-07 13:29:47.000000000","message":"Patch Set 28: Code-Review-1\n\n(1 comment)","accounts_in_message":[],"_revision_number":28},{"id":"c15f3e65f828f976911ea2f6aaff3dee4a7ae3f4","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-07 15:16:48.000000000","message":"Uploaded patch set 29.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":29},{"id":"c4bf5ee8a2f8d6360299f0f0d7896d0c7a946ab1","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-07 15:17:07.000000000","message":"Patch Set 29:\n\n@jjasek, patch set 29 answers your -1. Your hypothesis was right: the\npanel had to pass a richer target. Here is the exact mechanism, because it\nis narrower than it looks.\n\noslo.policy resolves the right hand side of an owner clause with a plain\ndict format, GenericCheck.__call__ does \"match \u003d self.match % target\", so\n%(target.credential.user_id)s needs the flat key\n\"target.credential.user_id\" in the target and a missing key makes the\ncheck return False rather than raise.\n\nMFAPanel.allowed() passed target \u003d {\"user_id\": request.user.id}. Of the\nsix documented rules, only two of them were satisfied:\n\n  identity:get_user, identity:update_user   -\u003e passed already\n  the four identity:*_credential rules      -\u003e always False\n\nThe two user rules worked because openstack_auth.policy.check() already\nfills in target.user.id, or user.id when keystone is not enforcing the new\ndefaults (openstack_auth/policy.py:240-243). That helper populates the\nproject, user, owner, tenant and domain attributes, but it knows nothing\nabout credentials, so nothing ever set the credential owner. And since\npolicy.check() is an AND over the six rules, four permanent False values\nhid the panel from every non-admin user. That is exactly what you saw with\nmfa-test, and no policy.d or keystone_policy.yaml override could have\nfixed it, which is why mirroring the rules did not help.\n\nPatch set 29 adds both spellings to the target, credential.user_id and\ntarget.credential.user_id, since which one applies depends on the\nenforce_new_defaults setting.\n\nTwo tests cover it, both failing without the panel change. The second one\nparses the six owner clauses exactly as the commit message documents them\nand asserts a member user satisfies all of them against the target the\npanel builds. Full openstack_dashboard suite: 1566 passed.\n\nOne nuance worth knowing for your own testing: the documented example\nspells the user rules %(target.user.id)s, which only matches when keystone\nenforces the new RBAC defaults. Under the deprecated defaults\nopenstack_auth sets user.id instead, so the override would need that\nspelling.\n\nBenjamin is kept as the author, I only uploaded the fix.","accounts_in_message":[],"_revision_number":29},{"id":"e5a737f847b7af906effbb3ed8c4e11936495f84","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-09-07 16:46:13.000000000","message":"Patch Set 29: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/7544506954804daa80e5616d413f3b70\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/f4dc3ae5c7744e86823d33d491303744 : SUCCESS in 1m 40s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/65ac988d68aa4bf3a49444a89d37d166 : SUCCESS in 2m 12s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/ff201596fd1c46b381e83e22555ae115 : SUCCESS in 3m 23s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/e81f7b8475334a6183b88120fd3771e2 : SUCCESS in 7m 11s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/797c3032ec3e414f8d83f4ad345d3b25 : SUCCESS in 4m 40s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/e18562547b9d4472b3dd2e5defc9d7bd : SUCCESS in 3m 10s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/75ea4918b967498c9f52553efd28e081 : SUCCESS in 8m 22s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/d68f50c3c6af4a9cbfafab57a91a66df : SUCCESS in 4m 29s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/d7ca7da2f40b4580ab0dadf158aec545 : SUCCESS in 5m 57s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/3073f5a6d8c94b95b5b7bda26c3efb17 : SUCCESS in 13m 28s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/b049432596b1436b857e8e7c7a96d735 : SUCCESS in 16m 21s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/dc52a36e4106463a9bf86aa8eaaf2884 : SUCCESS in 16m 42s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/dbdd5a3809324911815b9af6fe9d05a6 : SUCCESS in 9m 44s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/8a5825632beb40eda193bac95ea95a81 : SUCCESS in 4m 47s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/0eb9c45e065d4f49b978ab6c092d9b69 : SUCCESS in 8m 36s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/85664bfda15e4ef9a994064ee9e46c0f : SUCCESS in 12m 07s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/05274dd03c9b4d39ae985fe49d04e5d0 : SUCCESS in 16m 17s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/f88f5653c86e4445b949436c06605509 : SUCCESS in 16m 04s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/57274e371fc24e69a6c5522692f47992 : SUCCESS in 7m 58s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/1d278cd85fb3449a93a2d0488cda4206 : SUCCESS in 1h 23m 35s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/7954d49e4352433dba95cb4a59b22722 : SUCCESS in 17m 11s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/803cbad484fb42b38d96763ec365c6e4 : SUCCESS in 20m 39s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/9c1fcdfb618244328c8cdd2afa18beb8 : SUCCESS in 4m 19s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/95b4b584f80848efb2c0d505586ac79b : SUCCESS in 33m 13s","accounts_in_message":[],"_revision_number":29},{"id":"34700b1b247621b4be656e4f3153576aeaa87939","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-09-10 13:30:56.000000000","message":"Patch Set 29: Code-Review-1\n\n(1 comment)","accounts_in_message":[],"_revision_number":29},{"id":"2708f8044a67e431c9747682c1779c47ef28459d","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-10 16:27:43.000000000","message":"Uploaded patch set 30.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":30},{"id":"6b6394029df868d92786fb3954bd2a58dac396a0","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-10 16:28:01.000000000","message":"Patch Set 30:\n\n@jjasek, both of your points were right and both are fixed in patch set 30.\n\n1. The unauthorized on disable. This was a real code bug, not your setup.\napi.keystone.credential_delete forced the admin client:\n\n    def credential_delete(request, credential_id):\n        manager \u003d keystoneclient(request, admin\u003dTrue).credentials\n\nand keystoneclient() raises NotAuthorized inside Horizon, before keystone\nis ever contacted, when admin\u003dTrue and the request does not satisfy\nadmin_required (openstack_dashboard/api/keystone.py, the guard right\nafter the docstring). So no policy.d rule on the keystone side could\nhave helped.\n\nThat is exactly the sequence you saw. In DisableMFAForm.handle,\nuser_update_own_options succeeds so MFA turns off, credential_delete\nthen raises, and the except swallows it into \"Unable to disable MFA.\",\nleaving the credential behind. It also explains the asymmetry: enabling\nworks because credential_create uses the plain client. The same root\ncause is behind the missing delete action in User Credentials.\n\ncredential_delete now takes an admin argument, still defaulting to True\nso the identity credentials panel is untouched, and the disable form\npasses admin\u003dFalse. I audited the other five keystone calls this panel\nmakes: user_get and credential_get already pass admin\u003dFalse and\nuser_update_own_options routes through admin\u003dFalse, so this was the only\nremaining one.\n\n2. The documentation. You are right that it was scattered and\nincomplete. The configuration guide now documents all four requirements\nin one place, under OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED: the Horizon\nsetting, totp in the keystone [auth] methods option, the keystone policy\nrules, and the same rules mirrored in Horizon own copy of the keystone\npolicy file. That last one was the missing piece you hit, and it is worth\nstating plainly: Horizon decides panel visibility by evaluating its local\ncopy, not by asking keystone, so rules applied only keystone side leave\nthe panel invisible while the API calls behind it would have worked. The\nguide also notes that the user rules need %(user.id)s rather than\n%(target.user.id)s when keystone is not enforcing the new RBAC defaults.\nThe release note points at that section.\n\nVerification, since this went back and forth a few times: flake8 clean,\npylint 10.00/10 on the changed files with the project rcfile, doc8 zero\nerrors with the project config, sphinx-build -W clean on the new\ndocumentation, release note valid. Tests: 1568 openstack_dashboard, 207\nhorizon, 142 openstack_auth, all passing. The two tests covering the\ndelete path fail without the production change.","accounts_in_message":[],"_revision_number":30},{"id":"a575f43151f7eb00e801f78bd3c46b240508181a","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-09-10 17:45:31.000000000","message":"Patch Set 30: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/91dcb4b2fdc64236a8f664f51eb667b3\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/d3a6f58d57454ab08dbebcf3fa015215 : SUCCESS in 2m 47s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/3217472859bd499d899e7f3748728ea7 : SUCCESS in 2m 08s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/0e9cb9b31cbc4fe2919b62ffb733751e : SUCCESS in 2m 51s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/a83e0ad77b9f446e852494df2b60df66 : SUCCESS in 5m 30s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/ee4eb0f5507548cdb558d37dd783a340 : SUCCESS in 3m 59s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/d95f99ace71542bd9eb3eeee373b85a8 : SUCCESS in 5m 51s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/0873bf1f54ef470987fb5564c3ea825a : SUCCESS in 7m 32s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/4afe9a26fce949559b89e02bc7b77df5 : SUCCESS in 2m 34s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/c86a0e1a8a1c4e2181c2dbb56fc3f17b : SUCCESS in 6m 23s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/b9d0387d42904b8b8da3f820aaf05bf0 : SUCCESS in 18m 12s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/a91ceff1bb774623a531895b7213cc85 : SUCCESS in 17m 45s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/ed0a9d34f73448538669fea0a8e6222f : SUCCESS in 18m 54s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/9ccfd84d13db402d882c39eacdd7ed75 : SUCCESS in 19m 41s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/669beea5004c459f9a1cc54e028b7838 : SUCCESS in 5m 07s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/f386519963ac4cc6b42a54cd468f45f4 : SUCCESS in 8m 40s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/0913383bb4484f589e52a8d8205a8b36 : SUCCESS in 14m 36s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/eb351cb747e44586884fd76c92ffb6f9 : SUCCESS in 7m 56s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/a04a7ebacbdb44c1a4995d2954967164 : SUCCESS in 14m 24s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/03b0621dccfb4f02968e25ba6238130f : SUCCESS in 6m 35s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/794b3a1b97154f139c19c3d4628bd2be : FAILURE in 1h 03m 19s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/ed9e125e82404c689a0385ae6375c52c : SUCCESS in 30m 41s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/1c8d09a9f671465fa11bc2e941d343af : SUCCESS in 32m 10s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/2744bbc435bf4d44ab06678c4b6ae494 : SUCCESS in 4m 28s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/82d5ad033e81443fbe7efb4347ce2ddd : SUCCESS in 29m 38s","accounts_in_message":[],"_revision_number":30},{"id":"c185d34f656be62c1cf4c99b8fb3439a0abc41db","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-10 21:15:16.000000000","message":"Patch Set 30:\n\nThe Verified-1 on this patch set is not caused by this change. Do not\nrecheck, it will fail again.\n\nhorizon-integration-pytest failed on\ntest_user_credentials.py::test_edit_user_credential, which this change\ndoes not touch. Keystone merged d5826fcaf, \"credentials: reject\ndelegated tokens, restrict PATCH to blob only\", today at 15:10. It makes\ntype, user_id and project_id immutable: PATCH /v3/credentials/{id} now\naccepts blob alone, with additionalProperties false.\n\nThe horizon error log from the job says it plainly:\n\n  Invalid input for field/attribute credential.\n  Value: {\"user_id\": ..., \"type\": \"totp\", \"blob\": \"EDITED_...\"}\n  Additional properties are not allowed (\"type\", \"user_id\" were\n  unexpected) (HTTP 400)\n\napi.keystone.credential_update sends user, type, blob and project.\nKeystone now rejects three of the four.\n\nThe job SHAs confirm the timing. The periodic master run at 03:43 today\nran keystone 874bb7076 and passed this test. This job ran d65e64fa9,\nwhich contains the keystone change, and failed.\n\nThis is deterministic and horizon-integration-pytest is voting, so every\nHorizon change will fail on it from now on until Horizon stops sending\nthe immutable fields. I am filing a bug and proposing a fix separately;\nthis change should be rechecked once that lands.","accounts_in_message":[],"_revision_number":30},{"id":"dab50070ace9404f220f2c5b1160e6107e0f5f9a","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-10 21:26:18.000000000","message":"Patch Set 30:\n\nFollow-up: the fix is now up as\nhttps://review.opendev.org/c/openstack/horizon/+/1005130, tracked by\nbug 2167033. Once it lands, this change can be rechecked.","accounts_in_message":[],"_revision_number":30},{"id":"fbc626bfabbe26fa5972631629692ee85862c462","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-11 21:38:06.000000000","message":"Patch Set 30:\n\nrecheck\n\nThe Verified-1 on this patch set came from the keystone credential\nregression, not from this change. The fix,\nhttps://review.opendev.org/c/openstack/horizon/+/1005130, merged at 20:27,\nso the integration job should be clean this time.","accounts_in_message":[],"_revision_number":30},{"id":"fa284c516223ac1b68026b47b45d4ff5bb1a6b70","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-09-11 22:36:08.000000000","message":"Patch Set 30: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/cde4d0cb6d1c4baeb77af87f3938aebf\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/93e350b8d04b4b4dba3eabdf0d7859ab : SUCCESS in 3m 59s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/d27f214b957a44638eb646a2f9f76ac4 : SUCCESS in 3m 04s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/c0a9c2fb17c34bf89158695bd9d7eb87 : SUCCESS in 3m 50s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/c66a10a53de343459a384f3bae23bd93 : SUCCESS in 5m 47s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/037e8975c3a14a97a6edbb49c7ea75d1 : SUCCESS in 2m 46s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/19a14a9cd3934335800c0a9df34b436d : SUCCESS in 2m 41s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/c1a296e25d5e47b49582e23270800844 : SUCCESS in 4m 28s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/d419a69b9875491d84c7a2cc99d5cc41 : SUCCESS in 4m 01s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/9cf8127c21cc429394dee1c487058a09 : SUCCESS in 5m 53s\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/1d30379625ed422daa1bf46d8ace2279 : SUCCESS in 18m 18s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/7a7ff2a969734bcf8c4642d9dfbd8a76 : SUCCESS in 13m 19s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/8ac746a03bc6456b8a9cf2cb4134ba0a : SUCCESS in 17m 43s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/a785ee9b67144ca3a8615599a4d9add4 : SUCCESS in 19m 39s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/d2154fa1fe8b451788ec80bd9649d12c : SUCCESS in 5m 24s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/daae5fa989f7495ebbaa14db54bef468 : SUCCESS in 19m 13s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/bbf0e21c80704efdb23c7d600d2e7f4a : SUCCESS in 17m 29s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/df873736a82e45dd96a8e0322bb4c87e : SUCCESS in 15m 07s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/465a2666a7434cc9b18696cd31b78375 : SUCCESS in 13m 42s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/5c4ccc143854448c87091ea2259d0d60 : SUCCESS in 6m 26s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/56f9c203e4504e56ae44ec2fdd35e843 : SUCCESS in 54m 03s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/26679035c6f749a38f0e52407e3aa4ea : SUCCESS in 20m 24s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/e52e4f5f2a0648a786469f13013cbe91 : SUCCESS in 16m 10s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/bdbe11063c70440280a8b27b14dad69e : SUCCESS in 4m 04s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/005ed2e3dfd94596aa9054beeec867b5 : SUCCESS in 32m 01s","accounts_in_message":[],"_revision_number":30},{"id":"52b533f25db3d1fbde2b533b97f279f23db8e66b","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-09-17 21:14:49.000000000","message":"Patch Set 30:\n\n@janjasek, a gentle nudge on this one, six days on.\n\nPatch set 30 answers both of your points. The unauthorized on disable was\na real bug rather than your setup: credential_delete forced the admin\nclient, and keystoneclient raises NotAuthorized inside Horizon before\nkeystone is ever asked. That is fixed. The configuration is now documented\nin one place, under OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED in the\nconfiguration guide, including the two prerequisites that were missing:\ntotp in the keystone [auth] methods option, and the policy rules mirrored\nin Horizon own copy of the keystone policy file, which is what had you\ngoing in circles.\n\nThe change is Verified+1 with no negative votes left.\n\nNo urgency, and no pressure to +2 if you would rather a security adjacent\npanel went to someone else. If a third round of DevStack testing is what\nit needs, say so and I will wait. Benjamin remains the author; I have only\nbeen carrying the patch sets while he is quiet.","accounts_in_message":[],"_revision_number":30},{"id":"d3567fa03b99922897d2ebdc6f37c950edd4bf17","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-09-25 10:41:46.000000000","message":"Patch Set 30: Code-Review-1\n\n(1 comment)","accounts_in_message":[],"_revision_number":30},{"id":"0689502bcac304c9ebfa234951e35dff22e7ed8c","author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"date":"2026-09-25 10:48:21.000000000","message":"Patch Set 30:\n\n(1 comment)","accounts_in_message":[],"_revision_number":30},{"id":"ca3553da207437b4478b00861c47a07af7016d59","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-02 21:59:57.000000000","message":"Uploaded patch set 31.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":31},{"id":"fc95eea1777e89137c9172b34bcab3b0c489f016","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-02 22:00:21.000000000","message":"Patch Set 31:\n\nThank you both, and @janjasek in particular: the -1 was right, and\nchasing it on a devstack turned up two more defects behind it.\n\nYour root cause was exactly it. can_register() is only consulted on the\nADD_PANEL path, in horizon/base.py:970. The change already shipped the\nright enabled file, _5010_settings_mfa.py, but the module-level\nSettings.register(MFAPanel) and the \u0027mfa\u0027 slug in Settings.panels\nregistered the panel twice more and bypassed the check. Measured before\nthe fix, with the setting at False: panels \u003d [\u0027user\u0027, \u0027password\u0027,\n\u0027credentials\u0027, \u0027mfa\u0027]. After it, the setting at False or absent leaves\nthe panel out and /settings/mfa/ returns 404, so the route itself stops\nexisting rather than being merely hidden. A test now asserts the slug is\nabsent from the static tuple; it fails on the old code.\n\nTesting that led to the issue you reported at patch set 29, and it was\nnot your setup either. Enabling MFA made the login loop forever.\nopenstack_auth ships plugin/totp.py and the TimeBasedOneTimePassword\nform, but TotpPlugin was never listed in AUTHENTICATION_PLUGINS, so\nnothing could handle the passcode step: keystone answers the password\nstep with 401 plus a receipt, horizon finds no plugin for the receipt\nand passcode pair, logs \"No authentication backend could be determined\nto handle the provided credentials\" and returns to the password form.\nNo usable error reaches the user. The plugin is now in the default list,\nand it is inert without a full TOTP step, so deployments that never\nenable MFA are unaffected.\n\nThe third one is the \"no delete action for member users\" you saw. A\nmember can delete their own credential through the API, 204, but the\nDelete and Edit actions of the credentials table were hidden from them.\nTheir policy_rules reference user_id:%(target.credential.user_id)s while\nget_policy_target() returned the empty default, so only\nrule:admin_required could match. Measured in the browser as a member:\n0 occurrences of \"Delete User Credential\" before the fix, 1 after.\n\nTwo notes from the same session that are worth having in the docs. Of\nthe six policy rules, only identity:update_user actually needs an\noverride in a default deployment, since the other five already admit the\nowner through %(target.credential.user_id)s; its default is\n\"(rule:admin_required) or (role:manager and\ntoken.domain.id:%(target.user.domain_id)s)\", which a plain member does\nnot satisfy. And keystone has no recovery or backup codes for TOTP, so a\nuser who loses their authenticator is locked out until an administrator\nclears multi_factor_auth_enabled. The configuration guide now says both.\n\n@anfimovir, the versionadded is now 2027.1, thanks.\n\nOn the testing remark: fair. The verification above was done on a\ndevstack running master, with all four prerequisites applied, as admin\nand as a member user, and each fix was checked by reverting it alone and\nconfirming the symptom returns.","accounts_in_message":[],"_revision_number":31},{"id":"5c159c56418e0840eb135055df43fbb601e62095","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-02 23:07:17.000000000","message":"Patch Set 31: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/92dcc243d47c466c98be60ecf9269875\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/6091a59b6d4a4408981bccb6abdb44e7 : SUCCESS in 2m 09s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/1768a155744a4e6a9c6dcb2cc670df7b : SUCCESS in 2m 17s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/0ef8cf6bd1584edd91fcb9f050dc500f : SUCCESS in 2m 26s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/4affcd0246ab4c719e8c93aa65bd9a2c : SUCCESS in 5m 31s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/900bfc9776e3451b80ff7d0ea6369402 : SUCCESS in 3m 11s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/143a2545be654e12a77f57cf03732dba : SUCCESS in 2m 26s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/4382aa7e55b14b57b1b710b5a1a2f185 : SUCCESS in 7m 25s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/1eb87a4d34e94780bd3cc05507089764 : SUCCESS in 4m 11s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/e12e13823bcf41e1a43453d4381c8505 : SUCCESS in 5m 48s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/6394827014f0460fa0d22d9e46b5366f : SUCCESS in 20m 58s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/ae992fbd70b54cdf97105a5b46e71e51 : SUCCESS in 17m 08s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/63df8320a81b442689231d5d052ba17f : SUCCESS in 10m 10s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/54a177ac75e041108af87e2023700bb8 : SUCCESS in 10m 21s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/d872737d7e9544e8a0866e0feba8629f : SUCCESS in 2m 47s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/3d41c8b65abc4450bdb12325e981a058 : SUCCESS in 8m 21s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/27899fa83b4542dc969ef77877fb6dfb : SUCCESS in 15m 56s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/5e66c45c4b914142baa860e258417074 : SUCCESS in 10m 01s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/94f757aecc5b43068c52af9c130c4b7f : SUCCESS in 10m 53s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/1f338458c4614043a2ffd8b41bac6b82 : FAILURE in 1h 00m 21s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/72ed6f0f5f7d46e7a9403d2a94feda8c : SUCCESS in 30m 02s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/e9273e356b854ddeb63bda04ed660e46 : SUCCESS in 28m 04s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/032396fc79a64688b68fc61c284f10f6 : SUCCESS in 3m 59s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/a3ffffe85eaf4731928f3bc26a02eadb : SUCCESS in 15m 35s","accounts_in_message":[],"_revision_number":31},{"id":"4626f2207136545bb9f080613b48d47506bbf633","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-03 04:52:18.000000000","message":"Patch Set 31:\n\nrecheck\n\nhorizon-integration-pytest failed on\ntest_keypairs.py::test_create_keypair_demo, which this change does not\ntouch; everything else was green, 22 of 23 jobs. That job has failed 4\nof its last 15 runs on this repo, twice more tonight on other changes,\nso this looks like the job rather than the patch. Rechecking.","accounts_in_message":[],"_revision_number":31},{"id":"48752f01d4b91cc63810b12a726793aff6ba64ed","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-03 06:00:42.000000000","message":"Patch Set 31:\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/5482c8d0ea834d729024d8ca5fc45a5c\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/864cbd43bbb74a9d8debfcacdab413bd : SUCCESS in 2m 05s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/dd0d3e9e4a4d4e7a888653b82653b536 : SUCCESS in 2m 48s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/6e25d2c4259e4500a559d2502ea66d2c : SUCCESS in 2m 42s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/582cae140f85411a88430ddf98401e80 : SUCCESS in 5m 14s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/a3ef302349624979883be577d115c2b2 : SUCCESS in 2m 32s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/7d38f95460eb4aff9bf913d388f9bff6 : SUCCESS in 2m 34s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/0aac0547be3b45199d0498c49d1f309d : SUCCESS in 4m 31s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/0dcd71319eda496b833dc41f6d3315dd : SUCCESS in 3m 06s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/43549866e2054d47a7c4832c9f716420 : SUCCESS in 5m 12s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/d54bcc7a3c2b45d19651acc88fefcce8 : SUCCESS in 12m 00s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/3f3b57b02ba545f89f5816183bcaf0c7 : SUCCESS in 16m 47s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/e064fb7673b44f8f99f23296222b8191 : SUCCESS in 24m 11s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/6fd45f2320b24fb5a2cbdecd521ca99d : SUCCESS in 12m 26s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/65bc6d5a2a6745a7b24b7aa67c39c81a : SUCCESS in 3m 12s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/9552f7c87e3347d39089696463f75e2b : SUCCESS in 8m 23s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/8bcbc2254416488ab4975b302351d249 : SUCCESS in 8m 30s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/400b3a3969e040da811c5dca3b9a423a : SUCCESS in 13m 24s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/1675dfa880a14d9bbd2167a7d6edc825 : SUCCESS in 11m 31s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/555d6a6abfa848e4a35fce806d8d6cb7 : FAILURE in 1h 03m 17s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/fd541be2708844cb8cb6c3dd1ee9b9e2 : SUCCESS in 28m 22s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/d796e2c301b04bc29bf2fdb55ccc3144 : SUCCESS in 27m 56s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/9cbc130cca6c487a89209759e184c437 : SUCCESS in 4m 04s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/2351fbae20d44b9e9e74afe9f8f18628 : SUCCESS in 19m 39s","accounts_in_message":[],"_revision_number":31},{"id":"94e7e91e419d778ee00df30d6fb74ddd5d8a7bee","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-03 06:50:19.000000000","message":"Patch Set 31:\n\nrecheck\n\nhorizon-integration-pytest failed on\ntest_settings.py::test_dashboard_help_redirection this time, after\nfailing on test_keypairs.py::test_create_keypair_demo on the previous\nrun. Two different tests on two runs of the same unchanged patch set,\nand that job has failed 4 of its last 15 runs on this repo, so this\nlooks like job instability rather than the change. Everything else was\ngreen both times, 22 of 23 jobs.","accounts_in_message":[],"_revision_number":31},{"id":"a1301c74e9f625cb5a392c23ed497a2128b3a660","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-03 07:54:46.000000000","message":"Patch Set 31:\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/9c0e7259eb814db393e458763d291e32\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/db653ef9106c40aa9183eccdf3a0b76a : SUCCESS in 2m 14s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/8f28b92144364e4d971d2f60649478e0 : SUCCESS in 3m 05s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/67fb49637a46459bb5a5680eda88d527 : SUCCESS in 3m 38s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/47914ffa7ae4401c98a71fa3201520ba : SUCCESS in 5m 14s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/ce7722caadb441a38a7f7963f91bd094 : SUCCESS in 2m 38s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/bc5cea46f9854f15929f4dc2b1ab0ee0 : SUCCESS in 3m 34s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/77fe2d8a6bcd4266815aebe78972c3ee : SUCCESS in 7m 34s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/8ff86d37e5d24a42aa0af6087fcf9fb5 : SUCCESS in 4m 31s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/59e7a9822c374c4f856159aab7eb2182 : SUCCESS in 7m 46s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/91e4eae7e94b41229670d17518936a90 : SUCCESS in 23m 58s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/bc8398b912fb4ff287d3fd4251e3de40 : SUCCESS in 9m 11s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/bcc04349d2004569b8931e9b3a8fac81 : SUCCESS in 23m 29s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/4604575ef0f14a828cf5d93cf768ac12 : SUCCESS in 24m 42s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/33c7b1de8792444fbca241e1fa7e145e : SUCCESS in 5m 15s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/e20c7ab537654b668be91af81f2a0f1a : SUCCESS in 18m 29s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/d9a5c6b520f24f3a8795b94c0c65fd21 : SUCCESS in 15m 22s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/62210e78efac41b08315e5e878ef5fd6 : SUCCESS in 11m 34s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/990bcc1f1d0443f49b2c7de2ecf02ec8 : SUCCESS in 10m 21s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/e1e9f2bb692f449494c6767308e85608 : FAILURE in 58m 12s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/05663f0cee9e4eedb5b40dd8d4368272 : SUCCESS in 31m 02s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/0b5b58b3b18545e3949ff2be26fce188 : SUCCESS in 33m 36s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/d54ab5cedd2a44d3ba0acef6607b83ce : SUCCESS in 4m 22s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/b46c0645ae0b44018cedcf7688a00a42 : SUCCESS in 28m 25s","accounts_in_message":[],"_revision_number":31},{"id":"7fe7e33feb6f9b20a4470cd057c757561c025997","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-05 15:04:46.000000000","message":"Patch Set 31:\n\nrecheck bug 2169406\n\nhorizon-integration-pytest again, on a test this change does not touch.\nThat job succeeded 76 of its last 89 completed builds on this repo, and\nthe 13 failures are split 6 on my changes and 7 on other people\u0027s, so it\nis the job. Measured and filed as bug 2169406, where\ntest_create_keypair_demo alone accounts for 7 of the 13.","accounts_in_message":[],"_revision_number":31},{"id":"45d22552173040d86074df2ea179c888d8b9f040","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-05 16:08:00.000000000","message":"Patch Set 31:\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/fb6509b07135478aa44eceeb7ab29a5b\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/45957a8bf7454595879ad59a21c4b707 : SUCCESS in 2m 35s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/929295b05f4b4ea78826520c0c1f6b4f : SUCCESS in 4m 27s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/d935e805035245e296f64b3061d73f7a : SUCCESS in 3m 52s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/b911a33d35e84c48ab8129ce32aa30f0 : SUCCESS in 5m 49s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/5030e00cf0334d8497e4ddf836ea3eb7 : SUCCESS in 3m 46s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/f1039bb1e0d8417eb079cfffbcb99707 : SUCCESS in 2m 19s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/7abbc40997b248c08320f1c0d7425a8b : SUCCESS in 4m 08s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/b32ce23583ae4ed2867493bdb810ea2d : SUCCESS in 2m 47s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/4711d2f8ece84bf88955edeea8a04eed : SUCCESS in 6m 10s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/16e0eeae264e4bebbd2e95cce7c891be : SUCCESS in 19m 50s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/18a67c356923416cbd84d013cbbe2fa4 : SUCCESS in 9m 41s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/8753cfb2e897431dbfcbedbbc9f04814 : SUCCESS in 18m 29s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/b108d0971c8a41308562e5d4ff7d5a83 : SUCCESS in 17m 13s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/3ae5c0f65dc94b27a8bd766995d4b5a4 : SUCCESS in 3m 09s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/bc93ad2700e942efa0b53593efe8af26 : SUCCESS in 19m 08s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/eb0c918932ba4de4a3ff69650e466055 : SUCCESS in 15m 23s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/6c0f2f4aaa784fcabf5128db32c94b1d : SUCCESS in 14m 00s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/4bd54cefc1df42939540a3cc0a4d743e : SUCCESS in 11m 02s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/70a43a84afd54468801e6a8bdd1263d1 : FAILURE in 58m 59s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/8afbb7e691104985b39547a79e5ea250 : SUCCESS in 29m 20s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/3db39efe1d1643d3a36c5708d430054b : SUCCESS in 28m 24s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/68fe34cbe70a41cea3f7e4a0ba67cfc6 : SUCCESS in 5m 27s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/28bcff8dea264dddb1c8416586c0dddd : SUCCESS in 14m 06s","accounts_in_message":[],"_revision_number":31},{"id":"c80b8f11d00d0b064e87ea4562d1ec5f58f086f5","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-08 06:01:53.000000000","message":"Patch Set 31:\n\nrecheck\n\nThe -1 here is stale. This change last ran on 2026-10-05, and failed on\nhorizon-integration-pytest alone, before the Firefox ESR 153 durability\nfixes landed: 1008755 for the keypair race, 1008937 for the help\nredirection one, and 1008568 for the sidebar scroll. All three are\nmerged now, so rechecking against them.","accounts_in_message":[],"_revision_number":31},{"id":"c755f3114a701a9d1730574392aee46ee5e827f5","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-08 07:04:14.000000000","message":"Patch Set 31: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/7cd5e89cf1604a3eb9489464c13e354c\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/c77c723c93c3472cbe8f4a3351b4bb7b : SUCCESS in 1m 52s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/fd823ef77b364287b2c5f661c1e0a3db : SUCCESS in 2m 47s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/4e0a6a8cdf484960a501eb6d0427f93c : SUCCESS in 3m 37s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/27264eeb4153489d81fabea691e0394c : SUCCESS in 5m 17s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/a651190833234da98c6a2e214714e65a : SUCCESS in 3m 28s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/739fbb0c53874e378e7574706f4e6803 : SUCCESS in 3m 16s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/7aa82bf36abe449a8822f03a8aba3685 : SUCCESS in 4m 41s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/6e769dbbdf494f299de445e56f893d7a : SUCCESS in 3m 26s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/190fc50f1e0942ac9d03b8fdadbe7856 : SUCCESS in 4m 42s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/e5958886b2004c709da67e677a1e1be9 : SUCCESS in 13m 02s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/d049cd3543264fe6b948b6881668f19d : SUCCESS in 7m 52s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/5f9238b0e38c474abda04257125aef7e : SUCCESS in 25m 49s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/21670a8303414896a051863dfcec5fef : SUCCESS in 10m 40s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/cdc459b1ad2943b9b3e1e639771e4fc7 : SUCCESS in 5m 32s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/7cf9994bcc11401d86635f8398a4fc3c : SUCCESS in 10m 15s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/f0e779375fba4176af8fb1de1f0a1260 : SUCCESS in 9m 41s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/0ab3fff5189c445d8fd193831972f446 : SUCCESS in 13m 37s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/ee68f1c998434dad8d89e78f7bd8d168 : SUCCESS in 6m 42s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/f89b356c76604792830131fafa28e962 : SUCCESS in 56m 38s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/c716273ec0f6481ab526127af7cd0a8b : SUCCESS in 23m 58s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/db2fdefedf84477b8dc27c00ecbfd1fd : SUCCESS in 29m 14s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/24f8e79686c84ab7a1635b5df079467f : SUCCESS in 4m 02s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/0708df0b3f25455394a3a6442ba39c01 : SUCCESS in 33m 24s","accounts_in_message":[],"_revision_number":31},{"id":"208884425ade189c75e34937de4881f00e1b5f71","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-10-08 11:35:29.000000000","message":"Patch Set 31: Code-Review-1\n\n(1 comment)","accounts_in_message":[],"_revision_number":31},{"id":"e8e95b09fd7b7c9f2af77b4d069a3b3ee374d778","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-10 12:08:12.000000000","message":"Uploaded patch set 32.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":32},{"id":"a619aaa0a02dae9c25a7e0fd00960d471633606d","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-10 12:13:34.000000000","message":"Patch Set 32:\n\nYou are right, and thank you for catching it. The sidebar changed as a\nside effect of the previous patch set, not on purpose.\n\nPatch set 31 removed the module-level Settings.register(MFAPanel) and the\nmfa slug from Settings.panels, so that OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED\nwould finally be honoured through can_register(). That left the panel on\nthe ADD_PANEL path only, and _load_panel_customization appends it to\nDashboard.panels after get_panel_groups() has already built the panel\ngroups. Horizon then finds the panel ungrouped and sweeps it into the\nleftover group it labels Other, which is the dropdown you saw.\n\nPatch set 32 adds PANEL_GROUP \u003d default to\nopenstack_dashboard/enabled/_5010_settings_mfa.py, which is the mechanism\nhorizon provides for exactly this case. Verified locally in both states:\n\n  OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\n    group default: user, password, credentials, mfa\n    no Other group at all\n\n  OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d False\n    group default: user, password, credentials\n\nSo the sidebar is back to the structure of the earlier patch sets, with\nMFA as one panel among the other Settings options, and your first -1 stays\nfixed: the panel still disappears when the setting is off.","accounts_in_message":[],"_revision_number":32},{"id":"93cc08093f44bf180aaa25ea4657a78cbf81a20a","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-10 12:54:38.000000000","message":"Patch Set 32: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/fcf393d61940412d926ee09c85e25658\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/f4c93a43bc834dce8ab0d5b9725cf2f1 : SUCCESS in 1m 32s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/0a49a6c07f3048b3846699f05b6dbf80 : SUCCESS in 2m 21s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/2db792b45d4d44c2b56dd6931a74b5eb : SUCCESS in 2m 04s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/6ba54bf81dbf46fd83e23d90b7247ce3 : SUCCESS in 3m 35s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/37f471f791d94cc5bbe8cc9e0a8fcd5b : SUCCESS in 2m 46s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/464f96356f9f4387bad992e4523aed78 : SUCCESS in 4m 29s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/49b5db33fb60447c92c984623527ee19 : SUCCESS in 9m 39s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/5ec5d97846e745158d59712158141fa7 : SUCCESS in 4m 33s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/7f526cb0796d4577bbb4c21ec476159a : SUCCESS in 4m 02s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/0fd5462fb6ec47d98f3ddc301de7db46 : SUCCESS in 24m 08s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/f147b01194f64d6192af446723b35d4a : SUCCESS in 17m 14s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/6d9fbbfdceb842859f6ceffd76ba2304 : SUCCESS in 24m 18s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/35b4c4166ec54a4f82becc95a2c39a1e : SUCCESS in 21m 17s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/c653c2f3cb334cb199028523c9f15cc3 : SUCCESS in 3m 29s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/f77ae8833a344bd0866a9b84340fada9 : SUCCESS in 21m 28s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/873ecf0e3b7147d9bf6dcd3e9cdc38ae : SUCCESS in 8m 40s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/b7fb1dbabc1441d08c4bd7fdc88c89e1 : SUCCESS in 11m 29s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/dbc2b11a885d4205a94b4713def1cac4 : SUCCESS in 8m 34s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/1c3c9a1b1c794d9facb00734c48d33dd : FAILURE in 34m 47s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/819fc6638ad241c38319fafe042941d6 : SUCCESS in 19m 01s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/5e5724a4251f4ca995004df41758147f : SUCCESS in 28m 53s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/1ad046f4c0c84f9ebbf6a9e5c1709338 : SUCCESS in 2m 19s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/1209dbb4cc7849538a75fb917cb4c685 : SUCCESS in 16m 19s","accounts_in_message":[],"_revision_number":32},{"id":"13db01b36672054dc036042f3896f60af675945c","author":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"date":"2026-10-10 15:44:05.000000000","message":"Patch Set 32:\n\nrecheck the only failure was test_instance_pagination_demo in\ntest_instances.py, a pagination race in the Instances panel: the second\npage came back with next\u003dFalse and the first instance instead of the\nsecond. This patch set only adds PANEL_GROUP to the settings enabled\nfile, so it cannot affect instance pagination. The job stands at 36\nsuccesses out of the last 40 builds on this project.\n\nWorth noting that pytest runs with -x, so the run stopped at 31 percent,\nbefore test_settings.py. The selenium coverage of the sidebar has not\nactually been exercised on this patch set yet.","accounts_in_message":[],"_revision_number":32},{"id":"12dc602538134f9e2137ac5404d8916dfe7f48b0","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-10 17:08:19.000000000","message":"Patch Set 32:\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/9ce32a36fb74447aaa12ffb5c4e69926\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/39b4f406169548dc8556072f2dc7a348 : SUCCESS in 2m 20s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/03fb8033fa0a4d7a88d346ba57ccebf6 : SUCCESS in 2m 49s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/f0b2b58c27b84eafb76b22b64542a4bd : SUCCESS in 2m 10s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/93b286c6e8344e628052d39a41246dcb : SUCCESS in 4m 52s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/8a1bfcc18efb4da993d68accee60bafb : SUCCESS in 3m 18s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/331e4e5d7a8443f5b37ca124a8f230c0 : SUCCESS in 4m 23s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/d2e12f72c1e34db5afd141ecc95fb087 : SUCCESS in 7m 23s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/6ebeedbda33f480a8e9d7dad62391a76 : SUCCESS in 4m 03s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/7fd51daf587149de9d262254b72cf670 : SUCCESS in 3m 18s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/8286a92bbd9b49ed8df2103cc9debb30 : SUCCESS in 24m 14s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/71139df3c988486a868a08c81162f9f4 : SUCCESS in 17m 18s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/4861d65718874d68a5afaff789e2e39f : SUCCESS in 10m 36s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/7eb63537e2cb47afa9901a80854b8807 : SUCCESS in 18m 55s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/9bda153cae454c6d9759457a5fc8f787 : SUCCESS in 6m 23s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/ed9f9111544245b4a952c12dd47b0547 : SUCCESS in 19m 08s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/22ac04e4f7424d559e7b30a0c4ec6dba : SUCCESS in 14m 45s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/1ab2da7e6c764663a94563da4df9fdf8 : SUCCESS in 13m 25s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/ba89e7ee2cb44b96b72514c868ec5e88 : SUCCESS in 8m 44s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/c95289e490cb49e59777fe0ed7b3a5df : FAILURE in 1h 18m 16s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/905725ee05ab4ebb9e26bf590565f298 : SUCCESS in 15m 14s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/5adfbeee2b474c3a914d2baf30f5581f : SUCCESS in 13m 40s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/3fd567140b944b2ebf19a1173962d910 : SUCCESS in 4m 26s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/c3e23d8eed64446883a0568096ab51ba : SUCCESS in 27m 52s","accounts_in_message":[],"_revision_number":32},{"id":"d590635b2d0f73c434526a8110128eeb7d4344e1","author":{"_account_id":35133,"name":"Jan Jasek","email":"jjasek@redhat.com","username":"janjasek"},"date":"2026-10-12 07:36:00.000000000","message":"Patch Set 32:\n\n(1 comment)","accounts_in_message":[],"_revision_number":32},{"id":"84d80ef3ed939f3bbbe0e47c671b9e0bf3a4518f","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-10-12 08:31:11.000000000","message":"Patch Set 32: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/7cd04a1b56704ac085597e2116af042f\n\n- requirements-check https://zuul.opendev.org/t/openstack/build/8a19ae2a20a64eba985ea07064f15ca1 : SUCCESS in 2m 17s\n- horizon-cross-designate-dashboard-python https://zuul.opendev.org/t/openstack/build/e3edb27170e34cbca7d349fbaa35952b : SUCCESS in 4m 56s (non-voting)\n- horizon-cross-heat-dashboard-python https://zuul.opendev.org/t/openstack/build/daae223dd99241d3869348738c9fb786 : SUCCESS in 3m 46s (non-voting)\n- horizon-cross-ironic-ui-npm https://zuul.opendev.org/t/openstack/build/56ac846c24844362bbdb37c4d889ffc9 : SUCCESS in 5m 29s (non-voting)\n- horizon-cross-octavia-dashboard-python https://zuul.opendev.org/t/openstack/build/99c6676f2a9c49b2bf3a5f8893a3c554 : SUCCESS in 3m 27s (non-voting)\n- horizon-cross-magnum-ui-python https://zuul.opendev.org/t/openstack/build/2fca03dc118d492280ae7b2b5b54ddb1 : SUCCESS in 3m 15s (non-voting)\n- horizon-cross-manila-ui-python https://zuul.opendev.org/t/openstack/build/d9168cefea764121b6e4669f9de78556 : SUCCESS in 7m 33s (non-voting)\n- horizon-nodejs20-run-lint https://zuul.opendev.org/t/openstack/build/f909a02cc02a468184a5e15517d447e3 : SUCCESS in 4m 12s\n- horizon-nodejs20-run-test https://zuul.opendev.org/t/openstack/build/21514a5e4a8f470a95554cf9dd92d6a6 : SUCCESS in 5m 14s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/20646fe4411d474db7e28d80e1c0d04a : SUCCESS in 26m 35s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/485fc71c45714ea9b6b9b97532f1ac37 : SUCCESS in 16m 55s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/e9f99d8d7f4948cf9af3a4e83ab523e2 : SUCCESS in 21m 53s\n- horizon-tox-python3-django60 https://zuul.opendev.org/t/openstack/build/0a3e1b1da1294e108a2e6e0286440891 : SUCCESS in 18m 31s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/04fe1dd0bb6a46259189878dc5de3499 : SUCCESS in 4m 32s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/c1ad530e55a049e18f5a82a3b37f04a8 : SUCCESS in 22m 33s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/291929589d394de5b67e826184657608 : SUCCESS in 15m 42s\n- build-openstack-releasenotes https://zuul.opendev.org/t/openstack/build/1fd9c9084f554270827eee43db156aeb : SUCCESS in 12m 28s\n- horizon-selenium-headless https://zuul.opendev.org/t/openstack/build/f6e5791b79a34e2e9ad59578bdad0b67 : SUCCESS in 8m 56s\n- horizon-integration-pytest https://zuul.opendev.org/t/openstack/build/aed3d76c70d149b8b33772a514e528be : SUCCESS in 53m 59s\n- horizon-ui-pytest https://zuul.opendev.org/t/openstack/build/2efaaa0f23944601921eb162d35b16dd : SUCCESS in 29m 43s\n- horizon-dsvm-tempest-plugin https://zuul.opendev.org/t/openstack/build/b9eace351c194c5f8af0f5485a7bfe30 : SUCCESS in 31m 07s\n- horizon-tox-bandit-baseline https://zuul.opendev.org/t/openstack/build/d41082ffc0f24bff828931640d8fc74f : SUCCESS in 4m 17s\n- horizon-tempest-plugin-ipv6 https://zuul.opendev.org/t/openstack/build/e3998fa538d743cab76a2cbbb6bf2b51 : SUCCESS in 31m 34s","accounts_in_message":[],"_revision_number":32}],"current_revision_number":32,"current_revision":"4021a36693af05a03bc7b690ffb83f4eabb50225","revisions":{"b5df04b4f699dae8927b382ca4d60789cd7bb858":{"kind":"REWORK","_number":1,"created":"2026-02-25 10:48:38.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/1"}}},"commit":{"parents":[{"commit":"665783683b1844f3342e0e628fab85a95363b06f","subject":"Merge \"Fix spelling for utils method\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/665783683b1844f3342e0e628fab85a95363b06f"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-25 10:16:39.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-25 10:48:07.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b5df04b4f699dae8927b382ca4d60789cd7bb858"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b5df04b4f699dae8927b382ca4d60789cd7bb858"}]},"branch":"refs/heads/master"},"62946cc80299ec74b6b501e3101901c8f8cfef4a":{"kind":"NO_CHANGE","_number":2,"created":"2026-02-25 15:41:38.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/2"}}},"commit":{"parents":[{"commit":"665783683b1844f3342e0e628fab85a95363b06f","subject":"Merge \"Fix spelling for utils method\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/665783683b1844f3342e0e628fab85a95363b06f"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-25 10:16:39.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-25 15:40:38.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/62946cc80299ec74b6b501e3101901c8f8cfef4a"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/62946cc80299ec74b6b501e3101901c8f8cfef4a"}]},"branch":"refs/heads/master"},"1b1bf574379f132759adc41493b1c038844a4fef":{"kind":"REWORK","_number":3,"created":"2026-02-25 15:53:15.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/3","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/3","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/3"}}},"commit":{"parents":[{"commit":"665783683b1844f3342e0e628fab85a95363b06f","subject":"Merge \"Fix spelling for utils method\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/665783683b1844f3342e0e628fab85a95363b06f"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-25 10:16:39.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-25 15:51:55.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/1b1bf574379f132759adc41493b1c038844a4fef"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/1b1bf574379f132759adc41493b1c038844a4fef"}]},"branch":"refs/heads/master"},"e22a17cb3e314abf78bf55b044918ea55e9dc8d8":{"kind":"REWORK","_number":4,"created":"2026-02-26 13:10:15.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/4","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/4","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/4 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/4 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/4 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/4"}}},"commit":{"parents":[{"commit":"b229fefde9f4dadd1ee490c4d5c69903488af16b","subject":"Merge \"Fix small mistakes in phrases and prevent problems with translation to another languages\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b229fefde9f4dadd1ee490c4d5c69903488af16b"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:09:12.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/e22a17cb3e314abf78bf55b044918ea55e9dc8d8"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/e22a17cb3e314abf78bf55b044918ea55e9dc8d8"}]},"branch":"refs/heads/master"},"2a404d582ee86d7d98d8407b76d5d877cbf52978":{"kind":"REWORK","_number":5,"created":"2026-02-26 13:26:34.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/5","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/5","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/5 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/5 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/5 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/5"}}},"commit":{"parents":[{"commit":"b229fefde9f4dadd1ee490c4d5c69903488af16b","subject":"Merge \"Fix small mistakes in phrases and prevent problems with translation to another languages\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b229fefde9f4dadd1ee490c4d5c69903488af16b"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:26:14.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/2a404d582ee86d7d98d8407b76d5d877cbf52978"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/2a404d582ee86d7d98d8407b76d5d877cbf52978"}]},"branch":"refs/heads/master"},"b1830944ab1342ceee30b35641ef082d54b555b3":{"kind":"REWORK","_number":6,"created":"2026-02-26 13:35:50.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/6","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/6","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/6 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/6 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/6 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/6"}}},"commit":{"parents":[{"commit":"665783683b1844f3342e0e628fab85a95363b06f","subject":"Merge \"Fix spelling for utils method\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/665783683b1844f3342e0e628fab85a95363b06f"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:35:29.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b1830944ab1342ceee30b35641ef082d54b555b3"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b1830944ab1342ceee30b35641ef082d54b555b3"}]},"branch":"refs/heads/master"},"cea694948a738770039f82d9d7dda88c663f962e":{"kind":"REWORK","_number":7,"created":"2026-02-26 13:38:01.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/7","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/7","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/7 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/7 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/7 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/7"}}},"commit":{"parents":[{"commit":"665783683b1844f3342e0e628fab85a95363b06f","subject":"Merge \"Fix spelling for utils method\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/665783683b1844f3342e0e628fab85a95363b06f"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:37:47.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/GB1Kex_6HrE\n\nCloses-Bug: #2142657\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/cea694948a738770039f82d9d7dda88c663f962e"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/cea694948a738770039f82d9d7dda88c663f962e"}]},"branch":"refs/heads/master"},"678d4d892bf82015f29c9b63591198fe2086ef52":{"kind":"REWORK","_number":8,"created":"2026-03-06 14:54:24.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/8","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/8","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/8 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/8 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/8 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/8"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-06 14:54:20.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/WxqTyTL6Xtw\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/678d4d892bf82015f29c9b63591198fe2086ef52"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/678d4d892bf82015f29c9b63591198fe2086ef52"}]},"branch":"refs/heads/master"},"f6d4e122981ac6ec85ada5f9bf2446f2f00636a2":{"kind":"REWORK","_number":9,"created":"2026-03-06 14:59:25.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/9","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/9","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/9 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/9 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/9 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/9"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-06 14:59:10.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel:\n- generates a TOTP enrollment QR code,\n- allows registration of an authenticator application,\n- verifies the submitted TOTP code,\n- confirms successful MFA enrollment.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\nDemonstration video : https://youtu.be/WxqTyTL6Xtw\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/f6d4e122981ac6ec85ada5f9bf2446f2f00636a2"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/f6d4e122981ac6ec85ada5f9bf2446f2f00636a2"}]},"branch":"refs/heads/master"},"d8a9f4207b15382f388c6cf636c3e1338e44006d":{"kind":"REWORK","_number":10,"created":"2026-03-10 13:06:15.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/10","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/10","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/10 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/10 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/10 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/10"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-10 12:58:48.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexemple: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/d8a9f4207b15382f388c6cf636c3e1338e44006d"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/d8a9f4207b15382f388c6cf636c3e1338e44006d"}]},"branch":"refs/heads/master"},"9063009614b13e120f56ce8ed2008fb8b32449b5":{"kind":"NO_CODE_CHANGE","_number":11,"created":"2026-03-10 13:21:39.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/11","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/11","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/11 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/11 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/11 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/11"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"Benjamin Lasseye","email":"blasseye@ikmail.com","date":"2026-03-10 13:21:39.000000000","tz":0},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexample: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/9063009614b13e120f56ce8ed2008fb8b32449b5"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/9063009614b13e120f56ce8ed2008fb8b32449b5"}]},"branch":"refs/heads/master","description":"Edit commit message"},"3b2c3e3b365573918e3530bb2889913cb11ecdb4":{"kind":"REWORK","_number":12,"created":"2026-03-11 12:33:39.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/12","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/12","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/12 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/12 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/12 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/12"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-11 12:31:59.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexemple: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/3b2c3e3b365573918e3530bb2889913cb11ecdb4"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/3b2c3e3b365573918e3530bb2889913cb11ecdb4"}]},"branch":"refs/heads/master"},"b93099a166229ad40d1281b58fa746cb7a2a60d0":{"kind":"REWORK","_number":13,"created":"2026-03-17 08:16:41.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/13","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/13","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/13 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/13 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/13 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/13"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-17 08:16:16.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexemple: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b93099a166229ad40d1281b58fa746cb7a2a60d0"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/b93099a166229ad40d1281b58fa746cb7a2a60d0"}]},"branch":"refs/heads/master"},"136388c164b39188767926d2a1adfc293bdcadd2":{"kind":"REWORK","_number":14,"created":"2026-03-17 09:30:57.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/14","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/14","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/14 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/14 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/14 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/14"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-17 09:30:43.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexemple: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/136388c164b39188767926d2a1adfc293bdcadd2"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/136388c164b39188767926d2a1adfc293bdcadd2"}]},"branch":"refs/heads/master"},"53c90c28dac40b48df9acbcf5c368961d59110aa":{"kind":"REWORK","_number":15,"created":"2026-03-17 09:49:44.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/15","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/15","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/15 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/15 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/15 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/15"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-17 09:49:33.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexemple: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/53c90c28dac40b48df9acbcf5c368961d59110aa"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/53c90c28dac40b48df9acbcf5c368961d59110aa"}]},"branch":"refs/heads/master"},"388a36d679d218b0fe0a2fd1566b122493cf82e3":{"kind":"REWORK","_number":16,"created":"2026-03-17 11:13:00.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/16","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/16","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/16 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/16 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/16 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/16"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-03-17 11:12:38.000000000","tz":60},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new settings:\n- OPENSTACK_MFA_ROLES : List of roles can active mfa (password,totp)\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nand an user with a role in OPENSTACK_MFA_ROLES\nexample: OPENSTACK_MFA_ROLES \u003d [ \u0027admin\u0027, \u0027mfa-role\u0027]\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/388a36d679d218b0fe0a2fd1566b122493cf82e3"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/388a36d679d218b0fe0a2fd1566b122493cf82e3"}]},"branch":"refs/heads/master"},"029854373723c3efcfc240c294727d4e22639082":{"kind":"REWORK","_number":17,"created":"2026-04-13 09:55:41.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/17","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/17","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/17 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/17 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/17 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/17"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-04-13 09:52:53.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/029854373723c3efcfc240c294727d4e22639082"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/029854373723c3efcfc240c294727d4e22639082"}]},"branch":"refs/heads/master"},"a97ff7f23d248fb4a744a05e4d897f61dc0728a5":{"kind":"REWORK","_number":18,"created":"2026-04-13 12:41:50.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/18","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/18","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/18 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/18 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/18 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/18"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-04-13 12:41:34.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/a97ff7f23d248fb4a744a05e4d897f61dc0728a5"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/a97ff7f23d248fb4a744a05e4d897f61dc0728a5"}]},"branch":"refs/heads/master"},"08c553d4aeeb3eaa772234b940f5b689d637042e":{"kind":"REWORK","_number":19,"created":"2026-04-14 11:21:10.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/19","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/19","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/19 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/19 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/19 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/19"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-04-14 11:20:54.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/08c553d4aeeb3eaa772234b940f5b689d637042e"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/08c553d4aeeb3eaa772234b940f5b689d637042e"}]},"branch":"refs/heads/master"},"5c70b7743878f73a97245dd7834267756afce75b":{"kind":"REWORK","_number":20,"created":"2026-04-14 11:22:18.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/20","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/20","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/20 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/20 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/20 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/20"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-04-14 11:22:02.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/5c70b7743878f73a97245dd7834267756afce75b"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/5c70b7743878f73a97245dd7834267756afce75b"}]},"branch":"refs/heads/master"},"019e18b7ec361b487b322d10e02d9ce0227ae6bc":{"kind":"REWORK","_number":21,"created":"2026-04-14 11:55:37.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/21","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/21","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/21 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/21 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/21 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/21"}}},"commit":{"parents":[{"commit":"ca45de357f97ae4e422e297644a9790b1eee84e7","subject":"Merge \"Better handle missing project usage info\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/ca45de357f97ae4e422e297644a9790b1eee84e7"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-04-14 11:55:23.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/019e18b7ec361b487b322d10e02d9ce0227ae6bc"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/019e18b7ec361b487b322d10e02d9ce0227ae6bc"}]},"branch":"refs/heads/master"},"afa88253b0dab0249f5a8af89680af4c7ecc70ee":{"kind":"REWORK","_number":22,"created":"2026-06-15 09:39:06.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/22","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/22","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/22 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/22 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/22 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/22"}}},"commit":{"parents":[{"commit":"c17623de60a9852ed1324f1eb1d151a97f338cee","subject":"Merge \"Make selenium screenshots_directory configurable\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/c17623de60a9852ed1324f1eb1d151a97f338cee"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-06-15 09:31:47.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/afa88253b0dab0249f5a8af89680af4c7ecc70ee"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/afa88253b0dab0249f5a8af89680af4c7ecc70ee"}]},"branch":"refs/heads/master"},"3e667e74a1e14ce29fc048ccd76239ca93748c89":{"kind":"REWORK","_number":23,"created":"2026-06-16 14:51:20.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/23","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/23","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/23 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/23 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/23 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/23"}}},"commit":{"parents":[{"commit":"c17623de60a9852ed1324f1eb1d151a97f338cee","subject":"Merge \"Make selenium screenshots_directory configurable\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/c17623de60a9852ed1324f1eb1d151a97f338cee"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-06-16 14:50:53.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/3e667e74a1e14ce29fc048ccd76239ca93748c89"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/3e667e74a1e14ce29fc048ccd76239ca93748c89"}]},"branch":"refs/heads/master"},"eed74ab63bda41fe0d5a51f131efb18e409a6c75":{"kind":"REWORK","_number":24,"created":"2026-06-17 11:47:11.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/24","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/24","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/24 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/24 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/24 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/24"}}},"commit":{"parents":[{"commit":"c17623de60a9852ed1324f1eb1d151a97f338cee","subject":"Merge \"Make selenium screenshots_directory configurable\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/c17623de60a9852ed1324f1eb1d151a97f338cee"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-06-17 11:46:20.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/eed74ab63bda41fe0d5a51f131efb18e409a6c75"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/eed74ab63bda41fe0d5a51f131efb18e409a6c75"}]},"branch":"refs/heads/master"},"347e676792d009ed2558ae258744890b3ffed61e":{"kind":"REWORK","_number":25,"created":"2026-06-17 15:42:13.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/25","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/25","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/25 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/25 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/25 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/25"}}},"commit":{"parents":[{"commit":"c17623de60a9852ed1324f1eb1d151a97f338cee","subject":"Merge \"Make selenium screenshots_directory configurable\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/c17623de60a9852ed1324f1eb1d151a97f338cee"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-06-17 15:41:19.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custome QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activited :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexemple policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/347e676792d009ed2558ae258744890b3ffed61e"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/347e676792d009ed2558ae258744890b3ffed61e"}]},"branch":"refs/heads/master"},"fdcae074fa581311845a6f795d0da233450ab55b":{"kind":"REWORK","_number":26,"created":"2026-06-22 08:21:28.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/26","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/26","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/26 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/26 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/26 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/26"}}},"commit":{"parents":[{"commit":"c17623de60a9852ed1324f1eb1d151a97f338cee","subject":"Merge \"Make selenium screenshots_directory configurable\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/c17623de60a9852ed1324f1eb1d151a97f338cee"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-06-22 08:16:16.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/fdcae074fa581311845a6f795d0da233450ab55b"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/fdcae074fa581311845a6f795d0da233450ab55b"}]},"branch":"refs/heads/master"},"d894ea4f64fcc75a6942ac444520b91864d01dd5":{"kind":"REWORK","_number":27,"created":"2026-06-22 14:02:18.000000000","uploader":{"_account_id":36012,"name":"Benjamin Lasseye","display_name":"Benjamin Lasseye","email":"blasseye@ikmail.com","username":"blasseye"},"ref":"refs/changes/39/977939/27","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/27","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/27 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/27 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/27 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/27"}}},"commit":{"parents":[{"commit":"c17623de60a9852ed1324f1eb1d151a97f338cee","subject":"Merge \"Make selenium screenshots_directory configurable\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/c17623de60a9852ed1324f1eb1d151a97f338cee"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-06-22 13:55:53.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/d894ea4f64fcc75a6942ac444520b91864d01dd5"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/d894ea4f64fcc75a6942ac444520b91864d01dd5"}]},"branch":"refs/heads/master"},"f3f97539727cd1f75c098e73fa73cd9b10ee5b78":{"kind":"REWORK","_number":28,"created":"2026-08-31 18:51:19.000000000","uploader":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"ref":"refs/changes/39/977939/28","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/28","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/28 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/28 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/28 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/28"}}},"commit":{"parents":[{"commit":"53cd01cff9028bc4af50a8b82e033adc301dbda9","subject":"Merge \"Remove identity_api_version from sample clouds.yaml\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/53cd01cff9028bc4af50a8b82e033adc301dbda9"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"Kevin Allioli","email":"kevin@stackops.ch","date":"2026-08-31 18:50:54.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\nSigned-off-by: Kevin Allioli \u003ckevin@stackops.ch\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/f3f97539727cd1f75c098e73fa73cd9b10ee5b78"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/f3f97539727cd1f75c098e73fa73cd9b10ee5b78"}]},"branch":"refs/heads/master"},"04b1ec38ac4ae3623d277828e2c75f4dd6ed6916":{"kind":"REWORK","_number":29,"created":"2026-09-07 15:16:48.000000000","uploader":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"ref":"refs/changes/39/977939/29","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/29","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/29 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/29 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/29 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/29"}}},"commit":{"parents":[{"commit":"53cd01cff9028bc4af50a8b82e033adc301dbda9","subject":"Merge \"Remove identity_api_version from sample clouds.yaml\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/53cd01cff9028bc4af50a8b82e033adc301dbda9"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"Kevin Allioli","email":"kevin@stackops.ch","date":"2026-09-07 15:15:57.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\nSigned-off-by: Kevin Allioli \u003ckevin@stackops.ch\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/04b1ec38ac4ae3623d277828e2c75f4dd6ed6916"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/04b1ec38ac4ae3623d277828e2c75f4dd6ed6916"}]},"branch":"refs/heads/master"},"557b48a0fdd2754338a09f71e3fb79647ee7bbba":{"kind":"REWORK","_number":30,"created":"2026-09-10 16:27:43.000000000","uploader":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"ref":"refs/changes/39/977939/30","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/30","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/30 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/30 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/30 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/30"}}},"commit":{"parents":[{"commit":"53cd01cff9028bc4af50a8b82e033adc301dbda9","subject":"Merge \"Remove identity_api_version from sample clouds.yaml\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/53cd01cff9028bc4af50a8b82e033adc301dbda9"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"Kevin Allioli","email":"kevin@stackops.ch","date":"2026-09-10 16:27:31.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nDisabling MFA and deleting the credential went through\napi.keystone.credential_delete, which forced the admin client. That\nclient raises NotAuthorized inside Horizon, before keystone is asked,\nwhenever the request does not satisfy admin_required, so a member user\nsaw MFA turn off while the TOTP credential stayed behind. The helper\nnow takes an admin argument, defaulting to True so the identity\ncredentials panel is unchanged, and the disable form passes admin\u003dFalse\nsince the user is deleting a credential of their own.\n\nThe four separate pieces of configuration this panel needs are now\ndocumented together under OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED in the\nconfiguration guide, including two that were missing here: totp has to\nbe listed in the keystone [auth] methods option, and the policy rules\nabove have to be mirrored in Horizon\u0027s own copy of the keystone policy\nfile, since Horizon evaluates that local copy to decide whether to show\nthe panel rather than asking keystone.\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\nSigned-off-by: Kevin Allioli \u003ckevin@stackops.ch\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/557b48a0fdd2754338a09f71e3fb79647ee7bbba"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/557b48a0fdd2754338a09f71e3fb79647ee7bbba"}]},"branch":"refs/heads/master"},"4ab662ecf37ea7969736d404e6a8132fe83d9339":{"kind":"REWORK","_number":31,"created":"2026-10-02 21:59:57.000000000","uploader":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"ref":"refs/changes/39/977939/31","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/31","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/31 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/31 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/31 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/31"}}},"commit":{"parents":[{"commit":"f92afbc4fa55c1cbdad2caffe11610b6732c728a","subject":"Merge \"Update jobs according to tested runtimes for 2027.1\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/f92afbc4fa55c1cbdad2caffe11610b6732c728a"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"Kevin Allioli","email":"kevin@stackops.ch","date":"2026-10-02 21:59:42.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nDisabling MFA and deleting the credential went through\napi.keystone.credential_delete, which forced the admin client. That\nclient raises NotAuthorized inside Horizon, before keystone is asked,\nwhenever the request does not satisfy admin_required, so a member user\nsaw MFA turn off while the TOTP credential stayed behind. The helper\nnow takes an admin argument, defaulting to True so the identity\ncredentials panel is unchanged, and the disable form passes admin\u003dFalse\nsince the user is deleting a credential of their own.\n\nThe four separate pieces of configuration this panel needs are now\ndocumented together under OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED in the\nconfiguration guide, including two that were missing here: totp has to\nbe listed in the keystone [auth] methods option, and the policy rules\nabove have to be mirrored in Horizon\u0027s own copy of the keystone policy\nfile, since Horizon evaluates that local copy to decide whether to show\nthe panel rather than asking keystone.\n\nThe panel registered itself unconditionally, so\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED governed nothing: the panel was\nvisible whether it was True, False or absent. can_register() is only\nconsulted on the ADD_PANEL path of an enabled file, which this change\nalready provides in _5010_settings_mfa.py, but the module-level\nSettings.register(MFAPanel) and the \u0027mfa\u0027 slug in Settings.panels both\nregistered the panel again and bypassed the check. Both are removed, and\na test asserts the slug is not in the static tuple so the setting cannot\nquietly stop working again.\n\nEnabling MFA then made the login loop. openstack_auth ships\nplugin/totp.py and the TimeBasedOneTimePassword form, but TotpPlugin was\nnever in AUTHENTICATION_PLUGINS, so nothing could handle the passcode\nstep: keystone answered the password step with 401 and a receipt,\nhorizon found no plugin for the receipt plus passcode pair, logged \"No\nauthentication backend could be determined\" and returned to the login\nform. The plugin is now in the default list. It returns None unless\nauth_url, username, passcode, user_domain_name and receipt are all\npresent, so it stays inert where MFA is never enabled.\n\nA member could disable MFA through the API but not through the UI: the\nDelete and Edit actions of the credentials table were hidden from the\nvery user who owns the credential. Their policy_rules reference\nuser_id:%(target.credential.user_id)s, while get_policy_target()\nreturned the empty default, so only rule:admin_required could ever\nmatch. Both actions now name the owner in their target.\n\nOf the six policy rules above, only identity:update_user actually needs\nan override in a default deployment; the other five already admit the\nowner. The configuration guide now says so, and warns that keystone has\nno recovery or backup codes for TOTP: a user who loses their\nauthenticator is locked out until an administrator clears\nmulti_factor_auth_enabled on the account.\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nCo-Authored-By: Kevin Allioli \u003ckevin@stackops.ch\u003e\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\nSigned-off-by: Kevin Allioli \u003ckevin@stackops.ch\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/4ab662ecf37ea7969736d404e6a8132fe83d9339"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/4ab662ecf37ea7969736d404e6a8132fe83d9339"}]},"branch":"refs/heads/master"},"4021a36693af05a03bc7b690ffb83f4eabb50225":{"kind":"REWORK","_number":32,"created":"2026-10-10 12:08:12.000000000","uploader":{"_account_id":36082,"name":"Kevin Allioli","display_name":"Kevin Allioli","email":"kevin@stackops.ch","username":"kallioli"},"ref":"refs/changes/39/977939/32","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/horizon","ref":"refs/changes/39/977939/32","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/32 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/32 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/horizon refs/changes/39/977939/32 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/horizon refs/changes/39/977939/32"}}},"commit":{"parents":[{"commit":"f92afbc4fa55c1cbdad2caffe11610b6732c728a","subject":"Merge \"Update jobs according to tested runtimes for 2027.1\"","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/f92afbc4fa55c1cbdad2caffe11610b6732c728a"}]}],"author":{"name":"blasseye","email":"blasseye@ikmail.com","date":"2026-02-26 13:08:10.000000000","tz":60},"committer":{"name":"Kevin Allioli","email":"kevin@stackops.ch","date":"2026-10-09 20:00:39.000000000","tz":120},"subject":"Add Horizon panel to enable TOTP MFA enrollment","message":"Add Horizon panel to enable TOTP MFA enrollment\n\nCurrently, Multi-Factor Authentication (MFA) must be enabled\noutside Horizon (CLI, API, or external identity workflows).\nHorizon users do not have a native interface to enroll MFA\ncredentials such as TOTP.\n\nThis creates a usability gap for users primarily interacting\nthrough the web dashboard, resulting in additional operational\nsteps, reduced MFA adoption, and inconsistent user experience\nbetween CLI/API and Horizon workflows.\n\nThis patch introduces a dedicated Horizon panel allowing users\nto enable MFA directly from the dashboard.\n\nThe new panel mfa with the workflow:\n- Security Notice\n- Authenticator configuration (with TOTP credential choice)\n- Code verification\n\nThe new setting:\n- OPENSTACK_TOTP_QRCODE_ISSUER : Custom QRCODE issuer.\n\nThis improves security adoption while providing a consistent\nself-service experience within Horizon.\n\nTo activated :\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED \u003d True\nThe user has the following Keystone policy rights  for themselves:\n    ``identity:list_credentials``,\n    ``identity:get_credential``,\n    ``identity:create_credential``,\n    ``identity:delete_credential``,\n    ``identity:get_user``,\n    ``identity:update_user``\nexample policy:\nidentity:create_credential: \"rule:admin_required or user_id:%(credential.user_id)s\"\nidentity:get_credential:    \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:list_credentials:  \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:delete_credential: \"rule:admin_required or user_id:%(target.credential.user_id)s\"\nidentity:update_user:       \"rule:admin_required or user_id:%(target.user.id)s\"\nidentity:get_user:          \"rule:admin_required or user_id:%(target.user.id)s\"\n\nDisabling MFA and deleting the credential went through\napi.keystone.credential_delete, which forced the admin client. That\nclient raises NotAuthorized inside Horizon, before keystone is asked,\nwhenever the request does not satisfy admin_required, so a member user\nsaw MFA turn off while the TOTP credential stayed behind. The helper\nnow takes an admin argument, defaulting to True so the identity\ncredentials panel is unchanged, and the disable form passes admin\u003dFalse\nsince the user is deleting a credential of their own.\n\nThe four separate pieces of configuration this panel needs are now\ndocumented together under OPENSTACK_KEYSTONE_MFA_TOTP_ENABLED in the\nconfiguration guide, including two that were missing here: totp has to\nbe listed in the keystone [auth] methods option, and the policy rules\nabove have to be mirrored in Horizon\u0027s own copy of the keystone policy\nfile, since Horizon evaluates that local copy to decide whether to show\nthe panel rather than asking keystone.\n\nThe panel registered itself unconditionally, so\nOPENSTACK_KEYSTONE_MFA_TOTP_ENABLED governed nothing: the panel was\nvisible whether it was True, False or absent. can_register() is only\nconsulted on the ADD_PANEL path of an enabled file, which this change\nalready provides in _5010_settings_mfa.py, but the module-level\nSettings.register(MFAPanel) and the \u0027mfa\u0027 slug in Settings.panels both\nregistered the panel again and bypassed the check. Both are removed, and\na test asserts the slug is not in the static tuple so the setting cannot\nquietly stop working again.\n\nEnabling MFA then made the login loop. openstack_auth ships\nplugin/totp.py and the TimeBasedOneTimePassword form, but TotpPlugin was\nnever in AUTHENTICATION_PLUGINS, so nothing could handle the passcode\nstep: keystone answered the password step with 401 and a receipt,\nhorizon found no plugin for the receipt plus passcode pair, logged \"No\nauthentication backend could be determined\" and returned to the login\nform. The plugin is now in the default list. It returns None unless\nauth_url, username, passcode, user_domain_name and receipt are all\npresent, so it stays inert where MFA is never enabled.\n\nA member could disable MFA through the API but not through the UI: the\nDelete and Edit actions of the credentials table were hidden from the\nvery user who owns the credential. Their policy_rules reference\nuser_id:%(target.credential.user_id)s, while get_policy_target()\nreturned the empty default, so only rule:admin_required could ever\nmatch. Both actions now name the owner in their target.\n\nOf the six policy rules above, only identity:update_user actually needs\nan override in a default deployment; the other five already admit the\nowner. The configuration guide now says so, and warns that keystone has\nno recovery or backup codes for TOTP: a user who loses their\nauthenticator is locked out until an administrator clears\nmulti_factor_auth_enabled on the account.\n\nRemoving the static registration moved the panel onto the ADD_PANEL\npath, which appends it to Dashboard.panels after get_panel_groups() has\nalready built the panel groups, so horizon swept the panel into the\nleftover group it labels Other, on its own. PANEL_GROUP in the enabled\nfile is the mechanism horizon provides for this, so the panel now sits\nwith the other Settings panels again, and can_register() still removes\nit when the setting is off.\n\nCloses-Bug: #2142657\nBlueprint: #enabling-mfa-dashboard\nChange-Id: Icb8d65521dce07118eef3a7c76d221d51f3ff17b\nCo-Authored-By: Kevin Allioli \u003ckevin@stackops.ch\u003e\nSigned-off-by: blasseye \u003cblasseye@ikmail.com\u003e\nSigned-off-by: Kevin Allioli \u003ckevin@stackops.ch\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/4021a36693af05a03bc7b690ffb83f4eabb50225"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/horizon/commit/4021a36693af05a03bc7b690ffb83f4eabb50225"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~DefaultSubmitRule","status":"OK","labels":[{"label":"Verified","status":"MAY","applied_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"MAY"},{"label":"Workflow","status":"MAY"},{"label":"Review-Priority","status":"MAY"}]}],"submit_requirements":[{"name":"Verified","description":"Verified in gate by CI","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Verified\u003dMAX AND -label:Verified\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Verified\u003dMAX","label:Verified\u003dMIN"],"atom_explanations":{"label:Verified\u003dMAX":"","label:Verified\u003dMIN":""}}},{"name":"Code-Review","description":"Code reviewed by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Code-Review\u003dMAX AND -label:Code-Review\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Code-Review\u003dMAX","label:Code-Review\u003dMIN"],"atom_explanations":{"label:Code-Review\u003dMAX":"","label:Code-Review\u003dMIN":""}}},{"name":"Review-Priority","description":"Review priority","status":"SATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"-label:Review-Priority\u003dMIN","fulfilled":true,"status":"PASS","passing_atoms":[],"failing_atoms":["label:Review-Priority\u003dMIN"],"atom_explanations":{"label:Review-Priority\u003dMIN":""}}},{"name":"Workflow","description":"Approved for gate by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Workflow\u003dMAX AND -label:Workflow\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Workflow\u003dMAX","label:Workflow\u003dMIN"],"atom_explanations":{"label:Workflow\u003dMAX":"","label:Workflow\u003dMIN":""}}}]}
