)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"1b032ff0f04d360837984d94420f6298f7c27114","unresolved":true,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch adds:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"* destroy_file_copy -- cancels an in-progress file copy via"},{"line_number":17,"context_line":"  PATCH /api/cluster/jobs/{uuid}."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"* get_cluster_peers -- lists cluster peers via GET /api/cluster/peers"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"b3e8be35_2808cd49","line":16,"updated":"2026-06-25 15:31:57.000000000","message":"cancels and deletes","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch adds:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"* destroy_file_copy -- cancels an in-progress file copy via"},{"line_number":17,"context_line":"  PATCH /api/cluster/jobs/{uuid}."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"* get_cluster_peers -- lists cluster peers via GET /api/cluster/peers"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"f4e1bee7_2e0f1cd8","line":16,"in_reply_to":"b3e8be35_2808cd49","updated":"2026-07-21 13:40:22.000000000","message":"Updated. This only cancels and we are removing it post that.","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"1cb0b5d021398c13730cd504df322afe33215b4e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4f2a695d_3142747a","updated":"2026-06-15 14:05:22.000000000","message":"First batch of NetApp ZAPI→REST gap items; additional items will land in subsequent revisions of this change.\n\nTracking list and scope discussed at the PTG: https://etherpad.opendev.org/p/cinder-netapp-zapi-to-rest-gaps\n\nReviewers — early feedback welcome in parallel with the follow-up items; please review the two methods landed here so subsequent revisions can build on agreed-upon patterns.","commit_id":"f86a6c8d5076ef6a861cdec8611f6b8dbaf9f717"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"1d6f2b2e2de16c961857ac8403a08cfdda6ed72d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"32f43aa7_b8ec4ffe","updated":"2026-06-16 13:41:27.000000000","message":"recheck","commit_id":"f86a6c8d5076ef6a861cdec8611f6b8dbaf9f717"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"282abc3ea4a2547a7a88358009a569a9560c2da4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f6d59faf_3df56f37","updated":"2026-06-16 04:49:18.000000000","message":"recheck","commit_id":"f86a6c8d5076ef6a861cdec8611f6b8dbaf9f717"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"4b01405615827ea455942783d0fa89b85456672f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d64526c1_0cac391e","updated":"2026-06-17 10:12:37.000000000","message":"INFO: PS adds \"set_lun_qos_policy_group\" and corrects Item-10 get_cluster_peers query key name → remote.name for ZAPI parity.","commit_id":"9c6fc3be4de09cb85eb4a73cd479b9ee523b52d3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"dd902f068d918d8f91b9c36170b3f62fc687a00d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"863461dc_98937c58","in_reply_to":"d64526c1_0cac391e","updated":"2026-06-17 10:13:00.000000000","message":"PS2*","commit_id":"9c6fc3be4de09cb85eb4a73cd479b9ee523b52d3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"2efd4ac4a7ed87270284425af4b3987d1892ed8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a54056d8_5ff871fb","updated":"2026-06-18 06:08:26.000000000","message":"Opening it for reviews for the first batch of ZAPI to REST gaps. Please do review.","commit_id":"4d7717e0f3d74a80dc117931dcb6cd8164f14001"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"1c366aa7e1be6b35d92db111d212762b67c0856b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"da073c5c_472ca65d","updated":"2026-06-18 14:59:51.000000000","message":"Please look at the comment.","commit_id":"4d7717e0f3d74a80dc117931dcb6cd8164f14001"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"c095455bb4ce6219c4b70316f06a3bd588847725","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e8b949f5_a52739ce","updated":"2026-06-18 07:12:31.000000000","message":"run-NetApp CI","commit_id":"4d7717e0f3d74a80dc117931dcb6cd8164f14001"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"1b032ff0f04d360837984d94420f6298f7c27114","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"42a5a839_f8dfd64e","updated":"2026-06-25 15:31:57.000000000","message":"Please take a look at some additional comments.","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"b05e44fd789b6465d387d8a03988dec890f22e2c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5eee7757_1d05cb64","updated":"2026-06-25 05:48:36.000000000","message":"run-NetApp CI","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4c56998cb015a6de4eb59453a24b7879967f7246","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0a748391_f658abe5","updated":"2026-07-08 13:03:20.000000000","message":"Please take a look at the comments.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"47c0f4dd_55842c42","updated":"2026-07-21 13:40:22.000000000","message":"Thank you so much @anoop.shukla@netapp.com @jayaanand.borra@netapp.com @gawasthi2010@gmail.com for the reviews and comments! \n\nAddressed all the comments, could you please take a look and approve.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d9fa20b6_2368f940","updated":"2026-07-15 19:52:45.000000000","message":"Thanks Sai for working on this, added few comments, please take a look.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"031fce0f_6c6582d9","updated":"2026-07-27 06:18:03.000000000","message":"Please take a look at the comments.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"bf118f04ddff9420e10856d14c88d4f3d8e67c40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"2491c7cd_3ebe4aeb","updated":"2026-07-27 05:24:46.000000000","message":"Thanks Sai for incorporating the review comments, I have opened few comments","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"80e3b1685865c8f59d11532b9ad3f94feb092668","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"5d56f219_b7f49141","updated":"2026-07-21 14:02:03.000000000","message":"run-NetApp CI","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"564827be_f26380d1","updated":"2026-07-28 12:54:23.000000000","message":"Thank you @anoop.shukla@netapp.com @gawasthi2010@gmail.com for the suggestions/comments. Addressed all the comments. Please do review.","commit_id":"631306ac330e52ce2714106cf1ef48ede7f6e097"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"337ccdf49f4d0f4e582dd97f4880317c6357889f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"d4ac550a_3881af7e","updated":"2026-07-30 11:56:31.000000000","message":"LGTM ..!","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"2a3f0df560f531378daec5bbabdc5d3c6678f869","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"5cc78585_fa54e917","updated":"2026-07-30 12:00:36.000000000","message":"Thanks for addressing the comments. LGTM","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3e88ac7e96c1daf68fd20058abea348d6b1ee20e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"075992d4_064ead66","updated":"2026-08-06 22:18:51.000000000","message":"This is very nicely done.  Code looks good, tests are thorough, and between the commit message and in-code comments, you clearly explain what you are doing given the constraints of the backend, which should make the code easier to maintain.  One nit noted inline, but feel free to ignore it.","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"83f9dd574e4c2594feac9983f34436cbca69c07d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"fb8ff6fb_3a8e51fd","updated":"2026-07-30 14:02:29.000000000","message":"run-NetApp CI","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"}],"cinder/volume/drivers/netapp/dataontap/client/client_cmode.py":[{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":779,"context_line":"        \"\"\"Cancel/Destroy a in-progress file copy.\"\"\""},{"line_number":780,"context_line":"        api_args \u003d {"},{"line_number":781,"context_line":"            \u0027job-uuid\u0027: job_uuid,"},{"line_number":782,"context_line":"            \u0027file-index\u0027: \u00270\u0027"},{"line_number":783,"context_line":"        }"},{"line_number":784,"context_line":"        try:"},{"line_number":785,"context_line":"            self.connection.send_request(\u0027file-copy-destroy\u0027, api_args,"}],"source_content_type":"text/x-python","patch_set":11,"id":"a458cb8f_8a083404","line":782,"range":{"start_line":782,"start_character":10,"end_line":782,"end_character":29},"updated":"2026-07-15 19:52:45.000000000","message":"any specific reason to change this from integer to string. Based on the key it seems is should be integer. Did you test it ..?","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"bf118f04ddff9420e10856d14c88d4f3d8e67c40","unresolved":true,"context_lines":[{"line_number":779,"context_line":"        \"\"\"Cancel/Destroy a in-progress file copy.\"\"\""},{"line_number":780,"context_line":"        api_args \u003d {"},{"line_number":781,"context_line":"            \u0027job-uuid\u0027: job_uuid,"},{"line_number":782,"context_line":"            \u0027file-index\u0027: \u00270\u0027"},{"line_number":783,"context_line":"        }"},{"line_number":784,"context_line":"        try:"},{"line_number":785,"context_line":"            self.connection.send_request(\u0027file-copy-destroy\u0027, api_args,"}],"source_content_type":"text/x-python","patch_set":11,"id":"df5b7fed_b27c557b","line":782,"range":{"start_line":782,"start_character":10,"end_line":782,"end_character":29},"in_reply_to":"6deb014d_9396b939","updated":"2026-07-27 05:24:46.000000000","message":"We need to add this in feature flag to make sure it should be working with old release. I have few question here \n- Is this not even working for the older release and this is kind of bug which we fixed now \n- This has changed to specific release, if that is the case, we need to use the feature flag to make sure code is compatible for older release also.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"c5e6432fee33c42ba7e672c0e1b9ea0769f17c6b","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        \"\"\"Cancel/Destroy a in-progress file copy.\"\"\""},{"line_number":780,"context_line":"        api_args \u003d {"},{"line_number":781,"context_line":"            \u0027job-uuid\u0027: job_uuid,"},{"line_number":782,"context_line":"            \u0027file-index\u0027: \u00270\u0027"},{"line_number":783,"context_line":"        }"},{"line_number":784,"context_line":"        try:"},{"line_number":785,"context_line":"            self.connection.send_request(\u0027file-copy-destroy\u0027, api_args,"}],"source_content_type":"text/x-python","patch_set":11,"id":"f0ab30bb_149f4a72","line":782,"range":{"start_line":782,"start_character":10,"end_line":782,"end_character":29},"in_reply_to":"9afae947_5d39bb07","updated":"2026-07-30 10:04:46.000000000","message":"ACK","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        \"\"\"Cancel/Destroy a in-progress file copy.\"\"\""},{"line_number":780,"context_line":"        api_args \u003d {"},{"line_number":781,"context_line":"            \u0027job-uuid\u0027: job_uuid,"},{"line_number":782,"context_line":"            \u0027file-index\u0027: \u00270\u0027"},{"line_number":783,"context_line":"        }"},{"line_number":784,"context_line":"        try:"},{"line_number":785,"context_line":"            self.connection.send_request(\u0027file-copy-destroy\u0027, api_args,"}],"source_content_type":"text/x-python","patch_set":11,"id":"6deb014d_9396b939","line":782,"range":{"start_line":782,"start_character":10,"end_line":782,"end_character":29},"in_reply_to":"a458cb8f_8a083404","updated":"2026-07-21 13:40:22.000000000","message":"Yes, tested on ONTAP 9.17.1. Sending file-index as int (0) makes ONTAP reject with 13115:Invalid integer value for file-index: (null) every time — this field requires a string despite its name. That\u0027s why destroy_file_copy() previously always raised, silently breaking cancel-cleanup. Unit tests already assert the string value.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        \"\"\"Cancel/Destroy a in-progress file copy.\"\"\""},{"line_number":780,"context_line":"        api_args \u003d {"},{"line_number":781,"context_line":"            \u0027job-uuid\u0027: job_uuid,"},{"line_number":782,"context_line":"            \u0027file-index\u0027: \u00270\u0027"},{"line_number":783,"context_line":"        }"},{"line_number":784,"context_line":"        try:"},{"line_number":785,"context_line":"            self.connection.send_request(\u0027file-copy-destroy\u0027, api_args,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9afae947_5d39bb07","line":782,"range":{"start_line":782,"start_character":10,"end_line":782,"end_character":29},"in_reply_to":"df5b7fed_b27c557b","updated":"2026-07-28 12:54:23.000000000","message":"The bug is not on ONTAP, it\u0027s in the code only. Resolving this comment as discussed.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"}],"cinder/volume/drivers/netapp/dataontap/client/client_cmode_rest.py":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"1c366aa7e1be6b35d92db111d212762b67c0856b","unresolved":true,"context_lines":[{"line_number":2800,"context_line":"        return result[\u0027job\u0027][\u0027uuid\u0027]"},{"line_number":2801,"context_line":""},{"line_number":2802,"context_line":"    def destroy_file_copy(self, job_uuid):"},{"line_number":2803,"context_line":"        \"\"\"Cancel/Destroy an in-progress file copy.\"\"\""},{"line_number":2804,"context_line":"        body \u003d {\u0027action\u0027: \u0027cancel\u0027}"},{"line_number":2805,"context_line":"        try:"},{"line_number":2806,"context_line":"            self.send_request(f\u0027/cluster/jobs/{job_uuid}\u0027, \u0027patch\u0027,"},{"line_number":2807,"context_line":"                              body\u003dbody, enable_tunneling\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":3,"id":"63433e22_3b2d04c2","line":2804,"range":{"start_line":2803,"start_character":7,"end_line":2804,"end_character":35},"updated":"2026-06-18 14:59:51.000000000","message":"Would like to understand if the ZAPI equivalent destroy_file_copy was cleaning up the partially copied file. Please check the ZAPI doc and confirm. Since we do not have a direct equivalent of this ZAPI in REST, if the behaviour is not the same, we may run into stale files when the job is cancelled. So we need to confirm if the stale file in progress needs to be orchestrated to be deleted after canceling the job.","commit_id":"4d7717e0f3d74a80dc117931dcb6cd8164f14001"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"3c1197e8326b1aa472dcbfcad4e5cd2fa4687ca1","unresolved":false,"context_lines":[{"line_number":2800,"context_line":"        return result[\u0027job\u0027][\u0027uuid\u0027]"},{"line_number":2801,"context_line":""},{"line_number":2802,"context_line":"    def destroy_file_copy(self, job_uuid):"},{"line_number":2803,"context_line":"        \"\"\"Cancel/Destroy an in-progress file copy.\"\"\""},{"line_number":2804,"context_line":"        body \u003d {\u0027action\u0027: \u0027cancel\u0027}"},{"line_number":2805,"context_line":"        try:"},{"line_number":2806,"context_line":"            self.send_request(f\u0027/cluster/jobs/{job_uuid}\u0027, \u0027patch\u0027,"},{"line_number":2807,"context_line":"                              body\u003dbody, enable_tunneling\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ecb684ab_6babc454","line":2804,"range":{"start_line":2803,"start_character":7,"end_line":2804,"end_character":35},"in_reply_to":"63433e22_3b2d04c2","updated":"2026-06-24 10:38:46.000000000","message":"Thank you for highlighting this Anoop. It makes a lot of sense.\n\nYes. The ZAPI driver relied on file-copy-destroy for cleanup on cancel, whereas REST\u0027s PATCH /cluster/jobs/{uuid} only stops the job and leaves the partial behind.\n\nSo, the stale partial has to be orchestrated explicitly: after cancelling, we now always delete the destination file and treat \"file not found\" as success. That brings REST in line with the ZAPI behaviour. The changes will come in the next patch set.","commit_id":"4d7717e0f3d74a80dc117931dcb6cd8164f14001"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"1b032ff0f04d360837984d94420f6298f7c27114","unresolved":true,"context_lines":[{"line_number":1507,"context_line":"    def set_lun_qos_policy_group(self, path, qos_policy_group,"},{"line_number":1508,"context_line":"                                 is_adaptive\u003dFalse):"},{"line_number":1509,"context_line":"        \"\"\"Sets qos_policy_group on a LUN.\"\"\""},{"line_number":1510,"context_line":"        self._validate_qos_policy_group(is_adaptive)"},{"line_number":1511,"context_line":"        body \u003d {\u0027qos_policy.name\u0027: qos_policy_group}"},{"line_number":1512,"context_line":"        self._lun_update_by_path(path, body)"},{"line_number":1513,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"2e4cb3d8_93458ced","line":1510,"range":{"start_line":1510,"start_character":8,"end_line":1510,"end_character":52},"updated":"2026-06-25 15:31:57.000000000","message":"do we need to also pass qos_min_support value?","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":1507,"context_line":"    def set_lun_qos_policy_group(self, path, qos_policy_group,"},{"line_number":1508,"context_line":"                                 is_adaptive\u003dFalse):"},{"line_number":1509,"context_line":"        \"\"\"Sets qos_policy_group on a LUN.\"\"\""},{"line_number":1510,"context_line":"        self._validate_qos_policy_group(is_adaptive)"},{"line_number":1511,"context_line":"        body \u003d {\u0027qos_policy.name\u0027: qos_policy_group}"},{"line_number":1512,"context_line":"        self._lun_update_by_path(path, body)"},{"line_number":1513,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dd2628fd_804dca1c","line":1510,"range":{"start_line":1510,"start_character":8,"end_line":1510,"end_character":52},"in_reply_to":"2e4cb3d8_93458ced","updated":"2026-07-21 13:40:22.000000000","message":"No. set_lun_qos_policy_group never passes a spec to _validate_qos_policy_group, so qos_min_support isn\u0027t consulted here — it only applies when validating a spec[\u0027min_throughput\u0027]. Same as the ZAPI client\u0027s implementation, which has this identical call shape.","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"1b032ff0f04d360837984d94420f6298f7c27114","unresolved":true,"context_lines":[{"line_number":2742,"context_line":"            ip_addresses \u003d remote.get(\u0027ip_addresses\u0027, []) or []"},{"line_number":2743,"context_line":""},{"line_number":2744,"context_line":"            cluster_peer \u003d {"},{"line_number":2745,"context_line":"                \u0027active-addresses\u0027: list(ip_addresses),"},{"line_number":2746,"context_line":"                \u0027peer-addresses\u0027: list(ip_addresses),"},{"line_number":2747,"context_line":"                \u0027availability\u0027: status.get(\u0027state\u0027),"},{"line_number":2748,"context_line":"                \u0027cluster-name\u0027: peer_info.get(\u0027name\u0027),"},{"line_number":2749,"context_line":"                \u0027cluster-uuid\u0027: peer_info.get(\u0027uuid\u0027),"},{"line_number":2750,"context_line":"                \u0027remote-cluster-name\u0027: remote.get(\u0027name\u0027),"},{"line_number":2751,"context_line":"                \u0027serial-number\u0027: remote.get(\u0027serial_number\u0027),"},{"line_number":2752,"context_line":"            }"},{"line_number":2753,"context_line":"            cluster_peers.append(cluster_peer)"},{"line_number":2754,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"b89c6fa0_38bd4118","line":2751,"range":{"start_line":2745,"start_character":16,"end_line":2751,"end_character":61},"updated":"2026-06-25 15:31:57.000000000","message":"Do we need all these attributes to be returned?","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"            ip_addresses \u003d remote.get(\u0027ip_addresses\u0027, []) or []"},{"line_number":2743,"context_line":""},{"line_number":2744,"context_line":"            cluster_peer \u003d {"},{"line_number":2745,"context_line":"                \u0027active-addresses\u0027: list(ip_addresses),"},{"line_number":2746,"context_line":"                \u0027peer-addresses\u0027: list(ip_addresses),"},{"line_number":2747,"context_line":"                \u0027availability\u0027: status.get(\u0027state\u0027),"},{"line_number":2748,"context_line":"                \u0027cluster-name\u0027: peer_info.get(\u0027name\u0027),"},{"line_number":2749,"context_line":"                \u0027cluster-uuid\u0027: peer_info.get(\u0027uuid\u0027),"},{"line_number":2750,"context_line":"                \u0027remote-cluster-name\u0027: remote.get(\u0027name\u0027),"},{"line_number":2751,"context_line":"                \u0027serial-number\u0027: remote.get(\u0027serial_number\u0027),"},{"line_number":2752,"context_line":"            }"},{"line_number":2753,"context_line":"            cluster_peers.append(cluster_peer)"},{"line_number":2754,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"107fe99a_ad7dc088","line":2751,"range":{"start_line":2745,"start_character":16,"end_line":2751,"end_character":61},"in_reply_to":"b89c6fa0_38bd4118","updated":"2026-07-21 13:40:22.000000000","message":"Returning all of them to match ZAPI\u0027s get_cluster_peers dict shape.","commit_id":"f72d004a8c991cd9ab29bdfdd4c5aa5dfda015f0"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4c56998cb015a6de4eb59453a24b7879967f7246","unresolved":true,"context_lines":[{"line_number":850,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":851,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":852,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":853,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"},{"line_number":854,"context_line":"            unique_bytes \u003d str(int(raw[:-2]) * 1024)"},{"line_number":855,"context_line":"        else:"},{"line_number":856,"context_line":"            unique_bytes \u003d str(raw)"}],"source_content_type":"text/x-python","patch_set":6,"id":"f00ca9ca_06e07435","line":853,"updated":"2026-07-08 13:03:20.000000000","message":"raw.casefold().endswith() may be? Today ONTAP sends KB, but this logic will fail if it sends it in lower case.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":851,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":852,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":853,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"},{"line_number":854,"context_line":"            unique_bytes \u003d str(int(raw[:-2]) * 1024)"},{"line_number":855,"context_line":"        else:"},{"line_number":856,"context_line":"            unique_bytes \u003d str(raw)"}],"source_content_type":"text/x-python","patch_set":6,"id":"962a769d_95cca45d","line":853,"in_reply_to":"f00ca9ca_06e07435","updated":"2026-07-21 13:40:22.000000000","message":"raw.upper().endswith(\u0027KB\u0027) makes this case-insensitive, equivalent to the suggested casefold() approach.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4c56998cb015a6de4eb59453a24b7879967f7246","unresolved":true,"context_lines":[{"line_number":910,"context_line":""},{"line_number":911,"context_line":"        records \u003d response.get(\u0027records\u0027, [])"},{"line_number":912,"context_line":"        if not records:"},{"line_number":913,"context_line":"            raise exception.SnapshotNotFound(snapshot_id\u003dsnapshot_name)"},{"line_number":914,"context_line":"        if len(records) \u003e 1:"},{"line_number":915,"context_line":"            msg \u003d _(\u0027Could not find unique snapshot %(snap)s on \u0027"},{"line_number":916,"context_line":"                    \u0027volume %(vol)s.\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e038783e_5571ee14","line":913,"updated":"2026-07-08 13:03:20.000000000","message":"should have log message before raise as well.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":910,"context_line":""},{"line_number":911,"context_line":"        records \u003d response.get(\u0027records\u0027, [])"},{"line_number":912,"context_line":"        if not records:"},{"line_number":913,"context_line":"            raise exception.SnapshotNotFound(snapshot_id\u003dsnapshot_name)"},{"line_number":914,"context_line":"        if len(records) \u003e 1:"},{"line_number":915,"context_line":"            msg \u003d _(\u0027Could not find unique snapshot %(snap)s on \u0027"},{"line_number":916,"context_line":"                    \u0027volume %(vol)s.\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"365389ac_e636451a","line":913,"in_reply_to":"e038783e_5571ee14","updated":"2026-07-21 13:40:22.000000000","message":"Done.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4c56998cb015a6de4eb59453a24b7879967f7246","unresolved":true,"context_lines":[{"line_number":923,"context_line":"        return {"},{"line_number":924,"context_line":"            \u0027name\u0027: snap_info[\u0027name\u0027],"},{"line_number":925,"context_line":"            \u0027volume\u0027: snap_info[\u0027volume\u0027][\u0027name\u0027],"},{"line_number":926,"context_line":"            \u0027busy\u0027: bool(owners),"},{"line_number":927,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":928,"context_line":"        }"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    @utils.retry(exception.SnapshotIsBusy)"}],"source_content_type":"text/x-python","patch_set":6,"id":"62482218_766660a7","line":927,"range":{"start_line":926,"start_character":12,"end_line":927,"end_character":29},"updated":"2026-07-08 13:03:20.000000000","message":"instead of keeping owners and busy, do we want to just keep owners and derive snapshot busy attribute on the fly?","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":923,"context_line":"        return {"},{"line_number":924,"context_line":"            \u0027name\u0027: snap_info[\u0027name\u0027],"},{"line_number":925,"context_line":"            \u0027volume\u0027: snap_info[\u0027volume\u0027][\u0027name\u0027],"},{"line_number":926,"context_line":"            \u0027busy\u0027: bool(owners),"},{"line_number":927,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":928,"context_line":"        }"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    @utils.retry(exception.SnapshotIsBusy)"}],"source_content_type":"text/x-python","patch_set":6,"id":"58fce35b_9b67a791","line":927,"range":{"start_line":926,"start_character":12,"end_line":927,"end_character":29},"in_reply_to":"62482218_766660a7","updated":"2026-07-21 13:40:22.000000000","message":"busy is kept in the dict to match ZAPI\u0027s get_snapshot() shape — ZAPI\u0027s wait_for_busy_snapshot reads snapshot[\u0027busy\u0027] directly (a real ONTAP-fetched field there), so REST returns the same key, just derived from owners since ONTAP REST has no standalone busy field for snapshots.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4c56998cb015a6de4eb59453a24b7879967f7246","unresolved":true,"context_lines":[{"line_number":951,"context_line":"    def rename_snapshot(self, volume, current_name, new_name):"},{"line_number":952,"context_line":"        \"\"\"Renames a snapshot.\"\"\""},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        volume_res \u003d self._get_volume_by_args(vol_name\u003dvolume)"},{"line_number":955,"context_line":"        query \u003d {"},{"line_number":956,"context_line":"            \u0027name\u0027: current_name,"},{"line_number":957,"context_line":"            \u0027fields\u0027: \u0027uuid\u0027,"},{"line_number":958,"context_line":"        }"},{"line_number":959,"context_line":"        response \u003d self.send_request("},{"line_number":960,"context_line":"            f\u0027/storage/volumes/{volume_res[\"uuid\"]}/snapshots\u0027,"},{"line_number":961,"context_line":"            \u0027get\u0027, query\u003dquery)"},{"line_number":962,"context_line":"        records \u003d response.get(\u0027records\u0027, [])"},{"line_number":963,"context_line":"        if not records:"}],"source_content_type":"text/x-python","patch_set":6,"id":"d980af72_b5a73ae6","line":960,"range":{"start_line":954,"start_character":0,"end_line":960,"end_character":63},"updated":"2026-07-08 13:03:20.000000000","message":"This code assumes that volume will always be found using name query param. Hope the error case is handled in get_volume_y_args? If not and it can return empty records, we should handle it here.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":951,"context_line":"    def rename_snapshot(self, volume, current_name, new_name):"},{"line_number":952,"context_line":"        \"\"\"Renames a snapshot.\"\"\""},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        volume_res \u003d self._get_volume_by_args(vol_name\u003dvolume)"},{"line_number":955,"context_line":"        query \u003d {"},{"line_number":956,"context_line":"            \u0027name\u0027: current_name,"},{"line_number":957,"context_line":"            \u0027fields\u0027: \u0027uuid\u0027,"},{"line_number":958,"context_line":"        }"},{"line_number":959,"context_line":"        response \u003d self.send_request("},{"line_number":960,"context_line":"            f\u0027/storage/volumes/{volume_res[\"uuid\"]}/snapshots\u0027,"},{"line_number":961,"context_line":"            \u0027get\u0027, query\u003dquery)"},{"line_number":962,"context_line":"        records \u003d response.get(\u0027records\u0027, [])"},{"line_number":963,"context_line":"        if not records:"}],"source_content_type":"text/x-python","patch_set":6,"id":"4abd1aa7_5bb39fdb","line":960,"range":{"start_line":954,"start_character":0,"end_line":960,"end_character":63},"in_reply_to":"d980af72_b5a73ae6","updated":"2026-07-21 13:40:22.000000000","message":"_get_volume_by_args always raises VolumeBackendAPIException if the volume isn\u0027t found (or if the name matches more than one volume), so it never returns empty. I think no extra handling needed here.","commit_id":"c9e71e284faef0167e92b0838f3982894578cb98"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"501fc2de31e86ea56ecc3ce580cdbd1c4e3e7ccb","unresolved":true,"context_lines":[{"line_number":923,"context_line":"                query\u003dquery)"},{"line_number":924,"context_line":"        except netapp_api.NaApiError:"},{"line_number":925,"context_line":"            LOG.debug(\u0027file-usage query failed for %s, returning 0\u0027, path)"},{"line_number":926,"context_line":"            return \u00270\u0027"},{"line_number":927,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":928,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":929,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."}],"source_content_type":"text/x-python","patch_set":11,"id":"2b0ce548_dc49c3c2","line":926,"updated":"2026-07-15 13:49:18.000000000","message":"Can you check if Na error is file not found and return zero. NaApiError can be have other error?","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":923,"context_line":"                query\u003dquery)"},{"line_number":924,"context_line":"        except netapp_api.NaApiError:"},{"line_number":925,"context_line":"            LOG.debug(\u0027file-usage query failed for %s, returning 0\u0027, path)"},{"line_number":926,"context_line":"            return \u00270\u0027"},{"line_number":927,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":928,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":929,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."}],"source_content_type":"text/x-python","patch_set":11,"id":"114b66eb_06677abc","line":926,"in_reply_to":"2b0ce548_dc49c3c2","updated":"2026-07-21 13:40:22.000000000","message":"Verified: \"file not found\" has its own distinct error code (917806), separate from other failures like a missing vserver (2621462, tested). get_file_usage now only returns \u00270\u0027 for that specific case; all other errors propagate instead of being silently swallowed. Confirmed live against the cluster with a non-existent file, an invalid vserver, and a real existing file.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"501fc2de31e86ea56ecc3ce580cdbd1c4e3e7ccb","unresolved":true,"context_lines":[{"line_number":1076,"context_line":"            LOG.debug(\u0027Submitted rename of snapshot %s to %s for deferred \u0027"},{"line_number":1077,"context_line":"                      \u0027deletion (fire-and-forget).\u0027, snapshot_name,"},{"line_number":1078,"context_line":"                      DELETED_PREFIX + snapshot_name)"},{"line_number":1079,"context_line":"        except Exception:"},{"line_number":1080,"context_line":"            LOG.warning(\u0027Could not rename snapshot %s for deferred deletion \u0027"},{"line_number":1081,"context_line":"                        \u0027(snapshot may still be busy). It will be cleaned up \u0027"},{"line_number":1082,"context_line":"                        \u0027when its dependents are removed.\u0027, snapshot_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"f3c20628_72843fff","line":1079,"updated":"2026-07-15 13:49:18.000000000","message":"hear Exception can be any exception and you are concluding that rename snapshot issue. Can you handle different exceptions.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"            LOG.debug(\u0027Submitted rename of snapshot %s to %s for deferred \u0027"},{"line_number":1077,"context_line":"                      \u0027deletion (fire-and-forget).\u0027, snapshot_name,"},{"line_number":1078,"context_line":"                      DELETED_PREFIX + snapshot_name)"},{"line_number":1079,"context_line":"        except Exception:"},{"line_number":1080,"context_line":"            LOG.warning(\u0027Could not rename snapshot %s for deferred deletion \u0027"},{"line_number":1081,"context_line":"                        \u0027(snapshot may still be busy). It will be cleaned up \u0027"},{"line_number":1082,"context_line":"                        \u0027when its dependents are removed.\u0027, snapshot_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5e231eb6_ff10e327","line":1079,"in_reply_to":"f3c20628_72843fff","updated":"2026-07-21 13:40:22.000000000","message":"Done.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":1102,"context_line":"                \u0027name\u0027: DELETED_PREFIX + \u0027*\u0027,"},{"line_number":1103,"context_line":"                \u0027fields\u0027: \u0027name,uuid,owners\u0027,"},{"line_number":1104,"context_line":"            }"},{"line_number":1105,"context_line":"            snap_response \u003d self.send_request("},{"line_number":1106,"context_line":"                f\u0027/storage/volumes/{volume[\"uuid\"]}/snapshots\u0027,"},{"line_number":1107,"context_line":"                \u0027get\u0027, query\u003dsnap_query)"},{"line_number":1108,"context_line":"            for snapshot_info in snap_response.get(\u0027records\u0027, []):"},{"line_number":1109,"context_line":"                # The ZAPI client filters busy snapshots out server-side via"},{"line_number":1110,"context_line":"                # ``busy\u003dfalse``; REST has no such filter, so skip any"}],"source_content_type":"text/x-python","patch_set":11,"id":"932f022c_ae89542f","line":1107,"range":{"start_line":1105,"start_character":12,"end_line":1107,"end_character":40},"updated":"2026-07-15 19:52:45.000000000","message":"If this failed for one volume, it raise the exception and stop processing for other volume. I is better to put this in try/except and add the error log is it fail for the volume and get the snapshot info for other volume and return it.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"                \u0027name\u0027: DELETED_PREFIX + \u0027*\u0027,"},{"line_number":1103,"context_line":"                \u0027fields\u0027: \u0027name,uuid,owners\u0027,"},{"line_number":1104,"context_line":"            }"},{"line_number":1105,"context_line":"            snap_response \u003d self.send_request("},{"line_number":1106,"context_line":"                f\u0027/storage/volumes/{volume[\"uuid\"]}/snapshots\u0027,"},{"line_number":1107,"context_line":"                \u0027get\u0027, query\u003dsnap_query)"},{"line_number":1108,"context_line":"            for snapshot_info in snap_response.get(\u0027records\u0027, []):"},{"line_number":1109,"context_line":"                # The ZAPI client filters busy snapshots out server-side via"},{"line_number":1110,"context_line":"                # ``busy\u003dfalse``; REST has no such filter, so skip any"}],"source_content_type":"text/x-python","patch_set":11,"id":"dad45c0e_626cf021","line":1107,"range":{"start_line":1105,"start_character":12,"end_line":1107,"end_character":40},"in_reply_to":"932f022c_ae89542f","updated":"2026-07-21 13:40:22.000000000","message":"Done.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2023,"context_line":"                    f\u0027.snapshot/{source_snapshot}/{src_path}\u0027)"},{"line_number":2024,"context_line":"                self.send_request(\u0027/storage/file/clone\u0027, \u0027post\u0027, body\u003dbody)"},{"line_number":2025,"context_line":"            else:"},{"line_number":2026,"context_line":"                # snapshot_directory_access_enabled is False on this FlexVol;"},{"line_number":2027,"context_line":"                # the .snapshot/ path is inaccessible.  Fall back to the"},{"line_number":2028,"context_line":"                # private CLI endpoint which resolves the snapshot by name"},{"line_number":2029,"context_line":"                # internally without requiring .snapshot/ visibility."},{"line_number":2030,"context_line":"                LOG.debug(\u0027clone_file: snapshot directory access disabled on \u0027"},{"line_number":2031,"context_line":"                          \u0027%(vol)s, using private CLI clone with \u0027"},{"line_number":2032,"context_line":"                          \u0027snapshot-name %(snap)s\u0027,"},{"line_number":2033,"context_line":"                          {\u0027vol\u0027: flex_vol, \u0027snap\u0027: source_snapshot})"},{"line_number":2034,"context_line":"                cli_body \u003d {"},{"line_number":2035,"context_line":"                    \u0027vserver\u0027: vserver,"},{"line_number":2036,"context_line":"                    \u0027volume\u0027: flex_vol,"},{"line_number":2037,"context_line":"                    \u0027source-path\u0027: src_path,"},{"line_number":2038,"context_line":"                    \u0027destination-path\u0027: dest_path,"},{"line_number":2039,"context_line":"                    \u0027snapshot-name\u0027: source_snapshot,"},{"line_number":2040,"context_line":"                }"},{"line_number":2041,"context_line":"                self.send_request("},{"line_number":2042,"context_line":"                    \u0027/private/cli/volume/file/clone\u0027, \u0027post\u0027, body\u003dcli_body)"},{"line_number":2043,"context_line":"        else:"},{"line_number":2044,"context_line":"            self.send_request(\u0027/storage/file/clone\u0027, \u0027post\u0027, body\u003dbody)"},{"line_number":2045,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"e5c2ae6d_758d4e55","line":2042,"range":{"start_line":2026,"start_character":16,"end_line":2042,"end_character":76},"updated":"2026-07-15 19:52:45.000000000","message":"Same as below, move these code to common and call the method from here","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2023,"context_line":"                    f\u0027.snapshot/{source_snapshot}/{src_path}\u0027)"},{"line_number":2024,"context_line":"                self.send_request(\u0027/storage/file/clone\u0027, \u0027post\u0027, body\u003dbody)"},{"line_number":2025,"context_line":"            else:"},{"line_number":2026,"context_line":"                # snapshot_directory_access_enabled is False on this FlexVol;"},{"line_number":2027,"context_line":"                # the .snapshot/ path is inaccessible.  Fall back to the"},{"line_number":2028,"context_line":"                # private CLI endpoint which resolves the snapshot by name"},{"line_number":2029,"context_line":"                # internally without requiring .snapshot/ visibility."},{"line_number":2030,"context_line":"                LOG.debug(\u0027clone_file: snapshot directory access disabled on \u0027"},{"line_number":2031,"context_line":"                          \u0027%(vol)s, using private CLI clone with \u0027"},{"line_number":2032,"context_line":"                          \u0027snapshot-name %(snap)s\u0027,"},{"line_number":2033,"context_line":"                          {\u0027vol\u0027: flex_vol, \u0027snap\u0027: source_snapshot})"},{"line_number":2034,"context_line":"                cli_body \u003d {"},{"line_number":2035,"context_line":"                    \u0027vserver\u0027: vserver,"},{"line_number":2036,"context_line":"                    \u0027volume\u0027: flex_vol,"},{"line_number":2037,"context_line":"                    \u0027source-path\u0027: src_path,"},{"line_number":2038,"context_line":"                    \u0027destination-path\u0027: dest_path,"},{"line_number":2039,"context_line":"                    \u0027snapshot-name\u0027: source_snapshot,"},{"line_number":2040,"context_line":"                }"},{"line_number":2041,"context_line":"                self.send_request("},{"line_number":2042,"context_line":"                    \u0027/private/cli/volume/file/clone\u0027, \u0027post\u0027, body\u003dcli_body)"},{"line_number":2043,"context_line":"        else:"},{"line_number":2044,"context_line":"            self.send_request(\u0027/storage/file/clone\u0027, \u0027post\u0027, body\u003dbody)"},{"line_number":2045,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"0b67bd0d_abde4da0","line":2042,"range":{"start_line":2026,"start_character":16,"end_line":2042,"end_character":76},"in_reply_to":"e5c2ae6d_758d4e55","updated":"2026-07-21 13:40:22.000000000","message":"Done.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"501fc2de31e86ea56ecc3ce580cdbd1c4e3e7ccb","unresolved":true,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"367ecd37_93aa5de6","line":2071,"updated":"2026-07-15 13:49:18.000000000","message":"why only 20 out of UUID is used?Using only snapshot_name[:20] makes this backend object name collision-prone. Two different snapshot IDs or names sharing the same first 20 characters will attempt to use the same ONTAP CG name.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"54578654_ffdfffb0","line":2071,"in_reply_to":"1ed4525a_3766f794","updated":"2026-07-28 12:54:23.000000000","message":"Fixed — a name conflict now raises a clear VolumeBackendAPIException instead of a raw ONTAP error, calling out a likely leftover orphaned CG for cleanup.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"e42d0e00_e88a838d","line":2071,"in_reply_to":"352c72e7_d97bcf42","updated":"2026-07-21 13:40:22.000000000","message":"ONTAP\u0027s CG name field has a hard 30-char limit (confirmed via testing: \"cinder-cg-\u003cuuid\u003e\" is an invalid value for field \"name\" (\u003ctext (size 0..30)\u003e)). With cinder-cg- taking 10 chars, only 20 remain for the identifier. Switched from a raw substring to a hashed identifier (first 20 hex chars of a SHA-256 hash of the snapshot name) for uniform distribution and negligible collision risk. Tested with unit tests and a live ONTAP cluster (iSCSI + NFS) — confirmed working.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"352c72e7_d97bcf42","line":2071,"in_reply_to":"367ecd37_93aa5de6","updated":"2026-07-15 19:52:45.000000000","message":"+1","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"c5e6432fee33c42ba7e672c0e1b9ea0769f17c6b","unresolved":true,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f282858_835c55de","line":2071,"in_reply_to":"54578654_ffdfffb0","updated":"2026-07-30 10:04:46.000000000","message":"Why we are not take the same approach for the name like we have taken for Manila ..?","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7321c4def2e9a7529f77c48d03367b13a52040bd","unresolved":false,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"190f55f1_442c1fc2","line":2071,"in_reply_to":"7f282858_835c55de","updated":"2026-07-30 12:00:12.000000000","message":"Done. Creating the same as Manila and also cinder replication code. Thanks.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"bf118f04ddff9420e10856d14c88d4f3d8e67c40","unresolved":true,"context_lines":[{"line_number":2068,"context_line":"                raise na_utils.NetAppDriverException("},{"line_number":2069,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":"        # Create ephemeral CG containing all the target FlexVols."},{"line_number":2072,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % snapshot_name[:20]"},{"line_number":2073,"context_line":"        cg_body \u003d {"},{"line_number":2074,"context_line":"            \u0027name\u0027: cg_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ed4525a_3766f794","line":2071,"in_reply_to":"e42d0e00_e88a838d","updated":"2026-07-27 05:24:46.000000000","message":"This could be ending with duplicate name on ONTAP, or if ONTAP doesn\u0027t support the duplicate name, it might failed the CG creation.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"501fc2de31e86ea56ecc3ce580cdbd1c4e3e7ccb","unresolved":true,"context_lines":[{"line_number":2102,"context_line":"            }"},{"line_number":2103,"context_line":"            self.send_request("},{"line_number":2104,"context_line":"                f\u0027/application/consistency-groups/{cg_uuid}/snapshots\u0027,"},{"line_number":2105,"context_line":"                \u0027post\u0027, body\u003dsnap_body)"},{"line_number":2106,"context_line":"        finally:"},{"line_number":2107,"context_line":"            # Always delete the ephemeral CG; snapshot survives on each volume."},{"line_number":2108,"context_line":"            self.send_request("}],"source_content_type":"text/x-python","patch_set":11,"id":"565869c8_88721be6","line":2105,"updated":"2026-07-15 13:49:18.000000000","message":"is REST call synchronous can you please check once... also \nThis finally block can mask the primary failure.\n\nIf creation of the CG snapshot raises and deletion of the ephemeral CG also raises, Python propagates the DELETE exception and the original snapshot-creation error is lost. Operators will receive a misleading failure reason, and the logs may not preserve the actual root cause.\n\nPlease preserve the primary exception and handle cleanup failure separately, for example by logging the cleanup exception with its traceback and re-raising the original exception. If snapshot creation succeeds but cleanup fails, that case can still raise an explicit cleanup exception because an orphaned CG remains.\n\nPlease add a test where both the snapshot POST and the CG DELETE fail and verify that the original snapshot error is preserved.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2102,"context_line":"            }"},{"line_number":2103,"context_line":"            self.send_request("},{"line_number":2104,"context_line":"                f\u0027/application/consistency-groups/{cg_uuid}/snapshots\u0027,"},{"line_number":2105,"context_line":"                \u0027post\u0027, body\u003dsnap_body)"},{"line_number":2106,"context_line":"        finally:"},{"line_number":2107,"context_line":"            # Always delete the ephemeral CG; snapshot survives on each volume."},{"line_number":2108,"context_line":"            self.send_request("}],"source_content_type":"text/x-python","patch_set":11,"id":"ced224bf_db688a0e","line":2105,"in_reply_to":"565869c8_88721be6","updated":"2026-07-15 19:52:45.000000000","message":"+1","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2102,"context_line":"            }"},{"line_number":2103,"context_line":"            self.send_request("},{"line_number":2104,"context_line":"                f\u0027/application/consistency-groups/{cg_uuid}/snapshots\u0027,"},{"line_number":2105,"context_line":"                \u0027post\u0027, body\u003dsnap_body)"},{"line_number":2106,"context_line":"        finally:"},{"line_number":2107,"context_line":"            # Always delete the ephemeral CG; snapshot survives on each volume."},{"line_number":2108,"context_line":"            self.send_request("}],"source_content_type":"text/x-python","patch_set":11,"id":"74dc0e37_d9112a0a","line":2105,"in_reply_to":"ced224bf_db688a0e","updated":"2026-07-21 13:40:22.000000000","message":"Verified against the live cluster: the CG snapshot POST returns HTTP 201 with no job — genuinely synchronous. CG creation is async (202+job) but already fully awaited by send_request\u0027s job-polling. Also reworked exception handling to preserve the primary snapshot-creation error over cleanup failures, and added a test for the both-fail scenario.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2136,"context_line":"            if snap_dir_access:"},{"line_number":2137,"context_line":"                source_path +\u003d f\u0027/.snapshot/{source_snapshot}\u0027"},{"line_number":2138,"context_line":"            else:"},{"line_number":2139,"context_line":"                # snapshot_directory_access_enabled is False; fall back to"},{"line_number":2140,"context_line":"                # the private CLI endpoint which resolves the snapshot by"},{"line_number":2141,"context_line":"                # name without relying on .snapshot/ path visibility."},{"line_number":2142,"context_line":"                LOG.debug(\u0027clone_lun: snapshot directory access disabled on \u0027"},{"line_number":2143,"context_line":"                          \u0027%(vol)s, using private CLI clone with \u0027"},{"line_number":2144,"context_line":"                          \u0027snapshot-name %(snap)s\u0027,"},{"line_number":2145,"context_line":"                          {\u0027vol\u0027: volume, \u0027snap\u0027: source_snapshot})"},{"line_number":2146,"context_line":"                cli_body \u003d {"},{"line_number":2147,"context_line":"                    \u0027vserver\u0027: self.vserver,"},{"line_number":2148,"context_line":"                    \u0027volume\u0027: volume,"},{"line_number":2149,"context_line":"                    \u0027source-path\u0027: name,"},{"line_number":2150,"context_line":"                    \u0027destination-path\u0027: new_name,"},{"line_number":2151,"context_line":"                    \u0027snapshot-name\u0027: source_snapshot,"},{"line_number":2152,"context_line":"                }"},{"line_number":2153,"context_line":"                self.send_request("},{"line_number":2154,"context_line":"                    \u0027/private/cli/volume/file/clone\u0027, \u0027post\u0027, body\u003dcli_body)"},{"line_number":2155,"context_line":"                # After the private CLI file-level clone, ONTAP may take a"},{"line_number":2156,"context_line":"                # moment to register the new LUN in the management catalog."},{"line_number":2157,"context_line":"                # Poll until the LUN appears or we exhaust retries."},{"line_number":2158,"context_line":"                lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2159,"context_line":"                for attempt in range(6):"},{"line_number":2160,"context_line":"                    luns \u003d self.get_lun_by_args("}],"source_content_type":"text/x-python","patch_set":11,"id":"a8e9ee6a_9d00085f","line":2157,"range":{"start_line":2139,"start_character":16,"end_line":2157,"end_character":67},"updated":"2026-07-15 19:52:45.000000000","message":"Move this whole lines of code to separate method called _clone_lun_via_private_cli , code should look like as below \nelse:\n                self._clone_lun_via_private_cli(\n                    volume, name, new_name, source_snapshot)\n                return","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2136,"context_line":"            if snap_dir_access:"},{"line_number":2137,"context_line":"                source_path +\u003d f\u0027/.snapshot/{source_snapshot}\u0027"},{"line_number":2138,"context_line":"            else:"},{"line_number":2139,"context_line":"                # snapshot_directory_access_enabled is False; fall back to"},{"line_number":2140,"context_line":"                # the private CLI endpoint which resolves the snapshot by"},{"line_number":2141,"context_line":"                # name without relying on .snapshot/ path visibility."},{"line_number":2142,"context_line":"                LOG.debug(\u0027clone_lun: snapshot directory access disabled on \u0027"},{"line_number":2143,"context_line":"                          \u0027%(vol)s, using private CLI clone with \u0027"},{"line_number":2144,"context_line":"                          \u0027snapshot-name %(snap)s\u0027,"},{"line_number":2145,"context_line":"                          {\u0027vol\u0027: volume, \u0027snap\u0027: source_snapshot})"},{"line_number":2146,"context_line":"                cli_body \u003d {"},{"line_number":2147,"context_line":"                    \u0027vserver\u0027: self.vserver,"},{"line_number":2148,"context_line":"                    \u0027volume\u0027: volume,"},{"line_number":2149,"context_line":"                    \u0027source-path\u0027: name,"},{"line_number":2150,"context_line":"                    \u0027destination-path\u0027: new_name,"},{"line_number":2151,"context_line":"                    \u0027snapshot-name\u0027: source_snapshot,"},{"line_number":2152,"context_line":"                }"},{"line_number":2153,"context_line":"                self.send_request("},{"line_number":2154,"context_line":"                    \u0027/private/cli/volume/file/clone\u0027, \u0027post\u0027, body\u003dcli_body)"},{"line_number":2155,"context_line":"                # After the private CLI file-level clone, ONTAP may take a"},{"line_number":2156,"context_line":"                # moment to register the new LUN in the management catalog."},{"line_number":2157,"context_line":"                # Poll until the LUN appears or we exhaust retries."},{"line_number":2158,"context_line":"                lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2159,"context_line":"                for attempt in range(6):"},{"line_number":2160,"context_line":"                    luns \u003d self.get_lun_by_args("}],"source_content_type":"text/x-python","patch_set":11,"id":"92919f14_797a1606","line":2157,"range":{"start_line":2139,"start_character":16,"end_line":2157,"end_character":67},"in_reply_to":"a8e9ee6a_9d00085f","updated":"2026-07-21 13:40:22.000000000","message":"Done.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2156,"context_line":"                # moment to register the new LUN in the management catalog."},{"line_number":2157,"context_line":"                # Poll until the LUN appears or we exhaust retries."},{"line_number":2158,"context_line":"                lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2159,"context_line":"                for attempt in range(6):"},{"line_number":2160,"context_line":"                    luns \u003d self.get_lun_by_args("},{"line_number":2161,"context_line":"                        vserver\u003dself.vserver, path\u003dlun_path)"},{"line_number":2162,"context_line":"                    if luns:"}],"source_content_type":"text/x-python","patch_set":11,"id":"0f7bafa2_4e6e735d","line":2159,"range":{"start_line":2159,"start_character":31,"end_line":2159,"end_character":40},"updated":"2026-07-15 19:52:45.000000000","message":"why 6 attempt, this should not be hardcoded","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2156,"context_line":"                # moment to register the new LUN in the management catalog."},{"line_number":2157,"context_line":"                # Poll until the LUN appears or we exhaust retries."},{"line_number":2158,"context_line":"                lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2159,"context_line":"                for attempt in range(6):"},{"line_number":2160,"context_line":"                    luns \u003d self.get_lun_by_args("},{"line_number":2161,"context_line":"                        vserver\u003dself.vserver, path\u003dlun_path)"},{"line_number":2162,"context_line":"                    if luns:"}],"source_content_type":"text/x-python","patch_set":11,"id":"57cca08a_8ba58848","line":2159,"range":{"start_line":2159,"start_character":31,"end_line":2159,"end_character":40},"in_reply_to":"0f7bafa2_4e6e735d","updated":"2026-07-21 13:40:22.000000000","message":"The retry loop is gone entirely, replaced by a single immediate check (no hardcoded attempt count anymore).","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2155,"context_line":"                # After the private CLI file-level clone, ONTAP may take a"},{"line_number":2156,"context_line":"                # moment to register the new LUN in the management catalog."},{"line_number":2157,"context_line":"                # Poll until the LUN appears or we exhaust retries."},{"line_number":2158,"context_line":"                lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2159,"context_line":"                for attempt in range(6):"},{"line_number":2160,"context_line":"                    luns \u003d self.get_lun_by_args("},{"line_number":2161,"context_line":"                        vserver\u003dself.vserver, path\u003dlun_path)"},{"line_number":2162,"context_line":"                    if luns:"},{"line_number":2163,"context_line":"                        LOG.debug(\u0027clone_lun via private CLI: LUN %s is \u0027"},{"line_number":2164,"context_line":"                                  \u0027visible after %d poll(s)\u0027, lun_path,"},{"line_number":2165,"context_line":"                                  attempt + 1)"},{"line_number":2166,"context_line":"                        return"},{"line_number":2167,"context_line":"                    _time.sleep(1)"},{"line_number":2168,"context_line":"                LOG.warning(\u0027clone_lun via private CLI: LUN %s not visible \u0027"},{"line_number":2169,"context_line":"                            \u0027after polling; returning anyway.\u0027, lun_path)"},{"line_number":2170,"context_line":"                return"},{"line_number":2171,"context_line":"        source_path +\u003d f\u0027/{name}\u0027"},{"line_number":2172,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"eeed3d42_cf776fd0","line":2169,"range":{"start_line":2158,"start_character":16,"end_line":2169,"end_character":73},"updated":"2026-07-15 19:52:45.000000000","message":"Move this to separate method as suggested","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2155,"context_line":"                # After the private CLI file-level clone, ONTAP may take a"},{"line_number":2156,"context_line":"                # moment to register the new LUN in the management catalog."},{"line_number":2157,"context_line":"                # Poll until the LUN appears or we exhaust retries."},{"line_number":2158,"context_line":"                lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2159,"context_line":"                for attempt in range(6):"},{"line_number":2160,"context_line":"                    luns \u003d self.get_lun_by_args("},{"line_number":2161,"context_line":"                        vserver\u003dself.vserver, path\u003dlun_path)"},{"line_number":2162,"context_line":"                    if luns:"},{"line_number":2163,"context_line":"                        LOG.debug(\u0027clone_lun via private CLI: LUN %s is \u0027"},{"line_number":2164,"context_line":"                                  \u0027visible after %d poll(s)\u0027, lun_path,"},{"line_number":2165,"context_line":"                                  attempt + 1)"},{"line_number":2166,"context_line":"                        return"},{"line_number":2167,"context_line":"                    _time.sleep(1)"},{"line_number":2168,"context_line":"                LOG.warning(\u0027clone_lun via private CLI: LUN %s not visible \u0027"},{"line_number":2169,"context_line":"                            \u0027after polling; returning anyway.\u0027, lun_path)"},{"line_number":2170,"context_line":"                return"},{"line_number":2171,"context_line":"        source_path +\u003d f\u0027/{name}\u0027"},{"line_number":2172,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"8ff47f9a_21e2a879","line":2169,"range":{"start_line":2158,"start_character":16,"end_line":2169,"end_character":73},"in_reply_to":"eeed3d42_cf776fd0","updated":"2026-07-21 13:40:22.000000000","message":"Done. Addressed as part of the comment https://review.opendev.org/c/openstack/cinder/+/993363/comment/0f7bafa2_4e6e735d/","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":2191,"context_line":""},{"line_number":2192,"context_line":"        self.send_request(\u0027/storage/luns\u0027, \u0027post\u0027, body\u003dbody)"},{"line_number":2193,"context_line":""},{"line_number":2194,"context_line":"        # ONTAP may take a moment to register the new LUN in the management"},{"line_number":2195,"context_line":"        # catalog after the REST clone POST returns. Poll until visible."},{"line_number":2196,"context_line":"        lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2197,"context_line":"        for attempt in range(6):"},{"line_number":2198,"context_line":"            luns \u003d self.get_lun_by_args(vserver\u003dself.vserver, path\u003dlun_path)"},{"line_number":2199,"context_line":"            if luns:"},{"line_number":2200,"context_line":"                LOG.debug(\u0027clone_lun via REST: LUN %s is visible after \u0027"},{"line_number":2201,"context_line":"                          \u0027%d poll(s)\u0027, lun_path, attempt + 1)"},{"line_number":2202,"context_line":"                return"},{"line_number":2203,"context_line":"            _time.sleep(1)"},{"line_number":2204,"context_line":"        LOG.warning(\u0027clone_lun via REST: LUN %s not visible after \u0027"},{"line_number":2205,"context_line":"                    \u0027polling; returning anyway.\u0027, lun_path)"},{"line_number":2206,"context_line":""},{"line_number":2207,"context_line":"    def destroy_lun(self, path, force\u003dTrue):"},{"line_number":2208,"context_line":"        \"\"\"Destroys the LUN at the path.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"fdbda540_9e1ab5dc","line":2205,"range":{"start_line":2194,"start_character":8,"end_line":2205,"end_character":59},"updated":"2026-07-15 19:52:45.000000000","message":"This is dup code, I will recommand to create the separate method and add this code in that method and call it from here and else condition where you are creating the clone using private CLI.\n\nOne more question, why we need to pool it and why we are registering it to management catalog.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":2191,"context_line":""},{"line_number":2192,"context_line":"        self.send_request(\u0027/storage/luns\u0027, \u0027post\u0027, body\u003dbody)"},{"line_number":2193,"context_line":""},{"line_number":2194,"context_line":"        # ONTAP may take a moment to register the new LUN in the management"},{"line_number":2195,"context_line":"        # catalog after the REST clone POST returns. Poll until visible."},{"line_number":2196,"context_line":"        lun_path \u003d f\u0027/vol/{volume}/{new_name}\u0027"},{"line_number":2197,"context_line":"        for attempt in range(6):"},{"line_number":2198,"context_line":"            luns \u003d self.get_lun_by_args(vserver\u003dself.vserver, path\u003dlun_path)"},{"line_number":2199,"context_line":"            if luns:"},{"line_number":2200,"context_line":"                LOG.debug(\u0027clone_lun via REST: LUN %s is visible after \u0027"},{"line_number":2201,"context_line":"                          \u0027%d poll(s)\u0027, lun_path, attempt + 1)"},{"line_number":2202,"context_line":"                return"},{"line_number":2203,"context_line":"            _time.sleep(1)"},{"line_number":2204,"context_line":"        LOG.warning(\u0027clone_lun via REST: LUN %s not visible after \u0027"},{"line_number":2205,"context_line":"                    \u0027polling; returning anyway.\u0027, lun_path)"},{"line_number":2206,"context_line":""},{"line_number":2207,"context_line":"    def destroy_lun(self, path, force\u003dTrue):"},{"line_number":2208,"context_line":"        \"\"\"Destroys the LUN at the path.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"a0ee961b_b4960fcb","line":2205,"range":{"start_line":2194,"start_character":8,"end_line":2205,"end_character":59},"in_reply_to":"fdbda540_9e1ab5dc","updated":"2026-07-21 13:40:22.000000000","message":"Extracted the polling code into a shared _check_lun_visible() helper, used by both the private-CLI and REST clone paths. On the \"why poll\" question: tested live against ONTAP — both clone endpoints return synchronous success (201/200, not an async 202 job) and the LUN is visible immediately, no delay. So replaced the 6-attempt retry loop with a single check that just logs a warning if the LUN isn\u0027t found.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":683,"context_line":"        state \u003d response[\u0027records\u0027][0][\u0027efficiency\u0027][\u0027state\u0027]"},{"line_number":684,"context_line":"        compression \u003d response[\u0027records\u0027][0][\u0027efficiency\u0027][\u0027compression\u0027]"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        # TODO(nahimsouza): as soon as the public REST API supports the fields"},{"line_number":687,"context_line":"        # \u0027logical-data-size\u0027 and \u0027logical-data-limit\u0027 via /storage/volumes,"},{"line_number":688,"context_line":"        # we should move away from the private CLI endpoint below and fetch"},{"line_number":689,"context_line":"        # them directly in the main query above."},{"line_number":690,"context_line":"        logical_data_size \u003d 0"},{"line_number":691,"context_line":"        logical_data_limit \u003d 1"},{"line_number":692,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"79f30472_caa8768c","line":689,"range":{"start_line":686,"start_character":8,"end_line":689,"end_character":48},"updated":"2026-07-27 06:18:03.000000000","message":"Please add a fresh TODO to remove private CLI instead of editing existing one.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":683,"context_line":"        state \u003d response[\u0027records\u0027][0][\u0027efficiency\u0027][\u0027state\u0027]"},{"line_number":684,"context_line":"        compression \u003d response[\u0027records\u0027][0][\u0027efficiency\u0027][\u0027compression\u0027]"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        # TODO(nahimsouza): as soon as the public REST API supports the fields"},{"line_number":687,"context_line":"        # \u0027logical-data-size\u0027 and \u0027logical-data-limit\u0027 via /storage/volumes,"},{"line_number":688,"context_line":"        # we should move away from the private CLI endpoint below and fetch"},{"line_number":689,"context_line":"        # them directly in the main query above."},{"line_number":690,"context_line":"        logical_data_size \u003d 0"},{"line_number":691,"context_line":"        logical_data_limit \u003d 1"},{"line_number":692,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"e64e9027_fb207d62","line":689,"range":{"start_line":686,"start_character":8,"end_line":689,"end_character":48},"in_reply_to":"79f30472_caa8768c","updated":"2026-07-28 12:54:23.000000000","message":"Done.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":707,"context_line":"                logical_data_limit \u003d int("},{"line_number":708,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        except netapp_api.NaApiError:"},{"line_number":711,"context_line":"            LOG.exception("},{"line_number":712,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":713,"context_line":"                flexvol_name)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        return {"},{"line_number":716,"context_line":"            \u0027compression\u0027: False if compression \u003d\u003d \u0027none\u0027 else True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9408b12c_2832251d","line":713,"range":{"start_line":710,"start_character":0,"end_line":713,"end_character":29},"updated":"2026-07-27 06:18:03.000000000","message":"Any particular reason we are not raising the exception back?","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":707,"context_line":"                logical_data_limit \u003d int("},{"line_number":708,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        except netapp_api.NaApiError:"},{"line_number":711,"context_line":"            LOG.exception("},{"line_number":712,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":713,"context_line":"                flexvol_name)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        return {"},{"line_number":716,"context_line":"            \u0027compression\u0027: False if compression \u003d\u003d \u0027none\u0027 else True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"cee0a13b_6eb3fa18","line":713,"range":{"start_line":710,"start_character":0,"end_line":713,"end_character":29},"in_reply_to":"9408b12c_2832251d","updated":"2026-07-28 12:54:23.000000000","message":"It was intentional - this is best-effort supplementary data (private CLI often fails with insufficient privileges). The caller loop has no try/except, so raising would abort stats collection for all flexvols over one failure. Falls back to defaults, same as the primary query above. Covered by test_get_flexvol_dedupe_info_api_insufficient_privileges.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":749,"context_line":"            response \u003d self.send_request("},{"line_number":750,"context_line":"                \u0027/storage/file/clone/split-status\u0027, \u0027get\u0027,"},{"line_number":751,"context_line":"                query\u003dquery)"},{"line_number":752,"context_line":"        except netapp_api.NaApiError as e:"},{"line_number":753,"context_line":"            LOG.exception(\"Failed to get clone split info for volume \""},{"line_number":754,"context_line":"                          \"%(volume_name)s on vserver %(svm_name)s. \""},{"line_number":755,"context_line":"                          \"Error: %(error)s\","},{"line_number":756,"context_line":"                          {\u0027volume_name\u0027: volume_name,"},{"line_number":757,"context_line":"                           \u0027svm_name\u0027: self.vserver,"},{"line_number":758,"context_line":"                           \u0027error\u0027: e})"},{"line_number":759,"context_line":"            return no_clone_split_response"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        if response.get(\u0027num_records\u0027, 0) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":13,"id":"0960d7aa_519c00a4","line":758,"range":{"start_line":752,"start_character":8,"end_line":758,"end_character":39},"updated":"2026-07-27 06:18:03.000000000","message":"Dont we need to raise the exception?","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":749,"context_line":"            response \u003d self.send_request("},{"line_number":750,"context_line":"                \u0027/storage/file/clone/split-status\u0027, \u0027get\u0027,"},{"line_number":751,"context_line":"                query\u003dquery)"},{"line_number":752,"context_line":"        except netapp_api.NaApiError as e:"},{"line_number":753,"context_line":"            LOG.exception(\"Failed to get clone split info for volume \""},{"line_number":754,"context_line":"                          \"%(volume_name)s on vserver %(svm_name)s. \""},{"line_number":755,"context_line":"                          \"Error: %(error)s\","},{"line_number":756,"context_line":"                          {\u0027volume_name\u0027: volume_name,"},{"line_number":757,"context_line":"                           \u0027svm_name\u0027: self.vserver,"},{"line_number":758,"context_line":"                           \u0027error\u0027: e})"},{"line_number":759,"context_line":"            return no_clone_split_response"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        if response.get(\u0027num_records\u0027, 0) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ae30a9f4_fa47bd54","line":758,"range":{"start_line":752,"start_character":8,"end_line":758,"end_character":39},"in_reply_to":"0960d7aa_519c00a4","updated":"2026-07-28 12:54:23.000000000","message":"Matches existing ZAPI behavior (client_cmode.py\u0027s get_clone_split_info does the same catch/log/return-defaults, no raise). Callers in all three drivers (block_cmode.py, nfs_cmode.py, nvme_library.py) invoke this with no try/except in a per-flexvol stats loop; raising would abort stats collection for other flexvols. Verified parity holds at both the method and caller-chain level.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":1064,"context_line":"        \"\"\""},{"line_number":1065,"context_line":"        try:"},{"line_number":1066,"context_line":"            volume_res \u003d self._get_volume_by_args(vol_name\u003dvolume)"},{"line_number":1067,"context_line":"        except Exception:"},{"line_number":1068,"context_line":"            LOG.exception(\u0027Could not look up volume %s for deferred \u0027"},{"line_number":1069,"context_line":"                          \u0027deletion of snapshot %s; skipping rename.\u0027,"},{"line_number":1070,"context_line":"                          volume, snapshot_name)"},{"line_number":1071,"context_line":"            return"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"cff108b2_29637d81","line":1070,"range":{"start_line":1067,"start_character":7,"end_line":1070,"end_character":48},"updated":"2026-07-27 06:18:03.000000000","message":"except but no raise.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        \"\"\""},{"line_number":1065,"context_line":"        try:"},{"line_number":1066,"context_line":"            volume_res \u003d self._get_volume_by_args(vol_name\u003dvolume)"},{"line_number":1067,"context_line":"        except Exception:"},{"line_number":1068,"context_line":"            LOG.exception(\u0027Could not look up volume %s for deferred \u0027"},{"line_number":1069,"context_line":"                          \u0027deletion of snapshot %s; skipping rename.\u0027,"},{"line_number":1070,"context_line":"                          volume, snapshot_name)"},{"line_number":1071,"context_line":"            return"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"89015b28_12cd4bff","line":1070,"range":{"start_line":1067,"start_character":7,"end_line":1070,"end_character":48},"in_reply_to":"cff108b2_29637d81","updated":"2026-07-28 12:54:23.000000000","message":"The primary group snapshot and volume clones have already succeeded by this point, so failing the whole operation over this cleanup rename would be misleading.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":1089,"context_line":"            LOG.debug(\u0027Submitted rename of snapshot %s to %s for deferred \u0027"},{"line_number":1090,"context_line":"                      \u0027deletion (fire-and-forget).\u0027, snapshot_name,"},{"line_number":1091,"context_line":"                      DELETED_PREFIX + snapshot_name)"},{"line_number":1092,"context_line":"        except netapp_api.NaApiError:"},{"line_number":1093,"context_line":"            LOG.warning(\u0027Could not rename snapshot %s for deferred deletion \u0027"},{"line_number":1094,"context_line":"                        \u0027(snapshot may still be busy). It will be cleaned up \u0027"},{"line_number":1095,"context_line":"                        \u0027when its dependents are removed.\u0027, snapshot_name)"},{"line_number":1096,"context_line":"        except Exception:"},{"line_number":1097,"context_line":"            LOG.exception(\u0027Unexpected error renaming snapshot %s for \u0027"},{"line_number":1098,"context_line":"                          \u0027deferred deletion.\u0027, snapshot_name)"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":"    def get_snapshots_marked_for_deletion(self):"},{"line_number":1101,"context_line":"        \"\"\"Get a list of snapshots marked for deletion.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"452987b4_4c716bc7","line":1098,"range":{"start_line":1092,"start_character":8,"end_line":1098,"end_character":62},"updated":"2026-07-27 06:18:03.000000000","message":"Same comment as above.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"            LOG.debug(\u0027Submitted rename of snapshot %s to %s for deferred \u0027"},{"line_number":1090,"context_line":"                      \u0027deletion (fire-and-forget).\u0027, snapshot_name,"},{"line_number":1091,"context_line":"                      DELETED_PREFIX + snapshot_name)"},{"line_number":1092,"context_line":"        except netapp_api.NaApiError:"},{"line_number":1093,"context_line":"            LOG.warning(\u0027Could not rename snapshot %s for deferred deletion \u0027"},{"line_number":1094,"context_line":"                        \u0027(snapshot may still be busy). It will be cleaned up \u0027"},{"line_number":1095,"context_line":"                        \u0027when its dependents are removed.\u0027, snapshot_name)"},{"line_number":1096,"context_line":"        except Exception:"},{"line_number":1097,"context_line":"            LOG.exception(\u0027Unexpected error renaming snapshot %s for \u0027"},{"line_number":1098,"context_line":"                          \u0027deferred deletion.\u0027, snapshot_name)"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":"    def get_snapshots_marked_for_deletion(self):"},{"line_number":1101,"context_line":"        \"\"\"Get a list of snapshots marked for deletion.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"755221fc_b87e74a1","line":1098,"range":{"start_line":1092,"start_character":8,"end_line":1098,"end_character":62},"in_reply_to":"452987b4_4c716bc7","updated":"2026-07-28 12:54:23.000000000","message":"Explained above.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":2016,"context_line":"        on the FlexVol, since the .snapshot/ path is then inaccessible and"},{"line_number":2017,"context_line":"        the REST clone APIs cannot resolve the source snapshot directly."},{"line_number":2018,"context_line":"        \"\"\""},{"line_number":2019,"context_line":"        LOG.debug(\u0027Cloning via private CLI - volume %(vol)s, src \u0027"},{"line_number":2020,"context_line":"                  \u0027%(src)s, dest %(dest)s, snapshot-name %(snap)s\u0027,"},{"line_number":2021,"context_line":"                  {\u0027vol\u0027: volume, \u0027src\u0027: src_path, \u0027dest\u0027: dest_path,"},{"line_number":2022,"context_line":"                   \u0027snap\u0027: source_snapshot})"}],"source_content_type":"text/x-python","patch_set":13,"id":"0382bc75_973eb260","line":2019,"updated":"2026-07-27 06:18:03.000000000","message":"We do not need to log private CLI. The method name is sufficient.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":2016,"context_line":"        on the FlexVol, since the .snapshot/ path is then inaccessible and"},{"line_number":2017,"context_line":"        the REST clone APIs cannot resolve the source snapshot directly."},{"line_number":2018,"context_line":"        \"\"\""},{"line_number":2019,"context_line":"        LOG.debug(\u0027Cloning via private CLI - volume %(vol)s, src \u0027"},{"line_number":2020,"context_line":"                  \u0027%(src)s, dest %(dest)s, snapshot-name %(snap)s\u0027,"},{"line_number":2021,"context_line":"                  {\u0027vol\u0027: volume, \u0027src\u0027: src_path, \u0027dest\u0027: dest_path,"},{"line_number":2022,"context_line":"                   \u0027snap\u0027: source_snapshot})"}],"source_content_type":"text/x-python","patch_set":13,"id":"e4e44c7c_cdbea8ca","line":2019,"in_reply_to":"0382bc75_973eb260","updated":"2026-07-28 12:54:23.000000000","message":"Done.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":2084,"context_line":"        mirroring the ZAPI cg-start/cg-commit behaviour."},{"line_number":2085,"context_line":"        \"\"\""},{"line_number":2086,"context_line":"        # Pre-check: raise if any FlexVol already belongs to an existing CG."},{"line_number":2087,"context_line":"        for vol_name in volume_names:"},{"line_number":2088,"context_line":"            query \u003d {"},{"line_number":2089,"context_line":"                \u0027volumes.name\u0027: vol_name,"},{"line_number":2090,"context_line":"                \u0027svm.name\u0027: self.vserver,"}],"source_content_type":"text/x-python","patch_set":13,"id":"86226e09_2457899b","line":2087,"updated":"2026-07-27 06:18:03.000000000","message":"Should we check if volume_names length is \u003e0?","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"fe2be705362aa6fb1fa5c80784a6bb71a4c8655a","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        mirroring the ZAPI cg-start/cg-commit behaviour."},{"line_number":2085,"context_line":"        \"\"\""},{"line_number":2086,"context_line":"        # Pre-check: raise if any FlexVol already belongs to an existing CG."},{"line_number":2087,"context_line":"        for vol_name in volume_names:"},{"line_number":2088,"context_line":"            query \u003d {"},{"line_number":2089,"context_line":"                \u0027volumes.name\u0027: vol_name,"},{"line_number":2090,"context_line":"                \u0027svm.name\u0027: self.vserver,"}],"source_content_type":"text/x-python","patch_set":13,"id":"a22518fa_f4dbcfe5","line":2087,"in_reply_to":"5d73c984_b955b9bb","updated":"2026-07-30 10:07:36.000000000","message":"Please add a UT for covering this scenario.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        mirroring the ZAPI cg-start/cg-commit behaviour."},{"line_number":2085,"context_line":"        \"\"\""},{"line_number":2086,"context_line":"        # Pre-check: raise if any FlexVol already belongs to an existing CG."},{"line_number":2087,"context_line":"        for vol_name in volume_names:"},{"line_number":2088,"context_line":"            query \u003d {"},{"line_number":2089,"context_line":"                \u0027volumes.name\u0027: vol_name,"},{"line_number":2090,"context_line":"                \u0027svm.name\u0027: self.vserver,"}],"source_content_type":"text/x-python","patch_set":13,"id":"5d73c984_b955b9bb","line":2087,"in_reply_to":"86226e09_2457899b","updated":"2026-07-28 12:54:23.000000000","message":"Done — added an explicit check that raises NetAppDriverException for an empty volume_names list before any API call is made.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7321c4def2e9a7529f77c48d03367b13a52040bd","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        mirroring the ZAPI cg-start/cg-commit behaviour."},{"line_number":2085,"context_line":"        \"\"\""},{"line_number":2086,"context_line":"        # Pre-check: raise if any FlexVol already belongs to an existing CG."},{"line_number":2087,"context_line":"        for vol_name in volume_names:"},{"line_number":2088,"context_line":"            query \u003d {"},{"line_number":2089,"context_line":"                \u0027volumes.name\u0027: vol_name,"},{"line_number":2090,"context_line":"                \u0027svm.name\u0027: self.vserver,"}],"source_content_type":"text/x-python","patch_set":13,"id":"e381d786_dcc2016e","line":2087,"in_reply_to":"a22518fa_f4dbcfe5","updated":"2026-07-30 12:00:12.000000000","message":"Done.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":2101,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2102,"context_line":""},{"line_number":2103,"context_line":"        name_hash \u003d hashlib.sha256(snapshot_name.encode(\u0027utf-8\u0027)).hexdigest()"},{"line_number":2104,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % name_hash[:20]"},{"line_number":2105,"context_line":"        cg_body \u003d {"},{"line_number":2106,"context_line":"            \u0027name\u0027: cg_name,"},{"line_number":2107,"context_line":"            \u0027svm\u0027: {\u0027name\u0027: self.vserver},"}],"source_content_type":"text/x-python","patch_set":13,"id":"7c720dcd_99d1c1a1","line":2104,"updated":"2026-07-27 06:18:03.000000000","message":"the cg name template should be a constant. Also we need to be consistent in naming the CGs across our use cases. Lets take the naming convention used for replication.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":2101,"context_line":"                    msg % {\u0027vol\u0027: vol_name, \u0027cg\u0027: existing_cg})"},{"line_number":2102,"context_line":""},{"line_number":2103,"context_line":"        name_hash \u003d hashlib.sha256(snapshot_name.encode(\u0027utf-8\u0027)).hexdigest()"},{"line_number":2104,"context_line":"        cg_name \u003d \u0027cinder-cg-%s\u0027 % name_hash[:20]"},{"line_number":2105,"context_line":"        cg_body \u003d {"},{"line_number":2106,"context_line":"            \u0027name\u0027: cg_name,"},{"line_number":2107,"context_line":"            \u0027svm\u0027: {\u0027name\u0027: self.vserver},"}],"source_content_type":"text/x-python","patch_set":13,"id":"b5983e3b_27e9a08d","line":2104,"in_reply_to":"7c720dcd_99d1c1a1","updated":"2026-07-28 12:54:23.000000000","message":"Done — extracted to a module-level constant CG_NAME_PREFIX \u003d \u0027cg_cinder_\u0027, matching the cg_cinder_ naming style used by the replication CG in data_motion.py.\n \nCouldn\u0027t keep a distinguishing suffix like _temp/_pool — ONTAP\u0027s CG name field has a hard 30-char limit, and the 20-char hash already consumes most of it.\n\nThe two remain distinguishable anyway: replication\u0027s CG is persistent and named cg_cinder_pool_\u003ctimestamp\u003e, while this one is ephemeral (created/snapshotted/deleted within a single call) and named cg_cinder_\u003chash\u003e. Verified live against the cluster (both the 30-char name and a forced duplicate-name conflict).","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":2136,"context_line":"            self.send_request("},{"line_number":2137,"context_line":"                f\u0027/application/consistency-groups/{cg_uuid}/snapshots\u0027,"},{"line_number":2138,"context_line":"                \u0027post\u0027, body\u003dsnap_body)"},{"line_number":2139,"context_line":"        except Exception as exc:"},{"line_number":2140,"context_line":"            primary_exc \u003d exc"},{"line_number":2141,"context_line":"            LOG.exception(\u0027Failed to create CG snapshot %s.\u0027, snapshot_name)"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        try:"},{"line_number":2144,"context_line":"            # Always delete the ephemeral CG; snapshot survives on each volume."}],"source_content_type":"text/x-python","patch_set":13,"id":"b5152baa_f9a8f1d8","line":2141,"range":{"start_line":2139,"start_character":8,"end_line":2141,"end_character":76},"updated":"2026-07-27 06:18:03.000000000","message":"exception should be raised?","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":2136,"context_line":"            self.send_request("},{"line_number":2137,"context_line":"                f\u0027/application/consistency-groups/{cg_uuid}/snapshots\u0027,"},{"line_number":2138,"context_line":"                \u0027post\u0027, body\u003dsnap_body)"},{"line_number":2139,"context_line":"        except Exception as exc:"},{"line_number":2140,"context_line":"            primary_exc \u003d exc"},{"line_number":2141,"context_line":"            LOG.exception(\u0027Failed to create CG snapshot %s.\u0027, snapshot_name)"},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"        try:"},{"line_number":2144,"context_line":"            # Always delete the ephemeral CG; snapshot survives on each volume."}],"source_content_type":"text/x-python","patch_set":13,"id":"298ee581_1cb8b331","line":2141,"range":{"start_line":2139,"start_character":8,"end_line":2141,"end_character":76},"in_reply_to":"b5152baa_f9a8f1d8","updated":"2026-07-28 12:54:23.000000000","message":"Not a gap — _clone_lun in block_cmode.py already calls get_lun_by_args right after and raises VolumeBackendAPIException if the LUN isn\u0027t found. This warning is just an early diagnostic.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"4520a5d36ca3adcfa6556ee5395ba0086c09a6c4","unresolved":true,"context_lines":[{"line_number":2263,"context_line":"                vol_name\u003dvolume_name,"},{"line_number":2264,"context_line":"                fields\u003d\u0027snapshot_directory_access_enabled\u0027)"},{"line_number":2265,"context_line":"            return volume.get(\u0027snapshot_directory_access_enabled\u0027, True)"},{"line_number":2266,"context_line":"        except exception.VolumeBackendAPIException:"},{"line_number":2267,"context_line":"            LOG.warning(\u0027Could not retrieve snapshot_directory_access_enabled \u0027"},{"line_number":2268,"context_line":"                        \u0027for volume %s; assuming True.\u0027, volume_name)"},{"line_number":2269,"context_line":"            return True"},{"line_number":2270,"context_line":""},{"line_number":2271,"context_line":"    def get_flexvol_capacity(self, flexvol_path\u003dNone, flexvol_name\u003dNone):"},{"line_number":2272,"context_line":"        \"\"\"Gets total capacity and free capacity, in bytes, of the flexvol.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"76b9adbd_bbf8f768","line":2269,"range":{"start_line":2266,"start_character":7,"end_line":2269,"end_character":23},"updated":"2026-07-27 06:18:03.000000000","message":"Shouldnt exception be treated as false?","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"fe2be705362aa6fb1fa5c80784a6bb71a4c8655a","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                vol_name\u003dvolume_name,"},{"line_number":2264,"context_line":"                fields\u003d\u0027snapshot_directory_access_enabled\u0027)"},{"line_number":2265,"context_line":"            return volume.get(\u0027snapshot_directory_access_enabled\u0027, True)"},{"line_number":2266,"context_line":"        except exception.VolumeBackendAPIException:"},{"line_number":2267,"context_line":"            LOG.warning(\u0027Could not retrieve snapshot_directory_access_enabled \u0027"},{"line_number":2268,"context_line":"                        \u0027for volume %s; assuming True.\u0027, volume_name)"},{"line_number":2269,"context_line":"            return True"},{"line_number":2270,"context_line":""},{"line_number":2271,"context_line":"    def get_flexvol_capacity(self, flexvol_path\u003dNone, flexvol_name\u003dNone):"},{"line_number":2272,"context_line":"        \"\"\"Gets total capacity and free capacity, in bytes, of the flexvol.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"f0fd5c65_5b53f436","line":2269,"range":{"start_line":2266,"start_character":7,"end_line":2269,"end_character":23},"in_reply_to":"3997361d_49d98229","updated":"2026-07-30 10:07:36.000000000","message":"Please add a UT to cover this scenario.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7dd71f546d85d2b514ca85d2f6964c6872595f4a","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                vol_name\u003dvolume_name,"},{"line_number":2264,"context_line":"                fields\u003d\u0027snapshot_directory_access_enabled\u0027)"},{"line_number":2265,"context_line":"            return volume.get(\u0027snapshot_directory_access_enabled\u0027, True)"},{"line_number":2266,"context_line":"        except exception.VolumeBackendAPIException:"},{"line_number":2267,"context_line":"            LOG.warning(\u0027Could not retrieve snapshot_directory_access_enabled \u0027"},{"line_number":2268,"context_line":"                        \u0027for volume %s; assuming True.\u0027, volume_name)"},{"line_number":2269,"context_line":"            return True"},{"line_number":2270,"context_line":""},{"line_number":2271,"context_line":"    def get_flexvol_capacity(self, flexvol_path\u003dNone, flexvol_name\u003dNone):"},{"line_number":2272,"context_line":"        \"\"\"Gets total capacity and free capacity, in bytes, of the flexvol.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"3997361d_49d98229","line":2269,"range":{"start_line":2266,"start_character":7,"end_line":2269,"end_character":23},"in_reply_to":"76b9adbd_bbf8f768","updated":"2026-07-28 12:54:23.000000000","message":"Done.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"7321c4def2e9a7529f77c48d03367b13a52040bd","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                vol_name\u003dvolume_name,"},{"line_number":2264,"context_line":"                fields\u003d\u0027snapshot_directory_access_enabled\u0027)"},{"line_number":2265,"context_line":"            return volume.get(\u0027snapshot_directory_access_enabled\u0027, True)"},{"line_number":2266,"context_line":"        except exception.VolumeBackendAPIException:"},{"line_number":2267,"context_line":"            LOG.warning(\u0027Could not retrieve snapshot_directory_access_enabled \u0027"},{"line_number":2268,"context_line":"                        \u0027for volume %s; assuming True.\u0027, volume_name)"},{"line_number":2269,"context_line":"            return True"},{"line_number":2270,"context_line":""},{"line_number":2271,"context_line":"    def get_flexvol_capacity(self, flexvol_path\u003dNone, flexvol_name\u003dNone):"},{"line_number":2272,"context_line":"        \"\"\"Gets total capacity and free capacity, in bytes, of the flexvol.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"3104f637_8ec47661","line":2269,"range":{"start_line":2266,"start_character":7,"end_line":2269,"end_character":23},"in_reply_to":"f0fd5c65_5b53f436","updated":"2026-07-30 12:00:12.000000000","message":"Already present.","commit_id":"3aefe02f61ffdfb39cad70a4f133658f99f9ac77"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3e88ac7e96c1daf68fd20058abea348d6b1ee20e","unresolved":true,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        return {"},{"line_number":717,"context_line":"            \u0027compression\u0027: False if compression \u003d\u003d \u0027none\u0027 else True,"},{"line_number":718,"context_line":"            \u0027dedupe\u0027: False if state \u003d\u003d \u0027disabled\u0027 else True,"},{"line_number":719,"context_line":"            \u0027logical-data-size\u0027: logical_data_size,"},{"line_number":720,"context_line":"            \u0027logical-data-limit\u0027: logical_data_limit,"},{"line_number":721,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":15,"id":"d055c174_72b84da4","line":718,"updated":"2026-08-06 22:18:51.000000000","message":"nit: these could just be ``\u0027item\u0027: x !\u003d \u0027y\u0027`` but the way you have it is fine if you think it\u0027s more clear","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"}],"releasenotes/notes/netapp-ontap-zapi-to-rest-gap-closure-0f1510182c2998c0.yaml":[{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"ffebc37c8d992aa544a449afcad1009ae44794cd","unresolved":true,"context_lines":[{"line_number":70,"context_line":"    NetApp ONTAP NFS driver: ``create_group_snapshot`` cloned from live"},{"line_number":71,"context_line":"    file state instead of the crash-consistent CG snapshot because"},{"line_number":72,"context_line":"    ``source_snapshot`` was silently dropped in"},{"line_number":73,"context_line":"    ``_clone_backing_file_for_volume``. The parameter is now forwarded to"},{"line_number":74,"context_line":"    ``clone_file`` so the clone source path correctly reflects the CG"},{"line_number":75,"context_line":"    snapshot."},{"line_number":76,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"824c3f1d_6ca466b0","line":73,"updated":"2026-07-15 19:52:45.000000000","message":"1- Release note is for customer, we should not add any technical details here. Better to remove the ZAPI/API name from release note and optimize the content which customer can understand.\n\n2. Either make this patch as feature or bug fix. You can not keep the both.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f746cab021d9b034b30281cfef393a85469a30ad","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    NetApp ONTAP NFS driver: ``create_group_snapshot`` cloned from live"},{"line_number":71,"context_line":"    file state instead of the crash-consistent CG snapshot because"},{"line_number":72,"context_line":"    ``source_snapshot`` was silently dropped in"},{"line_number":73,"context_line":"    ``_clone_backing_file_for_volume``. The parameter is now forwarded to"},{"line_number":74,"context_line":"    ``clone_file`` so the clone source path correctly reflects the CG"},{"line_number":75,"context_line":"    snapshot."},{"line_number":76,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"f80dfe44_26720d02","line":73,"in_reply_to":"824c3f1d_6ca466b0","updated":"2026-07-21 13:40:22.000000000","message":"Done. Please see if this works, thanks.","commit_id":"fc56a638a36cdcff61b462f81e90c3574d5c0413"}]}
