)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"14e410afbe83dc853333a016c72386edcdab98bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4366c08a_1059bf8e","updated":"2025-11-27 18:43:43.000000000","message":"Good stuff. In the past, I had to do something similar for a downstream driver and ended up just overriding [put_container](https://opendev.org/openstack/cinder/src/commit/ab30d6e58ad054f6aca1138b28ac216ef5449879/cinder/backup/chunkeddriver.py#L175). This templating approach looks much cleaner, though. It might be worth mentioning this in the release notes.","commit_id":"c4c3e9ad519abf4b1a7c04034764449e799d6b46"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"11f13ae7a27223e46d4d1a3b769d25bfe85a7143","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"eda1b36d_c0c147c2","in_reply_to":"4366c08a_1059bf8e","updated":"2025-12-10 13:01:37.000000000","message":"Yes, release note, great point","commit_id":"c4c3e9ad519abf4b1a7c04034764449e799d6b46"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"716846cc18699559cbc9ead75efbd82f7decda26","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1d3cd3e5_8a1ccbd5","updated":"2025-12-17 15:52:29.000000000","message":"I haven\u0027t reviewed the entire thing, but did notice a problem in the help text for the new option.","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"},{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"a013d99402e30119493012d25e158afaccb83713","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e94d7a7a_60ebd68b","updated":"2025-12-11 13:44:45.000000000","message":"Thanks for adding the release note! Overall, I\u0027m pretty happy with this change. There\u0027s just one small typo. Regardless, +1.","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"9f987d60dacc7d018ed0d5976fa628696a922808","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"420967e2_3ce0b354","updated":"2025-12-10 16:16:53.000000000","message":"recheck - single tempest test failed likely intermittently","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"32ac4b667320b93830034d58b9f73a5d02a3e769","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"67ccf1ba_6bc9b8c5","updated":"2026-05-31 12:00:57.000000000","message":"recheck","commit_id":"348410500abeaab5458d97e30a168c6bf0fbfc0d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"29bc967f78a03a8ca87f20fa96c72539924b8465","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"4b58f226_3e7805f0","updated":"2026-10-02 15:51:57.000000000","message":"Small point noted inline about the help text.  Waiting until after you\u0027ve sorted out Jayaanand\u0027s concerns to complete my review.","commit_id":"a15de481752179d738412d78d48db76b0435f6be"}],"cinder/backup/chunkeddriver.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"716846cc18699559cbc9ead75efbd82f7decda26","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                    \"Resulting container name will not be exposed to end  \""},{"line_number":72,"context_line":"                    \"users through API. \""},{"line_number":73,"context_line":"                    \"Following variables can be used for templating: \""},{"line_number":74,"context_line":"                    \"backup_container_name_template, backup_id, project_id, \""},{"line_number":75,"context_line":"                    \"user_id, volume_id and az. \""},{"line_number":76,"context_line":"                    \"backup_container_name_template is required to be \""},{"line_number":77,"context_line":"                    \"present in the template.\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"c65fb2c9_ce5cf95c","line":74,"range":{"start_line":74,"start_character":21,"end_line":74,"end_character":51},"updated":"2025-12-17 15:52:29.000000000","message":"I think you mean \u0027backup_default_container\u0027 here (and line 76)?","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"a7ae8fc5734710cd7016b1a08c53e1c37197425f","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                    \"Resulting container name will not be exposed to end  \""},{"line_number":72,"context_line":"                    \"users through API. \""},{"line_number":73,"context_line":"                    \"Following variables can be used for templating: \""},{"line_number":74,"context_line":"                    \"backup_container_name_template, backup_id, project_id, \""},{"line_number":75,"context_line":"                    \"user_id, volume_id and az. \""},{"line_number":76,"context_line":"                    \"backup_container_name_template is required to be \""},{"line_number":77,"context_line":"                    \"present in the template.\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"4ab698f8_83aec809","line":74,"range":{"start_line":74,"start_character":21,"end_line":74,"end_character":51},"in_reply_to":"c65fb2c9_ce5cf95c","updated":"2025-12-18 08:47:13.000000000","message":"Done","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"29bc967f78a03a8ca87f20fa96c72539924b8465","unresolved":true,"context_lines":[{"line_number":69,"context_line":"                    \"user_id, volume_id and az. \""},{"line_number":70,"context_line":"                    \"backup_default_container is required to be \""},{"line_number":71,"context_line":"                    \"present in the template. \""},{"line_number":72,"context_line":"                    \"If the value is changed during runtime, it is operator \""},{"line_number":73,"context_line":"                    \"responsibility to rename already existing containers on \""},{"line_number":74,"context_line":"                    \"the storage to match the new template, otherwise already \""},{"line_number":75,"context_line":"                    \"existing backups won\u0027t be restored.\"),"},{"line_number":76,"context_line":"    cfg.BoolOpt(\u0027backup_create_containers\u0027,"},{"line_number":77,"context_line":"                default\u003dTrue,"},{"line_number":78,"context_line":"                help\u003d\"Attempt to create new container for supported drivers, \""}],"source_content_type":"text/x-python","patch_set":12,"id":"0391eb6c_f5fd7115","line":75,"range":{"start_line":72,"start_character":20,"end_line":75,"end_character":57},"updated":"2026-10-02 15:51:57.000000000","message":"Two things here:\n1. \"changed during runtime\" could be misleading; I suggest something like \"changed after it has been used during backup creation\".\n2. This is an important point; I think it would be a good idea to add it to the release note.","commit_id":"a15de481752179d738412d78d48db76b0435f6be"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"bf5bc03f9a73084ec5b57aab15b396d0b4081d11","unresolved":true,"context_lines":[{"line_number":843,"context_line":""},{"line_number":844,"context_line":"            volume_meta \u003d metadata.get(\u0027volume_meta\u0027, None)"},{"line_number":845,"context_line":"            try:"},{"line_number":846,"context_line":"                if volume_meta:"},{"line_number":847,"context_line":"                    self.put_metadata(volume_id, volume_meta)"},{"line_number":848,"context_line":"                else:"},{"line_number":849,"context_line":"                    LOG.debug(\"No volume metadata in this backup.\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"097c61fc_20204961","line":846,"updated":"2026-10-02 15:09:58.000000000","message":"container was resolved from the backup the user asked to restore (line 799). This call passes that same string into _read_metadata for every parent. _read_metadata uses the argument whenever it is non-empty (line 357), so the parent metadata object is opened in the child\u0027s container. _restore_v1 then resolves its own backup argument (line 720) and lists objects there. Metadata and object data are no longer in the same container, and the parent\u0027s metadata object is not in the child\u0027s container, so the restore fails.\n\nA full backup is a one-element list, so backup1 is the same backup and this path stays consistent. Incremental create is also consistent: line 574 calls _read_sha256file(parent_backup), which resolves the parent.\n\nIt fails when members of the chain render different names:\n\nex: NFS through PosixBackupDriver. If the request omits container, update_container_name stores id[0:2]/id[2:4]/id (posix.py lines 99–103). Parent and child are different directories even with the default template %(backup_default_container)s. A user-supplied container that is the same on both backups is unaffected.\nAny template that includes backup_id. user_id does the same when the parent was created by another user. project_id and volume_id are shared by the chain and do not cause this.\nSwift, S3, or GCS when the incremental request\u0027s container differs from the parent\u0027s. backup/api.py stores the request value and does not copy the parent\u0027s container.\nPlease call self._read_metadata(backup1) and let it resolve backup1. Please add a ChunkedBackupDriver test with a parent and child that have different container values and a template that includes backup_id, and assert the parent metadata read uses the parent\u0027s rendered name. The new Swift, S3, and GCS tests call _read_metadata and delete_backup on one backup, and the existing incremental unit test mocks _read_metadata, so none of them cover this loop.","commit_id":"a15de481752179d738412d78d48db76b0435f6be"}],"releasenotes/notes/backup_container_name_template-38aa1799ecf1e34a.yaml":[{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"a013d99402e30119493012d25e158afaccb83713","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a configuration parameter ``backup_container_name_template``"},{"line_number":5,"context_line":"    which allows operators to configure a backup container naming convetion"},{"line_number":6,"context_line":"    by using variables like project_id, user_id, etc."},{"line_number":7,"context_line":"    Templating will be applied to both default and user-supplied container"},{"line_number":8,"context_line":"    name, but resulting container name is not exposed to the end-users, it"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dc1d64c8_197fab4e","line":5,"range":{"start_line":5,"start_character":66,"end_line":5,"end_character":75},"updated":"2025-12-11 13:44:45.000000000","message":"nit: typo convention","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"a7ae8fc5734710cd7016b1a08c53e1c37197425f","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a configuration parameter ``backup_container_name_template``"},{"line_number":5,"context_line":"    which allows operators to configure a backup container naming convetion"},{"line_number":6,"context_line":"    by using variables like project_id, user_id, etc."},{"line_number":7,"context_line":"    Templating will be applied to both default and user-supplied container"},{"line_number":8,"context_line":"    name, but resulting container name is not exposed to the end-users, it"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"db7a7608_a7aea758","line":5,"range":{"start_line":5,"start_character":66,"end_line":5,"end_character":75},"in_reply_to":"dc1d64c8_197fab4e","updated":"2025-12-18 08:47:13.000000000","message":"Done","commit_id":"91f9f67e26fc3f3b97dc87da2829224db20c07d1"}]}
