)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"7c090d0bfaf73bd793fac678532da4326ba38db1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c4b756de_f4c7b416","updated":"2026-04-24 09:21:58.000000000","message":"Added some comments.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b50a4cec_b5e1d562","updated":"2026-04-23 16:16:14.000000000","message":"Some thoughts and comments","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"33d49f58_e3303df5","updated":"2026-04-29 19:48:48.000000000","message":"Thanks everyone, please find the replies inline.","commit_id":"b2db8a4ab25aed86982b4e295b3a0696a27b49cf"}],"specs/2026.2/replication-v3.rst":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"5ae2703eb691e55263b44e92836500b90378daac","unresolved":true,"context_lines":[{"line_number":19,"context_line":"The need for a replication v3 effort emerges due to the following limitations:"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"1. **Limited Granularity**: The existing replication implementation"},{"line_number":22,"context_line":"    (v1, v2.1/Cheesecake, and Tiramisu) supports DR functionality at the"},{"line_number":23,"context_line":"    backend level and group level but certain vendors support more granularity"},{"line_number":24,"context_line":"    levels to which Cinder is currently not aware."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ef85a153_efcc9e45","line":22,"updated":"2026-04-23 16:33:13.000000000","message":"there\u0027s an extra space at the start of lines 22-24.  Sphinx interprets that as an indentation, and is turning this into a description list.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":19,"context_line":"The need for a replication v3 effort emerges due to the following limitations:"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"1. **Limited Granularity**: The existing replication implementation"},{"line_number":22,"context_line":"    (v1, v2.1/Cheesecake, and Tiramisu) supports DR functionality at the"},{"line_number":23,"context_line":"    backend level and group level but certain vendors support more granularity"},{"line_number":24,"context_line":"    levels to which Cinder is currently not aware."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9f5f69aa_08f098c8","line":22,"in_reply_to":"ef85a153_efcc9e45","updated":"2026-04-29 19:48:48.000000000","message":"Thanks Brian! fixed for all bullet points.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":27,"context_line":"    primary and secondary backend reside in the same OpenStack cluster which"},{"line_number":28,"context_line":"    is not True for some planned maintenance activities."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"3. **Sync vs Async mode**: There is no distinction on the Cinder side for"},{"line_number":31,"context_line":"    sync vs async replication and the vendor driver manages all of the"},{"line_number":32,"context_line":"    details regarding the mode of replication."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Additional (Optional) Scenarios:"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"28253fdf_a4862fd1","line":32,"range":{"start_line":30,"start_character":27,"end_line":32,"end_character":46},"updated":"2026-04-23 16:16:14.000000000","message":"What does \"distinction on the Cinder side\" actually means in practice — does Cinder enforce anything, or is it purely metadata?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":true,"context_lines":[{"line_number":27,"context_line":"    primary and secondary backend reside in the same OpenStack cluster which"},{"line_number":28,"context_line":"    is not True for some planned maintenance activities."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"3. **Sync vs Async mode**: There is no distinction on the Cinder side for"},{"line_number":31,"context_line":"    sync vs async replication and the vendor driver manages all of the"},{"line_number":32,"context_line":"    details regarding the mode of replication."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Additional (Optional) Scenarios:"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"139f84a4_ea9bef8e","line":32,"range":{"start_line":30,"start_character":27,"end_line":32,"end_character":46},"in_reply_to":"28253fdf_a4862fd1","updated":"2026-04-29 19:48:48.000000000","message":"This means that Cinder (currently) is not aware if the backend driver supports sync or async workflow and if we want to make any distinction based on it, we can\u0027t today","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":44,"context_line":"* As an operator, I want to failover at a more granular level to support"},{"line_number":45,"context_line":"  moving specific volumes belonging to a critical workload."},{"line_number":46,"context_line":"* As an operator, I want to be able to differentiate between synchronous"},{"line_number":47,"context_line":"  and asynchronous replication so as to determine the expected RTO and RPO."},{"line_number":48,"context_line":"* As an operator, I want the ability to failover workloads across OpenStack"},{"line_number":49,"context_line":"  deployments."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"808c22db_012ecdfd","line":47,"range":{"start_line":47,"start_character":40,"end_line":47,"end_character":74},"updated":"2026-04-23 16:16:14.000000000","message":"if this is a goal, then the API responses should expose these or there should be a note explaining they\u0027re out of scope for v3","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"7c090d0bfaf73bd793fac678532da4326ba38db1","unresolved":true,"context_lines":[{"line_number":44,"context_line":"* As an operator, I want to failover at a more granular level to support"},{"line_number":45,"context_line":"  moving specific volumes belonging to a critical workload."},{"line_number":46,"context_line":"* As an operator, I want to be able to differentiate between synchronous"},{"line_number":47,"context_line":"  and asynchronous replication so as to determine the expected RTO and RPO."},{"line_number":48,"context_line":"* As an operator, I want the ability to failover workloads across OpenStack"},{"line_number":49,"context_line":"  deployments."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"db631cb6_aeec3f4b","line":47,"range":{"start_line":47,"start_character":40,"end_line":47,"end_character":74},"in_reply_to":"808c22db_012ecdfd","updated":"2026-04-24 09:21:58.000000000","message":"RPOs and RTOs cannot be determined. They need to be configured while configuring replication. So are we saying that Cinder will now provide a way to configure RTO and RPO with replication? How does that translate to APIs and Driver compatibilities?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":44,"context_line":"* As an operator, I want to failover at a more granular level to support"},{"line_number":45,"context_line":"  moving specific volumes belonging to a critical workload."},{"line_number":46,"context_line":"* As an operator, I want to be able to differentiate between synchronous"},{"line_number":47,"context_line":"  and asynchronous replication so as to determine the expected RTO and RPO."},{"line_number":48,"context_line":"* As an operator, I want the ability to failover workloads across OpenStack"},{"line_number":49,"context_line":"  deployments."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b7dbb052_7616596b","line":47,"range":{"start_line":47,"start_character":40,"end_line":47,"end_character":74},"in_reply_to":"db631cb6_aeec3f4b","updated":"2026-04-29 19:48:48.000000000","message":"The intent here wasn\u0027t to determine the exact numbers for RPO and RTO rather the objective was that operators would be able to determine if there will be downtime (RTO) and data loss (RPO) in a DR scenario.\nAlso the sync vs async distinction helps cinder to make better decisions on the management path.\nRephrased it to describe it more clearly.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":59,"context_line":"   * ``group``: Group-level replication"},{"line_number":60,"context_line":"   * ``pool``: All volumes in a storage pool"},{"line_number":61,"context_line":"   * ``backend``: All volumes on a backend"},{"line_number":62,"context_line":"   * ``project``: All volumes belonging to a project"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"2. **Multi-OpenStack Replication**"},{"line_number":65,"context_line":"   * Support for native APIs to export and import replicated Volume before/after failover"}],"source_content_type":"text/x-rst","patch_set":1,"id":"cf6465a9_e2398e17","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":52},"updated":"2026-04-23 16:16:14.000000000","message":"What\u0027s the behavior when a project\u0027s volumes span backends with conflicting capabilities or different replication targets?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":59,"context_line":"   * ``group``: Group-level replication"},{"line_number":60,"context_line":"   * ``pool``: All volumes in a storage pool"},{"line_number":61,"context_line":"   * ``backend``: All volumes on a backend"},{"line_number":62,"context_line":"   * ``project``: All volumes belonging to a project"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"2. **Multi-OpenStack Replication**"},{"line_number":65,"context_line":"   * Support for native APIs to export and import replicated Volume before/after failover"}],"source_content_type":"text/x-rst","patch_set":1,"id":"25eebc8d_33945645","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":52},"in_reply_to":"ac1854e8_6c3732c8","updated":"2026-04-29 19:48:48.000000000","message":"The idea was added based on Simon\u0027s blogs regarding project Aegis[1] which relies on PG/Pod + volume types + default type per project but looks like it isn\u0027t a good candidate for the granularity here so will remove it.\n\n[1] http://theansibleguy.com/openstack-cinder-replication-and-disaster-recovery-pt-3/","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"7c090d0bfaf73bd793fac678532da4326ba38db1","unresolved":true,"context_lines":[{"line_number":59,"context_line":"   * ``group``: Group-level replication"},{"line_number":60,"context_line":"   * ``pool``: All volumes in a storage pool"},{"line_number":61,"context_line":"   * ``backend``: All volumes on a backend"},{"line_number":62,"context_line":"   * ``project``: All volumes belonging to a project"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"2. **Multi-OpenStack Replication**"},{"line_number":65,"context_line":"   * Support for native APIs to export and import replicated Volume before/after failover"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ac1854e8_6c3732c8","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":52},"in_reply_to":"cf6465a9_e2398e17","updated":"2026-04-24 09:21:58.000000000","message":"+1. A project can be using multiple backends or same backend to manage volumes. This cannot IMO span across backends and will become equivalent to backend level replication?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"9927e3ef0304d307f5cef514c78f6f296e704770","unresolved":true,"context_lines":[{"line_number":61,"context_line":"   * ``backend``: All volumes on a backend"},{"line_number":62,"context_line":"   * ``project``: All volumes belonging to a project"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"2. **Multi-OpenStack Replication**"},{"line_number":65,"context_line":"   * Support for native APIs to export and import replicated Volume before/after failover"},{"line_number":66,"context_line":"   * Driver interface to export volume metadata for cross-OpenStack import"},{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"}],"source_content_type":"text/x-rst","patch_set":1,"id":"b3a3f5c9_9eecbdd0","line":64,"updated":"2026-04-23 16:38:16.000000000","message":"need a blank line here before the list","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":61,"context_line":"   * ``backend``: All volumes on a backend"},{"line_number":62,"context_line":"   * ``project``: All volumes belonging to a project"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"2. **Multi-OpenStack Replication**"},{"line_number":65,"context_line":"   * Support for native APIs to export and import replicated Volume before/after failover"},{"line_number":66,"context_line":"   * Driver interface to export volume metadata for cross-OpenStack import"},{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e8ef0176_3ec445fe","line":64,"in_reply_to":"b3a3f5c9_9eecbdd0","updated":"2026-04-29 19:48:48.000000000","message":"Done","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"7c090d0bfaf73bd793fac678532da4326ba38db1","unresolved":true,"context_lines":[{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"3. **Replication Modes**"},{"line_number":70,"context_line":"   * New ``replication_mode`` extra-spec with values: ``sync``, ``async``"},{"line_number":71,"context_line":"   * Driver capability reporting for supported replication modes"},{"line_number":72,"context_line":"   * API responses include current replication mode"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"a2b3083f_4ee32722","line":70,"range":{"start_line":70,"start_character":66,"end_line":70,"end_character":71},"updated":"2026-04-24 09:21:58.000000000","message":"How are the RPO expectations going to be passed to drivers for async replication?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"7c090d0bfaf73bd793fac678532da4326ba38db1","unresolved":true,"context_lines":[{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"3. **Replication Modes**"},{"line_number":70,"context_line":"   * New ``replication_mode`` extra-spec with values: ``sync``, ``async``"},{"line_number":71,"context_line":"   * Driver capability reporting for supported replication modes"},{"line_number":72,"context_line":"   * API responses include current replication mode"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"0425f9d6_00fffb28","line":70,"range":{"start_line":70,"start_character":56,"end_line":70,"end_character":61},"updated":"2026-04-24 09:21:58.000000000","message":"Sync can be of multiple types. Active Active and Active Passive. Are we planning to support both via sync?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":true,"context_lines":[{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"3. **Replication Modes**"},{"line_number":70,"context_line":"   * New ``replication_mode`` extra-spec with values: ``sync``, ``async``"},{"line_number":71,"context_line":"   * Driver capability reporting for supported replication modes"},{"line_number":72,"context_line":"   * API responses include current replication mode"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"4a6c93a1_4d00a1c8","line":70,"range":{"start_line":70,"start_character":56,"end_line":70,"end_character":61},"in_reply_to":"0425f9d6_00fffb28","updated":"2026-04-29 19:48:48.000000000","message":"Depends on how many vendors support the different types and what is the recommended strategy for end users.\nI think A/A sync replication will generally be the preferred one here since it offers the best RTO and RPO numbers but correct me if my understanding is wrong.\nI want to make this simpler for Cinder otherwise we might end up with more cases for management path decisions.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"c063f6c5f7673e3ca93bef86e82f941ba0e7efdb","unresolved":true,"context_lines":[{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"3. **Replication Modes**"},{"line_number":70,"context_line":"   * New ``replication_mode`` extra-spec with values: ``sync``, ``async``"},{"line_number":71,"context_line":"   * Driver capability reporting for supported replication modes"},{"line_number":72,"context_line":"   * API responses include current replication mode"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3779cc45_233baae0","line":70,"range":{"start_line":70,"start_character":56,"end_line":70,"end_character":61},"in_reply_to":"4a6c93a1_4d00a1c8","updated":"2026-05-04 18:12:47.000000000","message":"A/A sync replications generally offer 0 RPO and near 0 RTO. The way A/A works can also be classified into symmetric (where the writes to both site are acknowledged before responding to the client) vs asymmetric (where the write to the secondary can be via a passive/proxy write from primary). In most of the A/A solutions, the failover would be automated on storage via a third party mediator. This helps with 0RPO and 0RTO as storage can immediately failover if there is a downtime discovered. Hence the classification of sync can be:\n\nsync (active/active) without mediator\nsync (active/passive) without mediator\nsync (active/active) with mediator\nsync (active/passive) with mediator.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":true,"context_lines":[{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"3. **Replication Modes**"},{"line_number":70,"context_line":"   * New ``replication_mode`` extra-spec with values: ``sync``, ``async``"},{"line_number":71,"context_line":"   * Driver capability reporting for supported replication modes"},{"line_number":72,"context_line":"   * API responses include current replication mode"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b4504fa1_62bf15c7","line":70,"range":{"start_line":70,"start_character":66,"end_line":70,"end_character":71},"in_reply_to":"a2b3083f_4ee32722","updated":"2026-04-29 19:48:48.000000000","message":"Previously I was thinking it as a capability that driver can report but I guess it doesn\u0027t add much value and dropped the idea. let me know if NetApp (or other vendors) think it will be useful","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"c063f6c5f7673e3ca93bef86e82f941ba0e7efdb","unresolved":true,"context_lines":[{"line_number":67,"context_line":"   * New API to import replicated volumes from external OpenStack clouds"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"3. **Replication Modes**"},{"line_number":70,"context_line":"   * New ``replication_mode`` extra-spec with values: ``sync``, ``async``"},{"line_number":71,"context_line":"   * Driver capability reporting for supported replication modes"},{"line_number":72,"context_line":"   * API responses include current replication mode"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"e1098177_71812369","line":70,"range":{"start_line":70,"start_character":66,"end_line":70,"end_character":71},"in_reply_to":"b4504fa1_62bf15c7","updated":"2026-05-04 18:12:47.000000000","message":"It definitely is useful as an async replication is defined by the RPO expectation. We have an embedded schedule resource in our policies to tweak the RPO expectations. If we just pass async, the RPO expectations will either have to be defaulted on drivers or will need to be input via cinder.conf which can become tedious.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"REST API Changes"},{"line_number":84,"context_line":"----------------"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"**1. Export Volume Metadata for Cross-OpenStack Replication**"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"New API endpoint to export volume metadata for external import:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"827dd558_f05c4b00","line":85,"updated":"2026-04-23 16:16:14.000000000","message":"There seems to be no failover action API - are we relying on v2 APIs here?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"REST API Changes"},{"line_number":84,"context_line":"----------------"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"**1. Export Volume Metadata for Cross-OpenStack Replication**"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"New API endpoint to export volume metadata for external import:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9b5cd204_5940e4d5","line":85,"in_reply_to":"827dd558_f05c4b00","updated":"2026-04-29 19:48:48.000000000","message":"The idea is to have a unified API \"failover\" that will dynamically make decisions  depending on the type or replication, granularity, cross openstack failover etc to call respective driver methods.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":120,"context_line":"            ],"},{"line_number":121,"context_line":"            \"volume_metadata\": {},"},{"line_number":122,"context_line":"            \"encrypted\": true,"},{"line_number":123,"context_line":"            \"encryption_key_id\": \"barbican-key-uuid\""},{"line_number":124,"context_line":"        }"},{"line_number":125,"context_line":"    }"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5cbe724a_6626a238","line":123,"range":{"start_line":123,"start_character":12,"end_line":123,"end_character":52},"updated":"2026-04-23 16:16:14.000000000","message":"Barbican federation or key re-wrapping at import time needs to be addressed here. Exporting a key UUID is meaningless if the target cloud can\u0027t resolve it.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            ],"},{"line_number":121,"context_line":"            \"volume_metadata\": {},"},{"line_number":122,"context_line":"            \"encrypted\": true,"},{"line_number":123,"context_line":"            \"encryption_key_id\": \"barbican-key-uuid\""},{"line_number":124,"context_line":"        }"},{"line_number":125,"context_line":"    }"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b4546bd2_09e75065","line":123,"range":{"start_line":123,"start_character":12,"end_line":123,"end_character":52},"in_reply_to":"5cbe724a_6626a238","updated":"2026-04-29 19:48:48.000000000","message":"Makes sense, I had similar thoughts about the metadata for other services that is required for this import to succeed, so looks like encrypted volumes is unsupported with cross openstack failover operations.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"7c090d0bfaf73bd793fac678532da4326ba38db1","unresolved":true,"context_lines":[{"line_number":130,"context_line":"OpenStack deployment:"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"* Method: POST"},{"line_number":133,"context_line":"* URL: ``/v3/\u003cproject_id\u003e/volumes/import-replica``"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":".. code-block:: json"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ad66ca40_2505488b","line":133,"range":{"start_line":133,"start_character":34,"end_line":133,"end_character":48},"updated":"2026-04-24 09:21:58.000000000","message":"This can only be done after failover? Will the API fail if failover is not performed?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":130,"context_line":"OpenStack deployment:"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"* Method: POST"},{"line_number":133,"context_line":"* URL: ``/v3/\u003cproject_id\u003e/volumes/import-replica``"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":".. code-block:: json"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"716f12be_0bdf71ba","line":133,"range":{"start_line":133,"start_character":34,"end_line":133,"end_character":48},"in_reply_to":"ad66ca40_2505488b","updated":"2026-04-29 19:48:48.000000000","message":"Yes, updated the section to specify more details.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":161,"context_line":"                {"},{"line_number":162,"context_line":"                    \u0027backend_id\u0027: \u0027backend-b\u0027,"},{"line_number":163,"context_line":"                    \u0027replication_mode\u0027: [\u0027sync\u0027, \u0027async\u0027],"},{"line_number":164,"context_line":"                    \u0027cross_os\u0027: False"},{"line_number":165,"context_line":"                },"},{"line_number":166,"context_line":"                {"},{"line_number":167,"context_line":"                    \u0027backend_id\u0027: \u0027remote-openstack-1\u0027,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"beffe340_d6bbfc5e","line":164,"range":{"start_line":164,"start_character":20,"end_line":164,"end_character":37},"updated":"2026-04-23 16:16:14.000000000","message":"`cross_os` or `cross_cloud` - normalize?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                {"},{"line_number":162,"context_line":"                    \u0027backend_id\u0027: \u0027backend-b\u0027,"},{"line_number":163,"context_line":"                    \u0027replication_mode\u0027: [\u0027sync\u0027, \u0027async\u0027],"},{"line_number":164,"context_line":"                    \u0027cross_os\u0027: False"},{"line_number":165,"context_line":"                },"},{"line_number":166,"context_line":"                {"},{"line_number":167,"context_line":"                    \u0027backend_id\u0027: \u0027remote-openstack-1\u0027,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"80e025dc_1d809b97","line":164,"range":{"start_line":164,"start_character":20,"end_line":164,"end_character":37},"in_reply_to":"beffe340_d6bbfc5e","updated":"2026-04-29 19:48:48.000000000","message":"cross_os indicates across openstack clusters so using that terminology","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":166,"context_line":"                {"},{"line_number":167,"context_line":"                    \u0027backend_id\u0027: \u0027remote-openstack-1\u0027,"},{"line_number":168,"context_line":"                    \u0027replication_mode\u0027: [\u0027async\u0027],"},{"line_number":169,"context_line":"                    \u0027cross_cloud\u0027: True,"},{"line_number":170,"context_line":"                }"},{"line_number":171,"context_line":"            ]"},{"line_number":172,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ef0e2dde_a81f4d77","line":169,"range":{"start_line":169,"start_character":21,"end_line":169,"end_character":40},"updated":"2026-04-23 16:16:14.000000000","message":"`cross_os` or `cross_cloud` - normalize?","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                {"},{"line_number":167,"context_line":"                    \u0027backend_id\u0027: \u0027remote-openstack-1\u0027,"},{"line_number":168,"context_line":"                    \u0027replication_mode\u0027: [\u0027async\u0027],"},{"line_number":169,"context_line":"                    \u0027cross_cloud\u0027: True,"},{"line_number":170,"context_line":"                }"},{"line_number":171,"context_line":"            ]"},{"line_number":172,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3bd725e3_12929bd8","line":169,"range":{"start_line":169,"start_character":21,"end_line":169,"end_character":40},"in_reply_to":"ef0e2dde_a81f4d77","updated":"2026-04-29 19:48:48.000000000","message":"Thanks, changed this to cross_os","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":190,"context_line":"        \"\"\""},{"line_number":191,"context_line":"        replication_config \u003d self._get_replication_config(volume)"},{"line_number":192,"context_line":"        if replication_config.get(\u0027enabled\u0027):"},{"line_number":193,"context_line":"            mode \u003d replication_config.get(\u0027replication_mode\u0027, \u0027async\u0027)"},{"line_number":194,"context_line":"            scope \u003d replication_config.get(\u0027replication_scope\u0027, \u0027volume\u0027)"},{"line_number":195,"context_line":"            ..."},{"line_number":196,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fcd5a1af_dea8707c","line":193,"range":{"start_line":193,"start_character":12,"end_line":193,"end_character":70},"updated":"2026-04-23 16:16:14.000000000","message":"Precedence order should be documented. If a volume type specifies sync and the config default is async, which wins? Same question for group-level overrides...","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        \"\"\""},{"line_number":191,"context_line":"        replication_config \u003d self._get_replication_config(volume)"},{"line_number":192,"context_line":"        if replication_config.get(\u0027enabled\u0027):"},{"line_number":193,"context_line":"            mode \u003d replication_config.get(\u0027replication_mode\u0027, \u0027async\u0027)"},{"line_number":194,"context_line":"            scope \u003d replication_config.get(\u0027replication_scope\u0027, \u0027volume\u0027)"},{"line_number":195,"context_line":"            ..."},{"line_number":196,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b94af468_9fdd8a6b","line":193,"range":{"start_line":193,"start_character":12,"end_line":193,"end_character":70},"in_reply_to":"fcd5a1af_dea8707c","updated":"2026-04-29 19:48:48.000000000","message":"The user configured values will take priority over the global default. will update here to explicity mention it.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"* Continue with Existing Replication Models:"},{"line_number":231,"context_line":"  We could continue using Cheesecake for backend-level failover and Tiramisu"},{"line_number":232,"context_line":"  for group-level failover. However, this doesn\u0027t address granularities,"},{"line_number":233,"context_line":"  multi-cloud and explicit sync/async differentiation requirements."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"REST API impact"},{"line_number":236,"context_line":"---------------"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"22abd098_eaf696d5","line":234,"range":{"start_line":232,"start_character":37,"end_line":234,"end_character":0},"updated":"2026-04-23 16:16:14.000000000","message":"Add a brief note on why AZ-awareness was also not folded into this effort, since it appears in the problem description as optional but is closely related to scope granularity.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"* Continue with Existing Replication Models:"},{"line_number":231,"context_line":"  We could continue using Cheesecake for backend-level failover and Tiramisu"},{"line_number":232,"context_line":"  for group-level failover. However, this doesn\u0027t address granularities,"},{"line_number":233,"context_line":"  multi-cloud and explicit sync/async differentiation requirements."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"REST API impact"},{"line_number":236,"context_line":"---------------"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"093e9b35_3ac94f0a","line":234,"range":{"start_line":232,"start_character":37,"end_line":234,"end_character":0},"in_reply_to":"22abd098_eaf696d5","updated":"2026-04-29 19:48:48.000000000","message":"Done","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"6b6a517e4fecfc3123663d7677b44990e1165fb0","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"* Unit test coverage for all new methods and code paths"},{"line_number":289,"context_line":"* Tempest test coverage for failover/failback and import/export APIs"},{"line_number":290,"context_line":"* Integration testing in cross-OpenStack deployments (manual)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"Documentation Impact"},{"line_number":293,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7d3042b0_d8b96cb2","line":290,"range":{"start_line":290,"start_character":2,"end_line":290,"end_character":61},"updated":"2026-04-23 16:16:14.000000000","message":"\"Manual\" is a red flag for a feature with this much operational risk. Should note whether CI gate coverage is planned or explicitly acknowledge this as a gap requiring follow-up.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f783f52b89fc8dbaee95f6cb2d02150b0f7e3f06","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"* Unit test coverage for all new methods and code paths"},{"line_number":289,"context_line":"* Tempest test coverage for failover/failback and import/export APIs"},{"line_number":290,"context_line":"* Integration testing in cross-OpenStack deployments (manual)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"Documentation Impact"},{"line_number":293,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e041dc66_9a83925d","line":290,"range":{"start_line":290,"start_character":2,"end_line":290,"end_character":61},"in_reply_to":"7d3042b0_d8b96cb2","updated":"2026-04-29 19:48:48.000000000","message":"There is currently no way in CI (or at least I\u0027m aware of) to deploy two openstack clusters and test features across it.\nThe operational risk part would come if the feature is productized and deployed in a large scale environment, for which, I think there will be a separate series of tests performed before supporting this at scale.\nFor the scope of opensource development, I don\u0027t think we have enough resources to automate this let alone build CI jobs to test this.","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"f40ca396a786bebdc1e155afb3b2a637e662aad4","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"* Unit test coverage for all new methods and code paths"},{"line_number":289,"context_line":"* Tempest test coverage for failover/failback and import/export APIs"},{"line_number":290,"context_line":"* Integration testing in cross-OpenStack deployments (manual)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"Documentation Impact"},{"line_number":293,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1ed57fb1_abd1d223","line":290,"range":{"start_line":290,"start_character":2,"end_line":290,"end_character":61},"in_reply_to":"e041dc66_9a83925d","updated":"2026-04-30 10:17:20.000000000","message":"I\u0027d add a comment about cross-cluster testing being out of scope","commit_id":"52a68270f4631256c52b0a9f5b170a7313218cad"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"f40ca396a786bebdc1e155afb3b2a637e662aad4","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"Note that, creating a volume with a replication scope set should be"},{"line_number":89,"context_line":"mutually exclusive from the other scopes."},{"line_number":90,"context_line":"If a user has enabled backend level replication then creating individual"},{"line_number":91,"context_line":"volumes with replication_scope at volume level inside the **already**"},{"line_number":92,"context_line":"replicated backend, this operation should not be permitted."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Along with the current proposed changes, another important use case is to"},{"line_number":95,"context_line":"perform automated failover in case of sync replication."}],"source_content_type":"text/x-rst","patch_set":2,"id":"f31ed034_96f7e0de","line":92,"range":{"start_line":90,"start_character":0,"end_line":92,"end_character":59},"updated":"2026-04-30 10:17:20.000000000","message":"Where this is enforced? Is it a Cinder API validation, a scheduler check, or delegated to the driver?","commit_id":"b2db8a4ab25aed86982b4e295b3a0696a27b49cf"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"f40ca396a786bebdc1e155afb3b2a637e662aad4","unresolved":true,"context_lines":[{"line_number":114,"context_line":"will clear all the DB records so there is no scenario where"},{"line_number":115,"context_line":"the primary array coming back could lead to data corruption"},{"line_number":116,"context_line":"scenarios."},{"line_number":117,"context_line":"Note that we can only control this for the Cinder related"},{"line_number":118,"context_line":"databases and require some operation on nova side to clear"},{"line_number":119,"context_line":"out the block device mapping table(s)."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Request:"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"a8bf731d_7d31aeaa","line":119,"range":{"start_line":117,"start_character":0,"end_line":119,"end_character":38},"updated":"2026-04-30 10:17:20.000000000","message":"This means the export API can potentially leave Nova in an inconsistent state. This needs either a cross-project work item or an explicit note that clear_existing\u003dtrue is unsafe for attached volumes without Nova coordination.","commit_id":"b2db8a4ab25aed86982b4e295b3a0696a27b49cf"}]}
