)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"8d20455458b8453f394534fe3daee99692c9eb6e","unresolved":true,"context_lines":[{"line_number":25,"context_line":"Add unit tests for ``_get_user_keystone_session`` and"},{"line_number":26,"context_line":"``_get_service_client``"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #2011763"},{"line_number":29,"context_line":"Story: 2011763"},{"line_number":30,"context_line":"Task: 54182"},{"line_number":31,"context_line":"Change-Id: I9c5fdb4a66e34d74151e5ce13395cb1e08d4d862"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bb46b249_d4a34d84","line":28,"updated":"2026-04-21 12:32:14.000000000","message":"Please remove this line, for storyboard not need.","commit_id":"3f971302165b2ef07f43379bbe27b7d27d0665ba"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"8764437a3ab26dbf6ec23c71c565d8be62b9ff6e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Add unit tests for ``_get_user_keystone_session`` and"},{"line_number":26,"context_line":"``_get_service_client``"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #2011763"},{"line_number":29,"context_line":"Story: 2011763"},{"line_number":30,"context_line":"Task: 54182"},{"line_number":31,"context_line":"Change-Id: I9c5fdb4a66e34d74151e5ce13395cb1e08d4d862"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"f09edcc3_e35b0392","line":28,"in_reply_to":"bb46b249_d4a34d84","updated":"2026-04-21 12:39:42.000000000","message":"Done","commit_id":"3f971302165b2ef07f43379bbe27b7d27d0665ba"},{"author":{"_account_id":39035,"name":"Kostiantyn Velychkovskyi","display_name":"K Velychkovskyi","email":"k.velychkovskyi@cloudfarm.tech","username":"velychkovsky","status":"CloudFarm Co-Founder / CTO"},"change_message_id":"8f9188a139656aec1efdaa7ef6de8e7e34da0ddd","unresolved":false,"context_lines":[{"line_number":25,"context_line":"Add unit tests for ``_get_user_keystone_session`` and"},{"line_number":26,"context_line":"``_get_service_client``"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #2011763"},{"line_number":29,"context_line":"Story: 2011763"},{"line_number":30,"context_line":"Task: 54182"},{"line_number":31,"context_line":"Change-Id: I9c5fdb4a66e34d74151e5ce13395cb1e08d4d862"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"972f2250_5993e655","line":28,"in_reply_to":"bb46b249_d4a34d84","updated":"2026-04-21 12:49:53.000000000","message":"Done, thank you","commit_id":"3f971302165b2ef07f43379bbe27b7d27d0665ba"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"ee209b39aae0dfe09d1dee3be7ab9001fd626853","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4b51222a_f6d00e0c","updated":"2026-04-19 09:10:59.000000000","message":"Please, make adjustments to tests to ensure the use case you are talking about is covered there.\n\nBut also I have a question in general - why are also passing the project id to backups. I assume it could be valid for some out of tree backbends, but then for swift it doesn\u0027t look like needed","commit_id":"3e447b5ba1b71f88587f6d03c860029599773005"},{"author":{"_account_id":39035,"name":"Kostiantyn Velychkovskyi","display_name":"K Velychkovskyi","email":"k.velychkovskyi@cloudfarm.tech","username":"velychkovsky","status":"CloudFarm Co-Founder / CTO"},"change_message_id":"8f9188a139656aec1efdaa7ef6de8e7e34da0ddd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3fdc7a1e_3c21716d","in_reply_to":"4b51222a_f6d00e0c","updated":"2026-04-21 12:49:53.000000000","message":"The tests were done. \nAbout passing project id to backups,  you right, it become pointless once the rescope is gone. It\u0027s referenced at https://opendev.org/openstack/trove/src/branch/master/trove/guestagent/datastore/service.py#L509 (and in two other datastores), but after fix 985262, there are no consumers inside backup/. I\u0027ll remove the option and retest end-to-end.","commit_id":"3e447b5ba1b71f88587f6d03c860029599773005"},{"author":{"_account_id":39035,"name":"Kostiantyn Velychkovskyi","display_name":"K Velychkovskyi","email":"k.velychkovskyi@cloudfarm.tech","username":"velychkovsky","status":"CloudFarm Co-Founder / CTO"},"change_message_id":"dfbbfcafd7b3b2bd2c58a33d2a62f43691b8cd1c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"971e40b4_de5447dc","updated":"2026-04-19 09:21:41.000000000","message":"You\u0027re right, \"_get_service_client\" is a private helper, and the only caller is SwiftStorage in the same module, so dropping the unused tenant_id parameter is safe. Pushed as a new patch set.","commit_id":"430e0481a4989fcf14f0659e7223011b3d09a024"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"86bc4c407f1da0e7db80e3d92bb760aee8844225","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9a3efbb0_89b1d89c","updated":"2026-04-21 14:45:58.000000000","message":"@wchy1001@gmail.com Hello, please look it.","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"mangust404@gmail.com","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"b71e1ff447d965c8e75c8e43149140edaeab2f24","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"522733ca_4aad22a1","updated":"2026-04-24 11:42:05.000000000","message":"Hello guys. I wanted to answer to this before, but we got an emergency in our production trove setup.\n\nLooks like that nobody noticed that this patch breaks swift backups:\n```\ntrove-tempest-ubuntu-backup-mysql8.4 https://zuul.opendev.org/t/openstack/build/26712eabdf4e4d9cb98311e5249757b5 : FAILURE in 1h 22m 30s (non-voting)\ntrove-tempest-ubuntu-backup-mariadb11.4 https://zuul.opendev.org/t/openstack/build/483f55e1c21e4ce1a83ded8e3347d278 : FAILURE in 1h 58m 34s (non-voting)\ntrove-tempest-ubuntu-backup-postgresql17 https://zuul.opendev.org/t/openstack/build/329a7f48ae9c4eccae9a22b599af6837 : FAILURE in 58m 25s (non-voting)\n```\n\nThe error is the same for all database managers:\n\n```\nraise exceptions.EmptyCatalog(\u0027The service catalog is empty.\u0027)\\n\",\"stream\":\"stdout\",\"time\":\"2026-04-21T13:56:43.326163211Z\"}\n{\"log\":\"2026-04-21 13:56:43.179 7 ERROR __main__ keystoneauth1.exceptions.catalog.EmptyCatalog: The service catalog is empty.\\n\",\"stream\":\"stdout\",\"time\":\"2026-04-21T13:56:43.326253323Z\"}\n{\"log\":\"2026-04-21 13:56:43.179 7 ERROR __main__ \\n\",\"stream\":\"stdout\",\"time\":\"2026-04-21T13:56:43.326344734Z\"}\n```\n\nAnd all signs point to that it was induced by removing tenant ID from swift client creation helper.\n\nAlso it looks like currently not all tests are being run. There are no base tests, no replication tests, only failed non-voting backups tests are present.\n\nProbably we should revert this patch for further investigation?","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"48534b1252c48f6e9c74a6f89ebe3cff7daa415a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7defbad4_6fd77acf","updated":"2026-04-23 02:16:58.000000000","message":"Hello, thanks for the review, Approved!","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"mangust404@gmail.com","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"0611f8c8cb652a44c984c659b085ba67f712d9dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ed8c3683_26bf27de","in_reply_to":"522733ca_4aad22a1","updated":"2026-04-24 12:33:32.000000000","message":"Yes, I can confirm this bug in my local DevStack setup:\n\n(from db_backup container)\n```\nFailed to call stream_backup_to_storage, error: The service catalog is empty.: keystoneauth1.exceptions.catalog.EmptyCatalog: The service catalog is empty.\n```\n\nObviously, we need to do more work here.\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\n\nAlso, I am planning to refactor Swift backups and Swift logs handling so that we can completely remove Trove service account credentials from trove-guestagent.conf.\n\nTo achieve this, we need to generate a limited-scope token for accessing Swift in the Trove taskmanager and pass that token to the guestagent.\n\nThe issue is that, currently, Trove service account credentials must be stored in trove-guestagent.conf. This creates a security risk, as they could be compromised in the event of a container breakout attack.\n\nAny help with this task would be greatly appreciated.","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"02efa1885f276c17e5453c4af58cb55aea6894ce","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"cb764ebd_1858ec18","in_reply_to":"66261158_64ffffac","updated":"2026-04-27 01:09:58.000000000","message":"Hi, Eric, you are right. the CI didn\u0027t pass and i missed the status. the complete log is in our CI: https://zuul.opendev.org/t/openstack/build/26712eabdf4e4d9cb98311e5249757b5/log/controller/logs/guest-agent-logs/c394a2d6-a844-457a-8d5a-7745702e81fc/containers/cf8e9f5fa44d1f43b21d365e8f5ba56d6b7caa4ade0ee5ac86618e199f170691/cf8e9f5fa44d1f43b21d365e8f5ba56d6b7caa4ade0ee5ac86618e199f170691-json_log.txt","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"mangust404@gmail.com","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"fc695e33bad9f23da621912832a238412f609591","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"66261158_64ffffac","in_reply_to":"a8e277a7_a0f7caf6","updated":"2026-04-25 12:23:33.000000000","message":"Currently, there are two types of backups (storage strategies) in Trove: Swift backups and Cinder backups (full volume block device backups). Please first confirm which type of backups you are using in production and which ones are failing.\n\nThe storage strategy is controlled by `CONF.storage_strategy` and `CONF.replica_snapshot_driver`, and it can also be overridden during backup creation.\n\nCinder backups work differently: you do not need to build or configure backup image paths, because Cinder handles the entire process. Trove only needs to properly prepare the running database (e.g., pg_start_backup() and fsfreeze).\n\nFor Swift backups, however, you must build backup images and specify them in `trove-guestagent.conf`. When a backup is executed, Trove starts a db_backup Docker container alongside the main database container, performs the backup (using pg_basebackup for PostgreSQL or xtrabackup for MySQL), uploads the result to Swift, and returns the Swift URL to the taskmanager.\n\nWith the patchset you provided, there are errors affecting Swift backups.\n\nHere is a log from a Tempest test run (PostgreSQL 17 backup Zuul job):\nhttps://zuul.opendev.org/t/openstack/build/329a7f48ae9c4eccae9a22b599af6837/log/controller/logs/guest-agent-logs/e60f15b8-9b88-4999-b3ee-c268de05e504/containers/7cdbb9d56a736d3ed0a30d1f0bd27698fdf6cd59f95a647bf33a10b49792b319/7cdbb9d56a736d3ed0a30d1f0bd27698fdf6cd59f95a647bf33a10b49792b319-json_log.txt\n\nI am observing the same error in my local DevStack environment.\n\nTo collect logs from your production instances for Swift backups, follow these steps:\n1. Create a database instance\n2. Log into the compute instance (e.g., `ssh ubuntu@\u003cmanagement network instance IP address\u003e`). You can find the IP address in the service project, for example: `openstack server list --project service`\n3. Run a backup using `openstack database backup create`\n4. At the same time, on the compute instance, run `docker logs db_backup` multiple times. This will show the exact error causing the backup to fail\n\nThe error you mentioned, \"Cannot parse backup output\", is a high-level error from the guest agent and is not very informative.\n\nI hope this helps. If you have any questions, feel free to ask. You can also contact me directly by email in English or Russian.","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"},{"author":{"_account_id":39035,"name":"Kostiantyn Velychkovskyi","display_name":"K Velychkovskyi","email":"k.velychkovskyi@cloudfarm.tech","username":"velychkovsky","status":"CloudFarm Co-Founder / CTO"},"change_message_id":"caa872a7e84314d9c9560b31f2c7b232bb47f208","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a8e277a7_a0f7caf6","in_reply_to":"ed8c3683_26bf27de","updated":"2026-04-25 07:45:09.000000000","message":"Looks interesting, as I tested this in production environment. I did backup with Application Credetinals and with user password. Tested MySQL, MariaDB and it run without error. \n\nAs I undestand the log you provided is the logs from tempest ?","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"}],"backup/storage/swift.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"ee209b39aae0dfe09d1dee3be7ab9001fd626853","unresolved":true,"context_lines":[{"line_number":39,"context_line":"    return session.Session(auth\u003dauth, verify\u003dFalse)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def _get_service_client(auth_url, token, tenant_id, region_name\u003dNone):"},{"line_number":43,"context_line":"    sess \u003d _get_user_keystone_session(auth_url, token, tenant_id)"},{"line_number":44,"context_line":"    os_options \u003d None"},{"line_number":45,"context_line":"    if region_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"336e73b6_88963b8f","side":"PARENT","line":42,"updated":"2026-04-19 09:10:59.000000000","message":"Why do we still pass tenant_id here?","commit_id":"7a2cb21e8b3035835ae1260c9c7e676191360562"},{"author":{"_account_id":39035,"name":"Kostiantyn Velychkovskyi","display_name":"K Velychkovskyi","email":"k.velychkovskyi@cloudfarm.tech","username":"velychkovsky","status":"CloudFarm Co-Founder / CTO"},"change_message_id":"dfbbfcafd7b3b2bd2c58a33d2a62f43691b8cd1c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    return session.Session(auth\u003dauth, verify\u003dFalse)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"def _get_service_client(auth_url, token, tenant_id, region_name\u003dNone):"},{"line_number":43,"context_line":"    sess \u003d _get_user_keystone_session(auth_url, token, tenant_id)"},{"line_number":44,"context_line":"    os_options \u003d None"},{"line_number":45,"context_line":"    if region_name:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ecc957de_fd8de7bc","side":"PARENT","line":42,"in_reply_to":"336e73b6_88963b8f","updated":"2026-04-19 09:21:41.000000000","message":"You\u0027re right, \"_get_service_client\" is a private helper, and the only caller is SwiftStorage in the same module, so dropping the unused tenant_id parameter is safe. Pushed as a new patch set.","commit_id":"7a2cb21e8b3035835ae1260c9c7e676191360562"}],"backup/tests/unittests/storage/test_swift.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"839cdc16df003fc1993cad3c7e5c94f8e95b6766","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                session\u003dsess, os_options\u003dNone, insecure\u003dTrue)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":105,"context_line":"    unittest.main()"}],"source_content_type":"text/x-python","patch_set":4,"id":"e1a05b1f_3a6d63ea","line":105,"range":{"start_line":104,"start_character":0,"end_line":105,"end_character":19},"updated":"2026-04-23 12:47:44.000000000","message":"you don\u0027t need that in general","commit_id":"a365950b48ba573cab3404e46e9e8d1ad5bdf698"}]}
