)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"4c0f1b63d4caec9eb1f290df9ce6887fb2064fce","unresolved":true,"context_lines":[{"line_number":30,"context_line":"When a transfer is cancelled (deleted), the same process is used"},{"line_number":31,"context_line":"to transfer ownship back to the user that cancelled the transfer."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Implements: bp/transfer-encrypted-volume"},{"line_number":34,"context_line":"Change-Id: I459f06504e90025c9c0b539981d3d56a2a9394c7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"41676c66_fab4990a","line":33,"range":{"start_line":33,"start_character":12,"end_line":33,"end_character":40},"updated":"2022-08-16 06:09:50.000000000","message":"nit: can we provide url for easy reference\nhttps://blueprints.launchpad.net/cinder/+spec/transfer-encrypted-volume","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"342104385fbb73f5c8c566ad1b8b7981b456e58a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"When a transfer is cancelled (deleted), the same process is used"},{"line_number":31,"context_line":"to transfer ownship back to the user that cancelled the transfer."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Implements: bp/transfer-encrypted-volume"},{"line_number":34,"context_line":"Change-Id: I459f06504e90025c9c0b539981d3d56a2a9394c7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"852f6bcd_3d8ea7d7","line":33,"range":{"start_line":33,"start_character":12,"end_line":33,"end_character":40},"in_reply_to":"41676c66_fab4990a","updated":"2022-08-16 13:17:15.000000000","message":"Gerrit can render links, and I\u0027m pretty sure \"bp/XXX\" used to work. But I\u0027ll switch this to the \"blueprint XXX\" syntax.","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4d917f70b30323691a97ec52b0c04402407fc18e","unresolved":true,"context_lines":[{"line_number":28,"context_line":"  is deleted."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"When a transfer is cancelled (deleted), the same process is used"},{"line_number":31,"context_line":"to transfer ownship back to the user that cancelled the transfer."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Implements: blueprint transfer-encrypted-volume"},{"line_number":34,"context_line":"Change-Id: I459f06504e90025c9c0b539981d3d56a2a9394c7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"14178398_ccb7cc66","line":31,"range":{"start_line":31,"start_character":12,"end_line":31,"end_character":20},"updated":"2022-08-29 23:00:38.000000000","message":"nit: ownership","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":31779,"name":"Jean Pierre Roquesalane","display_name":"happystacker","email":"jeanpierre.roquesalane@dell.com","username":"happystacker"},"change_message_id":"88c8e070dc84eb54c60c704876f108a2a31de05b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6eee00cd_498b4af4","updated":"2022-07-29 15:39:13.000000000","message":"run-DellEMC PowerFlex CI","commit_id":"8045e7df7e0c6fac072b7067184ba1676c6febd4"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"4c0f1b63d4caec9eb1f290df9ce6887fb2064fce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"09502a40_40365519","updated":"2022-08-16 06:09:50.000000000","message":"Some queries/comments.\n","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"6bd5eab7fd2fb28e6321faa5ca8a8d32e5b3f2b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d5c96688_2e094952","updated":"2022-08-25 17:21:26.000000000","message":"Haven\u0027t reviewed the code yet, but wanted to respond to Rajat\u0027s microversion concern.  I think if we look at this from the end user point of view:\n\ndelete - no change, if I created a transfer and now want to cancel it, I simply delete it; I shouldn\u0027t have to specify mv 3.70  because nothing has changed for me\n\naccept - no change; I simply accept the transfer or ignore it\n\ncreate - this one is different; pre-3.70, if I tried to transfer an encrypted volume, the create would fail, and it\u0027s possible I\u0027ve relied on that to prevent me from transferring an encrypted volume by mistake.  So to get the new functionality, I should ask for mv 3.70 or greater, and that makes sense.\n\nSo I think Alan\u0027s approach makes sense.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f7e2491cd767f1459333efa76215bcdfc3954b82","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"939ae3d8_774d5a2e","updated":"2022-08-26 10:09:11.000000000","message":"I\u0027m good with the current approach. some of the comments left previously needs to be addressed.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1da796a6_aca799d5","updated":"2022-08-18 10:35:37.000000000","message":"The general idea looks good. I\u0027ve few questions and suggestions inline.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"c0488901f7e06a2a33bd98c68d574886dfedc98b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9bd6c0cf_77548840","updated":"2022-08-17 03:49:44.000000000","message":"Zuul has passed. My queries/comments have been addressed. So +1.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f7e2491cd767f1459333efa76215bcdfc3954b82","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"bcc400db_80108380","in_reply_to":"d5c96688_2e094952","updated":"2022-08-26 10:09:11.000000000","message":"Yes, my cases have been more rare to think about in a kind-of upgrade scenario but the main reasoning was to only allow an operation, like to accept an encrypted volume, only when we\u0027ve specified the microversion.\nThinking about it again, an accept of encrypted volumes won\u0027t occur if we aren\u0027t able to create a transfer with the required microversion and users running different API services with different microversion support in a deployment seems highly unlikely so I\u0027m good with this approach.\nIf my other comments are addressed I\u0027m good with it.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4d917f70b30323691a97ec52b0c04402407fc18e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ddc65e9f_9ffa6cc3","updated":"2022-08-29 23:00:38.000000000","message":"Code and tests look good and have helpful comments.  A few minor things noted inline, but nothing worth holding this up over.","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"96c540430d9faf1c5480f74b463eabbb3efd9b09","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"84a4962d_a363cd36","updated":"2022-08-30 09:30:54.000000000","message":"Few comments which can be addressed in a followup but not critical. The general idea and code looks good to me.","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"}],"api-ref/source/v3/samples/versions/version-show-response.json":[{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"4c0f1b63d4caec9eb1f290df9ce6887fb2064fce","unresolved":true,"context_lines":[{"line_number":21,"context_line":"            ],"},{"line_number":22,"context_line":"            \"min_version\": \"3.0\","},{"line_number":23,"context_line":"            \"status\": \"CURRENT\","},{"line_number":24,"context_line":"            \"updated\": \"2022-03-30T00:00:00Z\","},{"line_number":25,"context_line":"            \"version\": \"3.70\""},{"line_number":26,"context_line":"        }"},{"line_number":27,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":5,"id":"d55cecff_6563e8b5","line":24,"range":{"start_line":24,"start_character":24,"end_line":24,"end_character":34},"updated":"2022-08-16 06:09:50.000000000","message":"same query as in versions-response.json","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"342104385fbb73f5c8c566ad1b8b7981b456e58a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"            ],"},{"line_number":22,"context_line":"            \"min_version\": \"3.0\","},{"line_number":23,"context_line":"            \"status\": \"CURRENT\","},{"line_number":24,"context_line":"            \"updated\": \"2022-03-30T00:00:00Z\","},{"line_number":25,"context_line":"            \"version\": \"3.70\""},{"line_number":26,"context_line":"        }"},{"line_number":27,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":5,"id":"0b78ad53_93ac4e36","line":24,"range":{"start_line":24,"start_character":24,"end_line":24,"end_character":34},"in_reply_to":"d55cecff_6563e8b5","updated":"2022-08-16 13:17:15.000000000","message":"Done","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"}],"api-ref/source/v3/samples/versions/versions-response.json":[{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"4c0f1b63d4caec9eb1f290df9ce6887fb2064fce","unresolved":true,"context_lines":[{"line_number":21,"context_line":"            ],"},{"line_number":22,"context_line":"            \"min_version\": \"3.0\","},{"line_number":23,"context_line":"            \"status\": \"CURRENT\","},{"line_number":24,"context_line":"            \"updated\": \"2022-03-30T00:00:00Z\","},{"line_number":25,"context_line":"            \"version\": \"3.70\""},{"line_number":26,"context_line":"        }"},{"line_number":27,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":5,"id":"13ab8ba2_121baac5","line":24,"range":{"start_line":24,"start_character":24,"end_line":24,"end_character":34},"updated":"2022-08-16 06:09:50.000000000","message":"can this be changed to: Sept 2022 ?","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"342104385fbb73f5c8c566ad1b8b7981b456e58a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"            ],"},{"line_number":22,"context_line":"            \"min_version\": \"3.0\","},{"line_number":23,"context_line":"            \"status\": \"CURRENT\","},{"line_number":24,"context_line":"            \"updated\": \"2022-03-30T00:00:00Z\","},{"line_number":25,"context_line":"            \"version\": \"3.70\""},{"line_number":26,"context_line":"        }"},{"line_number":27,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":5,"id":"6debb236_71680805","line":24,"range":{"start_line":24,"start_character":24,"end_line":24,"end_character":34},"in_reply_to":"13ab8ba2_121baac5","updated":"2022-08-16 13:17:15.000000000","message":"Ack, though I\u0027ll use the the last day of this month.","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"}],"cinder/api/openstack/rest_api_version_history.rst":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4d917f70b30323691a97ec52b0c04402407fc18e","unresolved":true,"context_lines":[{"line_number":532,"context_line":"3.70"},{"line_number":533,"context_line":"----"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"Add the ability to transfer encrypted volumes and their snapshots."}],"source_content_type":"text/x-rst","patch_set":7,"id":"980e5268_74f7af4c","line":535,"updated":"2022-08-29 23:00:38.000000000","message":"If you need to put up a new PS, might be worth adding that the volume-transfer API requests/responses are unchanged.","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"9b99ba236a28d597e7af665dd8a47332c1969d9a","unresolved":false,"context_lines":[{"line_number":532,"context_line":"3.70"},{"line_number":533,"context_line":"----"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"Add the ability to transfer encrypted volumes and their snapshots."}],"source_content_type":"text/x-rst","patch_set":7,"id":"368f6c78_e9084934","line":535,"in_reply_to":"980e5268_74f7af4c","updated":"2022-08-31 04:01:05.000000000","message":"Done, see https://review.opendev.org/c/openstack/cinder/+/855307","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"}],"cinder/api/v3/volume_transfer.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        no_snapshots \u003d strutils.bool_from_string(transfer.get(\u0027no_snapshots\u0027,"},{"line_number":97,"context_line":"                                                              False))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":100,"context_line":"        allow_encrypted \u003d req_version.matches(mv.TRANSFER_ENCRYPTED_VOLUME)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(\"Creating transfer of volume %s\", volume_id)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"80191460_c48a581e","line":100,"range":{"start_line":99,"start_character":8,"end_line":100,"end_character":75},"updated":"2022-08-18 10:35:37.000000000","message":"Since we don\u0027t have a spec, I\u0027m not sure about the assumption we are making here but my question is, don\u0027t we require the same check for accept and delete transfer[1]?\nIs a case possible when different c-vol services are running different openstack versions and the accept/delete request goes to a service which doesn\u0027t have support for 3.70 MV ?\n\n[1] https://github.com/openstack/cinder/blob/master/cinder/api/contrib/volume_transfer.py#L110-L145","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"3220b21903808e004c02f0ff4d81b9f5a21a4205","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        no_snapshots \u003d strutils.bool_from_string(transfer.get(\u0027no_snapshots\u0027,"},{"line_number":97,"context_line":"                                                              False))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":100,"context_line":"        allow_encrypted \u003d req_version.matches(mv.TRANSFER_ENCRYPTED_VOLUME)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(\"Creating transfer of volume %s\", volume_id)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"c3f81785_ea1af24d","line":100,"range":{"start_line":99,"start_character":8,"end_line":100,"end_character":75},"in_reply_to":"17e27881_804cdae0","updated":"2022-08-22 09:03:16.000000000","message":"Correct me if I\u0027m wrong but since there are two users (in different projects) involved in the transfer, let\u0027s say user1 and user2.\nIf user1 has created a transfer (with the required MV) and user2 can\u0027t accept it (because of required MV) then user1 should be able to delete the transfer since they are on a version of cinder that supports required microversion for creating/accepting/deleting a transfer right?","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        no_snapshots \u003d strutils.bool_from_string(transfer.get(\u0027no_snapshots\u0027,"},{"line_number":97,"context_line":"                                                              False))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":100,"context_line":"        allow_encrypted \u003d req_version.matches(mv.TRANSFER_ENCRYPTED_VOLUME)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(\"Creating transfer of volume %s\", volume_id)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"17e27881_804cdae0","line":100,"range":{"start_line":99,"start_character":8,"end_line":100,"end_character":75},"in_reply_to":"80191460_c48a581e","updated":"2022-08-18 13:21:40.000000000","message":"Hmm, you raise an interesting point, but I\u0027m not sure how to proceed. Yes, the current design does assume (perhaps falsely?) that if you can create the transfer, then your cloud is running a suitable version of cinder that can also accept or delete a transfer.\n\nBut if that\u0027s not the case, then where does that leave the user? I guess if the c-vol service cannot accept the transfer, then the only recourse is the delete it. But if we require a microversion check on the delete API, then where does that leave the user? We\u0027ve stranded them halfway across the desert, and don\u0027t allow them either forward or back.\n\nI\u0027m happy to add mv checks on the accept and delete API, but it seems to hinge on whether the assumption I stated above is true or false.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f7e2491cd767f1459333efa76215bcdfc3954b82","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        no_snapshots \u003d strutils.bool_from_string(transfer.get(\u0027no_snapshots\u0027,"},{"line_number":97,"context_line":"                                                              False))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":100,"context_line":"        allow_encrypted \u003d req_version.matches(mv.TRANSFER_ENCRYPTED_VOLUME)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(\"Creating transfer of volume %s\", volume_id)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"563465ac_c7ff893a","line":100,"range":{"start_line":99,"start_character":8,"end_line":100,"end_character":75},"in_reply_to":"967d6d59_94e2a7e7","updated":"2022-08-26 10:09:11.000000000","message":"Resolved in the new comment thread Brian initiated.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"2acea173121343852dadf2fc89b21bdc7b3119d2","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        no_snapshots \u003d strutils.bool_from_string(transfer.get(\u0027no_snapshots\u0027,"},{"line_number":97,"context_line":"                                                              False))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        req_version \u003d req.api_version_request"},{"line_number":100,"context_line":"        allow_encrypted \u003d req_version.matches(mv.TRANSFER_ENCRYPTED_VOLUME)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(\"Creating transfer of volume %s\", volume_id)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"967d6d59_94e2a7e7","line":100,"range":{"start_line":99,"start_character":8,"end_line":100,"end_character":75},"in_reply_to":"c3f81785_ea1af24d","updated":"2022-08-22 12:51:42.000000000","message":"I think you mean user1 and user2 might have different versions of the cinderclient. I expect the version of cinder itself will be same for both, and consistent across the cinder services (namely c-api and c-vol).\n\nThis feature doesn\u0027t require anything special in the API beyond the mv that\u0027s currently necessary to create the transfer request. The mv is really there just to distinguish between the period when encrypted volumes couldn\u0027t be transferred and the mv that signals it\u0027s now possible. If cinder supports the transfer and user1 has a cinderclient that supports the mv, and knowing there\u0027s no other API change associated with the feature, I assumed it would be OK for user2 to accept the transfer regardless of their cinderclient and mv. Maybe that\u0027s the assumption under discussion.\n\nAs for deleting a transfer, if user1 has a client that supports the mv, then I don\u0027t see a value in rejecting a delete request unless they specify the mv again. I recognize that\u0027s another assumption on my part.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"}],"cinder/keymgr/transfer.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":31,"context_line":"class KeyTransfer(object):"},{"line_number":32,"context_line":"    def __init__(self, conf: cfg.ConfigOpts):"},{"line_number":33,"context_line":"        self.conf \u003d conf"},{"line_number":34,"context_line":"        self.service_context \u003d keystone_password.KeystonePassword("},{"line_number":35,"context_line":"            password\u003dconf.keystone_authtoken.password,"},{"line_number":36,"context_line":"            auth_url\u003dconf.keystone_authtoken.auth_url,"},{"line_number":37,"context_line":"            username\u003dconf.keystone_authtoken.username,"},{"line_number":38,"context_line":"            user_domain_name\u003dconf.keystone_authtoken.user_domain_name,"},{"line_number":39,"context_line":"            project_name\u003dconf.keystone_authtoken.project_name,"},{"line_number":40,"context_line":"            project_domain_name\u003dconf.keystone_authtoken.project_domain_name)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def transfer_key(self,"},{"line_number":43,"context_line":"                     volume: objects.volume.Volume,"}],"source_content_type":"text/x-python","patch_set":6,"id":"c5432cb4_4649721a","line":40,"range":{"start_line":34,"start_character":8,"end_line":40,"end_character":76},"updated":"2022-08-18 10:35:37.000000000","message":"Not sure what other ways are possible to get the context but can\u0027t we just register all the config options in a group rather than passing them separately?\n\nSomething like this\n\nks_loading.register_auth_conf_options(self.conf, \u0027keystone_authtoken\u0027)","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f7e2491cd767f1459333efa76215bcdfc3954b82","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class KeyTransfer(object):"},{"line_number":32,"context_line":"    def __init__(self, conf: cfg.ConfigOpts):"},{"line_number":33,"context_line":"        self.conf \u003d conf"},{"line_number":34,"context_line":"        self.service_context \u003d keystone_password.KeystonePassword("},{"line_number":35,"context_line":"            password\u003dconf.keystone_authtoken.password,"},{"line_number":36,"context_line":"            auth_url\u003dconf.keystone_authtoken.auth_url,"},{"line_number":37,"context_line":"            username\u003dconf.keystone_authtoken.username,"},{"line_number":38,"context_line":"            user_domain_name\u003dconf.keystone_authtoken.user_domain_name,"},{"line_number":39,"context_line":"            project_name\u003dconf.keystone_authtoken.project_name,"},{"line_number":40,"context_line":"            project_domain_name\u003dconf.keystone_authtoken.project_domain_name)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def transfer_key(self,"},{"line_number":43,"context_line":"                     volume: objects.volume.Volume,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ca26e6f_2f7fd357","line":40,"range":{"start_line":34,"start_character":8,"end_line":40,"end_character":76},"in_reply_to":"55940866_ec1a72af","updated":"2022-08-26 10:09:11.000000000","message":"Ack, we can brainstorm on this later, for now this looks good.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"49c6a78c35a3e73000cf9b8b1c8140b336a500b6","unresolved":true,"context_lines":[{"line_number":31,"context_line":"class KeyTransfer(object):"},{"line_number":32,"context_line":"    def __init__(self, conf: cfg.ConfigOpts):"},{"line_number":33,"context_line":"        self.conf \u003d conf"},{"line_number":34,"context_line":"        self.service_context \u003d keystone_password.KeystonePassword("},{"line_number":35,"context_line":"            password\u003dconf.keystone_authtoken.password,"},{"line_number":36,"context_line":"            auth_url\u003dconf.keystone_authtoken.auth_url,"},{"line_number":37,"context_line":"            username\u003dconf.keystone_authtoken.username,"},{"line_number":38,"context_line":"            user_domain_name\u003dconf.keystone_authtoken.user_domain_name,"},{"line_number":39,"context_line":"            project_name\u003dconf.keystone_authtoken.project_name,"},{"line_number":40,"context_line":"            project_domain_name\u003dconf.keystone_authtoken.project_domain_name)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def transfer_key(self,"},{"line_number":43,"context_line":"                     volume: objects.volume.Volume,"}],"source_content_type":"text/x-python","patch_set":6,"id":"55940866_ec1a72af","line":40,"range":{"start_line":34,"start_character":8,"end_line":40,"end_character":76},"in_reply_to":"acc24733_94d1f207","updated":"2022-08-22 16:49:10.000000000","message":"It turns out this isn\u0027t very straightforward. Castellan has its own notion of authentication [1], and the one we\u0027re using here [2] doesn\u0027t provide a clean way to pass in a group of parameters.\n\n[1] https://github.com/openstack/castellan/blob/master/castellan/key_manager/barbican_key_manager.py#L166\n[2] https://github.com/openstack/castellan/blob/master/castellan/common/credentials/keystone_password.py#L26\n\nThere may be a roundabout way of generating a RequestContext object using keystoneauthv1 (such as the ks_loading functions), but that\u0027s not a straightforward process and wouldn\u0027t be any cleaner.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":31,"context_line":"class KeyTransfer(object):"},{"line_number":32,"context_line":"    def __init__(self, conf: cfg.ConfigOpts):"},{"line_number":33,"context_line":"        self.conf \u003d conf"},{"line_number":34,"context_line":"        self.service_context \u003d keystone_password.KeystonePassword("},{"line_number":35,"context_line":"            password\u003dconf.keystone_authtoken.password,"},{"line_number":36,"context_line":"            auth_url\u003dconf.keystone_authtoken.auth_url,"},{"line_number":37,"context_line":"            username\u003dconf.keystone_authtoken.username,"},{"line_number":38,"context_line":"            user_domain_name\u003dconf.keystone_authtoken.user_domain_name,"},{"line_number":39,"context_line":"            project_name\u003dconf.keystone_authtoken.project_name,"},{"line_number":40,"context_line":"            project_domain_name\u003dconf.keystone_authtoken.project_domain_name)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def transfer_key(self,"},{"line_number":43,"context_line":"                     volume: objects.volume.Volume,"}],"source_content_type":"text/x-python","patch_set":6,"id":"acc24733_94d1f207","line":40,"range":{"start_line":34,"start_character":8,"end_line":40,"end_character":76},"in_reply_to":"c5432cb4_4649721a","updated":"2022-08-18 13:21:40.000000000","message":"I borrowed this code from the \"fixed_key to barbican\" migration code. I agree it\u0027s cumbersome, and I\u0027ll investigate doing it a cleaner way like the one you suggested.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    key_transfer \u003d KeyTransfer(conf)"},{"line_number":78,"context_line":"    key_transfer.transfer_key(volume,"},{"line_number":79,"context_line":"                              src_context\u003dcontext,"},{"line_number":80,"context_line":"                              dst_context\u003dkey_transfer.service_context)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def transfer_accept(context: context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"d43759be_74d4a9b8","line":80,"range":{"start_line":80,"start_character":42,"end_line":80,"end_character":70},"updated":"2022-08-18 10:35:37.000000000","message":"suggestion: would be good to have a helper method in KeyTransfer class, get_service_context(), I personally prefer getter/setter way rather than directly accessing instance variables from object\n\n    def get_service_context(self):\n        return self.service_context","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"267ca9f1ee1b5cfcc92e0d27bbd78cb1e11f0a52","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    key_transfer \u003d KeyTransfer(conf)"},{"line_number":78,"context_line":"    key_transfer.transfer_key(volume,"},{"line_number":79,"context_line":"                              src_context\u003dcontext,"},{"line_number":80,"context_line":"                              dst_context\u003dkey_transfer.service_context)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def transfer_accept(context: context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"16ffddae_9fd7ea2c","line":80,"range":{"start_line":80,"start_character":42,"end_line":80,"end_character":70},"in_reply_to":"b0106f08_5151247f","updated":"2022-08-26 13:32:59.000000000","message":"Done","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    key_transfer \u003d KeyTransfer(conf)"},{"line_number":78,"context_line":"    key_transfer.transfer_key(volume,"},{"line_number":79,"context_line":"                              src_context\u003dcontext,"},{"line_number":80,"context_line":"                              dst_context\u003dkey_transfer.service_context)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def transfer_accept(context: context.RequestContext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"b0106f08_5151247f","line":80,"range":{"start_line":80,"start_character":42,"end_line":80,"end_character":70},"in_reply_to":"d43759be_74d4a9b8","updated":"2022-08-18 13:21:40.000000000","message":"Sure, I\u0027ll do that on the next patchset.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6fa1f427_f7aa9561","line":103,"range":{"start_line":83,"start_character":0,"end_line":103,"end_character":0},"updated":"2022-08-18 10:35:37.000000000","message":"Pointing out an observation, the code for both these methods is same and logically they are same since in both cases, we are transferring the key from service context to owner/recipient context.\nI think defining them separate is usually good since from end user perspective, both are different operations but would like to know other reviewers opinion on it.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"96c540430d9faf1c5480f74b463eabbb3efd9b09","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ab7f5862_12bc68d7","line":103,"range":{"start_line":83,"start_character":0,"end_line":103,"end_character":0},"in_reply_to":"1ea83646_cd4aeb3c","updated":"2022-08-30 09:30:54.000000000","message":"Yeah i agree, they\u0027re so short that reusing the code doesn\u0027t yield much benefit and might make the code less readable.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4d917f70b30323691a97ec52b0c04402407fc18e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1ea83646_cd4aeb3c","line":103,"range":{"start_line":83,"start_character":0,"end_line":103,"end_character":0},"in_reply_to":"6fa1f427_f7aa9561","updated":"2022-08-29 23:00:38.000000000","message":"I\u0027m ok with this, I think refactoring out the common code will actually make these more complex because they\u0027re so short to begin with, so it\u0027s not worth doing.  But if someone feels strongly, they could put up a patch later as a followup.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"}],"cinder/tests/unit/api/v3/test_volume_transfer.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":366,"context_line":"class VolumeTransferEncryptedAPITestCase(test.TestCase):"},{"line_number":367,"context_line":"    # NOTE:"},{"line_number":368,"context_line":"    # - The TRANSFER_ENCRYPTED_VOLUME microversion is only relevant when"},{"line_number":369,"context_line":"    #   creating a volume transfer. The microversion specified when accepting"},{"line_number":370,"context_line":"    #   or deleting a transfer is not relevant."},{"line_number":371,"context_line":"    # - The tests take advantage of the fact that a project_id is no longer"},{"line_number":372,"context_line":"    #   required API URLs."},{"line_number":373,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"6ca51d0a_d6e4193d","line":370,"range":{"start_line":369,"start_character":36,"end_line":370,"end_character":47},"updated":"2022-08-18 10:35:37.000000000","message":"any reason why the design is like this? All 3 are different operations (create, accept, delete) and key transfer takes place in all 3 of them so why do we only require only one operation to specify the MV?","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":false,"context_lines":[{"line_number":366,"context_line":"class VolumeTransferEncryptedAPITestCase(test.TestCase):"},{"line_number":367,"context_line":"    # NOTE:"},{"line_number":368,"context_line":"    # - The TRANSFER_ENCRYPTED_VOLUME microversion is only relevant when"},{"line_number":369,"context_line":"    #   creating a volume transfer. The microversion specified when accepting"},{"line_number":370,"context_line":"    #   or deleting a transfer is not relevant."},{"line_number":371,"context_line":"    # - The tests take advantage of the fact that a project_id is no longer"},{"line_number":372,"context_line":"    #   required API URLs."},{"line_number":373,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"f4e4db2d_0219a6c7","line":370,"range":{"start_line":369,"start_character":36,"end_line":370,"end_character":47},"in_reply_to":"6ca51d0a_d6e4193d","updated":"2022-08-18 13:21:40.000000000","message":"This is the critical design assumption that we need to resolve. The topic is discussed in another comment, so I\u0027ll close this one so the discussion doesn\u0027t fragment. The unit tests, including this comment, may need to be revised depending on the outcome of the discussion.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":369,"context_line":"    #   creating a volume transfer. The microversion specified when accepting"},{"line_number":370,"context_line":"    #   or deleting a transfer is not relevant."},{"line_number":371,"context_line":"    # - The tests take advantage of the fact that a project_id is no longer"},{"line_number":372,"context_line":"    #   required API URLs."},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def setUp(self):"},{"line_number":375,"context_line":"        super(VolumeTransferEncryptedAPITestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5475afd2_b9df33c9","line":372,"range":{"start_line":372,"start_character":16,"end_line":372,"end_character":17},"updated":"2022-08-18 10:35:37.000000000","message":"nit: in","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":369,"context_line":"    #   creating a volume transfer. The microversion specified when accepting"},{"line_number":370,"context_line":"    #   or deleting a transfer is not relevant."},{"line_number":371,"context_line":"    # - The tests take advantage of the fact that a project_id is no longer"},{"line_number":372,"context_line":"    #   required API URLs."},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def setUp(self):"},{"line_number":375,"context_line":"        super(VolumeTransferEncryptedAPITestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"db83fd24_b541939f","line":372,"range":{"start_line":372,"start_character":16,"end_line":372,"end_character":17},"in_reply_to":"5475afd2_b9df33c9","updated":"2022-08-18 13:21:40.000000000","message":"Ack, will fix this.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"267ca9f1ee1b5cfcc92e0d27bbd78cb1e11f0a52","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    #   creating a volume transfer. The microversion specified when accepting"},{"line_number":370,"context_line":"    #   or deleting a transfer is not relevant."},{"line_number":371,"context_line":"    # - The tests take advantage of the fact that a project_id is no longer"},{"line_number":372,"context_line":"    #   required API URLs."},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def setUp(self):"},{"line_number":375,"context_line":"        super(VolumeTransferEncryptedAPITestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"a27873a3_41474b8b","line":372,"range":{"start_line":372,"start_character":16,"end_line":372,"end_character":17},"in_reply_to":"db83fd24_b541939f","updated":"2022-08-26 13:32:59.000000000","message":"Done","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"}],"cinder/tests/unit/keymgr/test_transfer.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"96c540430d9faf1c5480f74b463eabbb3efd9b09","unresolved":true,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        snapshots \u003d objects.snapshot.SnapshotList.get_all_for_volume("},{"line_number":94,"context_line":"            self.context, volume.id)"},{"line_number":95,"context_line":"        self.assertEqual(len(snapshots), 2)"},{"line_number":96,"context_line":"        for snapshot in snapshots:"},{"line_number":97,"context_line":"            self.assertEqual(snapshot.encryption_key_id, encryption_key_id)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e7499811_8f5649ef","line":95,"range":{"start_line":95,"start_character":8,"end_line":95,"end_character":43},"updated":"2022-08-30 09:30:54.000000000","message":"nit: i don\u0027t see this assert being very useful in what we\u0027re testing here, also increasing/decreasing the number of snapshots will cause this assertion to fail which doesn\u0027t seem good if we want to extend our test cases.","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"9b99ba236a28d597e7af665dd8a47332c1969d9a","unresolved":true,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        snapshots \u003d objects.snapshot.SnapshotList.get_all_for_volume("},{"line_number":94,"context_line":"            self.context, volume.id)"},{"line_number":95,"context_line":"        self.assertEqual(len(snapshots), 2)"},{"line_number":96,"context_line":"        for snapshot in snapshots:"},{"line_number":97,"context_line":"            self.assertEqual(snapshot.encryption_key_id, encryption_key_id)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"86376008_c1595caa","line":95,"range":{"start_line":95,"start_character":8,"end_line":95,"end_character":43},"in_reply_to":"e7499811_8f5649ef","updated":"2022-08-31 04:01:05.000000000","message":"Well, knowing that I create two snapshots at L66 and L73, I thought it worth verifying that BOTH of them were updated with the new encryption_key_id. Sure, if someone later decides to increase or decrease that number, then I expect they\u0027ll quickly see they also need to update L95. I would have a greater concern if the impact of changing the number of snapshots affected a unit test in another file, but that\u0027s not the case here.","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"}],"cinder/transfer/api.py":[{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"4c0f1b63d4caec9eb1f290df9ce6887fb2064fce","unresolved":true,"context_lines":[{"line_number":141,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":142,"context_line":"            if not allow_encrypted:"},{"line_number":143,"context_line":"                raise exception.InvalidVolume("},{"line_number":144,"context_line":"                    reason\u003d_(\"transferring encrypted volume is not supported\"))"},{"line_number":145,"context_line":"            if no_snapshots:"},{"line_number":146,"context_line":"                raise exception.InvalidVolume("},{"line_number":147,"context_line":"                    reason\u003d_(\"transferring an encrypted volume without its \""}],"source_content_type":"text/x-python","patch_set":5,"id":"aa91ef49_3acd992a","line":144,"updated":"2022-08-16 06:09:50.000000000","message":"Query: Would it be helpful if we mention here that ...\nIt is supported from mv 3.70 \u0026 later.","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"342104385fbb73f5c8c566ad1b8b7981b456e58a","unresolved":true,"context_lines":[{"line_number":141,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":142,"context_line":"            if not allow_encrypted:"},{"line_number":143,"context_line":"                raise exception.InvalidVolume("},{"line_number":144,"context_line":"                    reason\u003d_(\"transferring encrypted volume is not supported\"))"},{"line_number":145,"context_line":"            if no_snapshots:"},{"line_number":146,"context_line":"                raise exception.InvalidVolume("},{"line_number":147,"context_line":"                    reason\u003d_(\"transferring an encrypted volume without its \""}],"source_content_type":"text/x-python","patch_set":5,"id":"dc1c5c39_46f0a4cd","line":144,"in_reply_to":"aa91ef49_3acd992a","updated":"2022-08-16 13:17:15.000000000","message":"I don\u0027t think that\u0027s a good idea. I chose to keep the original text (including the awkward grammar) because it\u0027s the original response. I\u0027m not aware of any precedence for modifying original responses so that they provide hints about new features.","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4d917f70b30323691a97ec52b0c04402407fc18e","unresolved":true,"context_lines":[{"line_number":141,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":142,"context_line":"            if not allow_encrypted:"},{"line_number":143,"context_line":"                raise exception.InvalidVolume("},{"line_number":144,"context_line":"                    reason\u003d_(\"transferring encrypted volume is not supported\"))"},{"line_number":145,"context_line":"            if no_snapshots:"},{"line_number":146,"context_line":"                raise exception.InvalidVolume("},{"line_number":147,"context_line":"                    reason\u003d_(\"transferring an encrypted volume without its \""}],"source_content_type":"text/x-python","patch_set":5,"id":"d5ada7d0_97f07dee","line":144,"in_reply_to":"dc1c5c39_46f0a4cd","updated":"2022-08-29 23:00:38.000000000","message":"Yes, we tend to be very conservative about this, though I could see how it could be helpful.  Problem is that if someone has a script that\u0027s parsing the returned string, we don\u0027t want to break them.  But it might be worth thinking about this (not just for this mv, there could be others), maybe at the PTG.","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        if volume_ref[\u0027status\u0027] !\u003d \u0027awaiting-transfer\u0027:"},{"line_number":79,"context_line":"            LOG.error(\"Volume in unexpected state\")"},{"line_number":80,"context_line":"        self.db.transfer_destroy(context, transfer_id)"},{"line_number":81,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":82,"context_line":"            key_transfer.transfer_delete(context, volume_ref, conf\u003dCONF)"},{"line_number":83,"context_line":"        volume_utils.notify_about_volume_usage(context, volume_ref,"},{"line_number":84,"context_line":"                                               \"transfer.delete.end\")"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"37fbbbf2_a1189468","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":72},"updated":"2022-08-18 10:35:37.000000000","message":"we are performing this after destroying the transfer record from DB, if this step fails, don\u0027t we want to preserve the DB record?","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        if volume_ref[\u0027status\u0027] !\u003d \u0027awaiting-transfer\u0027:"},{"line_number":79,"context_line":"            LOG.error(\"Volume in unexpected state\")"},{"line_number":80,"context_line":"        self.db.transfer_destroy(context, transfer_id)"},{"line_number":81,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":82,"context_line":"            key_transfer.transfer_delete(context, volume_ref, conf\u003dCONF)"},{"line_number":83,"context_line":"        volume_utils.notify_about_volume_usage(context, volume_ref,"},{"line_number":84,"context_line":"                                               \"transfer.delete.end\")"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"a1a8b48e_bdbd9016","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":72},"in_reply_to":"37fbbbf2_a1189468","updated":"2022-08-18 13:21:40.000000000","message":"You\u0027re right, I think I need to move these two lines above L80.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"267ca9f1ee1b5cfcc92e0d27bbd78cb1e11f0a52","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        if volume_ref[\u0027status\u0027] !\u003d \u0027awaiting-transfer\u0027:"},{"line_number":79,"context_line":"            LOG.error(\"Volume in unexpected state\")"},{"line_number":80,"context_line":"        self.db.transfer_destroy(context, transfer_id)"},{"line_number":81,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":82,"context_line":"            key_transfer.transfer_delete(context, volume_ref, conf\u003dCONF)"},{"line_number":83,"context_line":"        volume_utils.notify_about_volume_usage(context, volume_ref,"},{"line_number":84,"context_line":"                                               \"transfer.delete.end\")"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7cfe3b88_db938160","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":72},"in_reply_to":"a1a8b48e_bdbd9016","updated":"2022-08-26 13:32:59.000000000","message":"Done","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":177,"context_line":"            LOG.error(\"Failed to create transfer record for %s\", volume_id)"},{"line_number":178,"context_line":"            raise"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":181,"context_line":"            try:"},{"line_number":182,"context_line":"                key_transfer.transfer_create(context, volume_ref, conf\u003dCONF)"},{"line_number":183,"context_line":"            except Exception:"},{"line_number":184,"context_line":"                LOG.error(\"Failed to transfer keys for %s\", volume_id)"},{"line_number":185,"context_line":"                self.db.transfer_destroy(context, transfer.id)"},{"line_number":186,"context_line":"                raise"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_utils.notify_about_volume_usage(context, volume_ref,"},{"line_number":189,"context_line":"                                               \"transfer.create.end\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"0373c47a_4e430d95","line":186,"range":{"start_line":180,"start_character":0,"end_line":186,"end_character":21},"updated":"2022-08-18 10:35:37.000000000","message":"I don\u0027t think we require a DB transfer record to do this.\nI would suggest doing this before L#166 so we don\u0027t have to cleanup the transfer record in case of an exception.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":177,"context_line":"            LOG.error(\"Failed to create transfer record for %s\", volume_id)"},{"line_number":178,"context_line":"            raise"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":181,"context_line":"            try:"},{"line_number":182,"context_line":"                key_transfer.transfer_create(context, volume_ref, conf\u003dCONF)"},{"line_number":183,"context_line":"            except Exception:"},{"line_number":184,"context_line":"                LOG.error(\"Failed to transfer keys for %s\", volume_id)"},{"line_number":185,"context_line":"                self.db.transfer_destroy(context, transfer.id)"},{"line_number":186,"context_line":"                raise"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_utils.notify_about_volume_usage(context, volume_ref,"},{"line_number":189,"context_line":"                                               \"transfer.create.end\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"8b1959ac_8cb3eab3","line":186,"range":{"start_line":180,"start_character":0,"end_line":186,"end_character":21},"in_reply_to":"0373c47a_4e430d95","updated":"2022-08-18 13:21:40.000000000","message":"My thinking was that it might be \"dangerous\" to transfer the key without a valid transfer record, but it\u0027s easy to delete the DB record if the transfer fails. If we swap the order by transferring the key first, then it will need to be swapped back if something happens when the DB record is created (L176). The exception handler starting at L177 will need to swap the key back, but what if that operation fails? It would leave the volume in an unusable state.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f7e2491cd767f1459333efa76215bcdfc3954b82","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            LOG.error(\"Failed to create transfer record for %s\", volume_id)"},{"line_number":178,"context_line":"            raise"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if volume_ref.encryption_key_id is not None:"},{"line_number":181,"context_line":"            try:"},{"line_number":182,"context_line":"                key_transfer.transfer_create(context, volume_ref, conf\u003dCONF)"},{"line_number":183,"context_line":"            except Exception:"},{"line_number":184,"context_line":"                LOG.error(\"Failed to transfer keys for %s\", volume_id)"},{"line_number":185,"context_line":"                self.db.transfer_destroy(context, transfer.id)"},{"line_number":186,"context_line":"                raise"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_utils.notify_about_volume_usage(context, volume_ref,"},{"line_number":189,"context_line":"                                               \"transfer.create.end\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"cdcba5a4_f27b0cd7","line":186,"range":{"start_line":180,"start_character":0,"end_line":186,"end_character":21},"in_reply_to":"8b1959ac_8cb3eab3","updated":"2022-08-26 10:09:11.000000000","message":"Ack, makes sense. We have to do work both ways and this is lesser so I\u0027m OK with this.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"1e93e92e3b165dc624ab1cec6e139cda2184a754","unresolved":true,"context_lines":[{"line_number":312,"context_line":"                                    context.user_id,"},{"line_number":313,"context_line":"                                    context.project_id,"},{"line_number":314,"context_line":"                                    transfer[\u0027no_snapshots\u0027])"},{"line_number":315,"context_line":"            if vol_ref.encryption_key_id is not None:"},{"line_number":316,"context_line":"                key_transfer.transfer_accept(context, vol_ref, conf\u003dCONF)"},{"line_number":317,"context_line":"            QUOTAS.commit(context, reservations)"},{"line_number":318,"context_line":"            if snap_res:"},{"line_number":319,"context_line":"                QUOTAS.commit(context, snap_res)"}],"source_content_type":"text/x-python","patch_set":6,"id":"61450d3f_42a98c45","line":316,"range":{"start_line":315,"start_character":12,"end_line":316,"end_character":73},"updated":"2022-08-18 10:35:37.000000000","message":"Question: if this step errors out, do we need to revert the DB operations L#305-313 which performs accept transfer?","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f3be7588cdd154f80aca52a89fb48863ac4d4305","unresolved":true,"context_lines":[{"line_number":312,"context_line":"                                    context.user_id,"},{"line_number":313,"context_line":"                                    context.project_id,"},{"line_number":314,"context_line":"                                    transfer[\u0027no_snapshots\u0027])"},{"line_number":315,"context_line":"            if vol_ref.encryption_key_id is not None:"},{"line_number":316,"context_line":"                key_transfer.transfer_accept(context, vol_ref, conf\u003dCONF)"},{"line_number":317,"context_line":"            QUOTAS.commit(context, reservations)"},{"line_number":318,"context_line":"            if snap_res:"},{"line_number":319,"context_line":"                QUOTAS.commit(context, snap_res)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9d07a35a_b54bcffd","line":316,"range":{"start_line":315,"start_character":12,"end_line":316,"end_character":73},"in_reply_to":"61450d3f_42a98c45","updated":"2022-08-18 13:21:40.000000000","message":"I believe that would leave the volume in an unusable state. My thinking here is the accept operation would fail, and there would be enough information left behind (in the DB record) to facilitate efforts to manually repair the problem.","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"267ca9f1ee1b5cfcc92e0d27bbd78cb1e11f0a52","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                                    context.user_id,"},{"line_number":313,"context_line":"                                    context.project_id,"},{"line_number":314,"context_line":"                                    transfer[\u0027no_snapshots\u0027])"},{"line_number":315,"context_line":"            if vol_ref.encryption_key_id is not None:"},{"line_number":316,"context_line":"                key_transfer.transfer_accept(context, vol_ref, conf\u003dCONF)"},{"line_number":317,"context_line":"            QUOTAS.commit(context, reservations)"},{"line_number":318,"context_line":"            if snap_res:"},{"line_number":319,"context_line":"                QUOTAS.commit(context, snap_res)"}],"source_content_type":"text/x-python","patch_set":6,"id":"542b7818_86d8d097","line":316,"range":{"start_line":315,"start_character":12,"end_line":316,"end_character":73},"in_reply_to":"73a06b11_0e5a7ae8","updated":"2022-08-26 13:32:59.000000000","message":"Ack. While I feel the most likely place an exception might occur is the call at L305, which is before the key is transferred, your suggestion looks good (though I rearranged the code a little in my next patchset).","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"f7e2491cd767f1459333efa76215bcdfc3954b82","unresolved":true,"context_lines":[{"line_number":312,"context_line":"                                    context.user_id,"},{"line_number":313,"context_line":"                                    context.project_id,"},{"line_number":314,"context_line":"                                    transfer[\u0027no_snapshots\u0027])"},{"line_number":315,"context_line":"            if vol_ref.encryption_key_id is not None:"},{"line_number":316,"context_line":"                key_transfer.transfer_accept(context, vol_ref, conf\u003dCONF)"},{"line_number":317,"context_line":"            QUOTAS.commit(context, reservations)"},{"line_number":318,"context_line":"            if snap_res:"},{"line_number":319,"context_line":"                QUOTAS.commit(context, snap_res)"}],"source_content_type":"text/x-python","patch_set":6,"id":"73a06b11_0e5a7ae8","line":316,"range":{"start_line":315,"start_character":12,"end_line":316,"end_character":73},"in_reply_to":"9d07a35a_b54bcffd","updated":"2022-08-26 10:09:11.000000000","message":"I agree that the DB operations required to put the transfer in original state seems non-trivial and moving this code before the DB call to transfer is doable but could open more possibilities for issues.\n\nI\u0027m good with this but just mentioning my approach if you would like to think about it,\n\nmove the key transfer code before the DB call for transfer accept\nenclose the transfer_accept db call in try except\nif the DB call fails, create a key transfer from current project to service project\n\nthis will move the key back to service project which was the original state\n\n    if vol_ref.encryption_key_id is not None:\n        key_transfer.transfer_accept(context, vol_ref, conf\u003dCONF)\n    try:\n        self.db.transfer_accept(context.elevated(),\n                                transfer_id,\n                                context.user_id,\n                                context.project_id,\n                                transfer[\u0027no_snapshots\u0027])\n    except Exception:\n        key_transfer.transfer_create(context, volume_ref, conf\u003dCONF)","commit_id":"aeed94c955d1790f2263f05e5ef0b7de5d3a2695"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4d917f70b30323691a97ec52b0c04402407fc18e","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                    reason\u003d_(\"transferring encrypted volume is not supported\"))"},{"line_number":145,"context_line":"            if no_snapshots:"},{"line_number":146,"context_line":"                raise exception.InvalidVolume("},{"line_number":147,"context_line":"                    reason\u003d_(\"transferring an encrypted volume without its \""},{"line_number":148,"context_line":"                             \"snapshots is not supported\"))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if not no_snapshots:"},{"line_number":151,"context_line":"            snapshots \u003d self.db.snapshot_get_all_for_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"245c9560_1dc25a60","line":148,"range":{"start_line":147,"start_character":30,"end_line":148,"end_character":57},"updated":"2022-08-29 23:00:38.000000000","message":"I wonder if we should mention this in the release note?  Maybe it would be enough to update the api-ref text in a follow-up patch, along the lines of what you have in the cli-manage-volumes.rst","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"9b99ba236a28d597e7af665dd8a47332c1969d9a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                    reason\u003d_(\"transferring encrypted volume is not supported\"))"},{"line_number":145,"context_line":"            if no_snapshots:"},{"line_number":146,"context_line":"                raise exception.InvalidVolume("},{"line_number":147,"context_line":"                    reason\u003d_(\"transferring an encrypted volume without its \""},{"line_number":148,"context_line":"                             \"snapshots is not supported\"))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if not no_snapshots:"},{"line_number":151,"context_line":"            snapshots \u003d self.db.snapshot_get_all_for_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"2a332dd5_cf5ea241","line":148,"range":{"start_line":147,"start_character":30,"end_line":148,"end_character":57},"in_reply_to":"245c9560_1dc25a60","updated":"2022-08-31 04:01:05.000000000","message":"Done, see https://review.opendev.org/c/openstack/cinder/+/855307","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"}],"releasenotes/notes/transfer-encrypted-volume-2f040a6993435e79.yaml":[{"author":{"_account_id":29122,"name":"Raghavendra Tilay","email":"raghavendra-uddhav.tilay@hpe.com","username":"raghavendrat"},"change_message_id":"4c0f1b63d4caec9eb1f290df9ce6887fb2064fce","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Starting with API microversion 3.70, encrypted volumes can be transferred"},{"line_number":5,"context_line":"    to a user in a different project. Prior to microversion 3.70, the transfer"},{"line_number":6,"context_line":"    is blocked due to the inability to transfer ownership of the volume\u0027s"},{"line_number":7,"context_line":"    encryption key. With microverson 3.70, ownship of the encryption key is"},{"line_number":8,"context_line":"    transferred when the volume is transferred."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"a8d11569_8c96c961","line":7,"range":{"start_line":7,"start_character":43,"end_line":7,"end_character":51},"updated":"2022-08-16 06:09:50.000000000","message":"nit: ownership","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"342104385fbb73f5c8c566ad1b8b7981b456e58a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Starting with API microversion 3.70, encrypted volumes can be transferred"},{"line_number":5,"context_line":"    to a user in a different project. Prior to microversion 3.70, the transfer"},{"line_number":6,"context_line":"    is blocked due to the inability to transfer ownership of the volume\u0027s"},{"line_number":7,"context_line":"    encryption key. With microverson 3.70, ownship of the encryption key is"},{"line_number":8,"context_line":"    transferred when the volume is transferred."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"68992c0b_ac0a99d2","line":7,"range":{"start_line":7,"start_character":43,"end_line":7,"end_character":51},"in_reply_to":"a8d11569_8c96c961","updated":"2022-08-16 13:17:15.000000000","message":"Ooh, good catch, thanks!","commit_id":"b9b7f9c818343cc4f86faccef3df3e19e3f18877"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"96c540430d9faf1c5480f74b463eabbb3efd9b09","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Starting with API microversion 3.70, encrypted volumes can be transferred"},{"line_number":5,"context_line":"    to a user in a different project. Prior to microversion 3.70, the transfer"},{"line_number":6,"context_line":"    is blocked due to the inability to transfer ownership of the volume\u0027s"},{"line_number":7,"context_line":"    encryption key. With microverson 3.70, ownership of the encryption key is"},{"line_number":8,"context_line":"    transferred when the volume is transferred."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"6b570142_2c7d076e","line":5,"range":{"start_line":4,"start_character":41,"end_line":5,"end_character":36},"updated":"2022-08-30 09:30:54.000000000","message":"nit: would be useful to mention that snapshots MUST be transferred with the encrypted volumes since we allow not transferring snapshots for normal volumes (not sure how useful that is).","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"9b99ba236a28d597e7af665dd8a47332c1969d9a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Starting with API microversion 3.70, encrypted volumes can be transferred"},{"line_number":5,"context_line":"    to a user in a different project. Prior to microversion 3.70, the transfer"},{"line_number":6,"context_line":"    is blocked due to the inability to transfer ownership of the volume\u0027s"},{"line_number":7,"context_line":"    encryption key. With microverson 3.70, ownership of the encryption key is"},{"line_number":8,"context_line":"    transferred when the volume is transferred."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"1d1496f4_1215d1d4","line":5,"range":{"start_line":4,"start_character":41,"end_line":5,"end_character":36},"in_reply_to":"6b570142_2c7d076e","updated":"2022-08-31 04:01:05.000000000","message":"Done, see https://review.opendev.org/c/openstack/cinder/+/855307","commit_id":"d59e41fb3c2acee2e118b37f9f2e87bcf306f51c"}]}
