)]}'
{"/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"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"09685c9fc45bd54eb101d8908b5ccdb095fb1e33","unresolved":true,"context_lines":[{"line_number":70,"context_line":"treating an already-absent file as success."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Two additional bugs are fixed as part of this same REST parity work:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* create_group_snapshot could clone from live volume data instead of"},{"line_number":75,"context_line":"  the crash-consistent group snapshot, because source_snapshot was"},{"line_number":76,"context_line":"  silently dropped while building the clone source path in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1bbe1e4b_ec38929d","line":73,"updated":"2026-08-11 13:36:55.000000000","message":"updateing API and fixing bugs in same patch is not good.\nplease break the patch.\n\nthonk of it as if you want to provide bug fix before the feature.","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"a96c7cb5770f93dc8a493dd404dcd8309c1c954d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"treating an already-absent file as success."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Two additional bugs are fixed as part of this same REST parity work:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* create_group_snapshot could clone from live volume data instead of"},{"line_number":75,"context_line":"  the crash-consistent group snapshot, because source_snapshot was"},{"line_number":76,"context_line":"  silently dropped while building the clone source path in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5f62ae2f_2bcad785","line":73,"in_reply_to":"0ace211f_bab09631","updated":"2026-08-17 09:49:30.000000000","message":"Thanks a lot for the feedback, @auniyal@redhat.com and @eharney@redhat.com. I\u0027ve split this out — the two bug fixes (dropped source_snapshot in NFS clone_file, and the missing snapshot_directory_access_enabled\u003dFalse fallback in clone_lun/clone_file) have been removed from this patch and will be resubmitted as a separate change against https://bugs.launchpad.net/manila/+bug/2163623, given the data-corruption severity Eric flagged.","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":"75de8dd113635bd1075e017b5541cb6f9e74d3e7","unresolved":true,"context_lines":[{"line_number":70,"context_line":"treating an already-absent file as success."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Two additional bugs are fixed as part of this same REST parity work:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* create_group_snapshot could clone from live volume data instead of"},{"line_number":75,"context_line":"  the crash-consistent group snapshot, because source_snapshot was"},{"line_number":76,"context_line":"  silently dropped while building the clone source path in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"c8b5c9b8_77d3080f","line":73,"in_reply_to":"1bbe1e4b_ec38929d","updated":"2026-08-12 12:10:09.000000000","message":"Hi Amit. Thanks for the comment. These bugs were minor issues found during the dev testing of the ZAPI-\u003eREST gap fixes. They are not identified/reported as upstream issues. So IMO we should be okay to merge it along with the fixes to other gaps. Please let us know if you think otherwise.","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"b2260db59d3605fb1cf7e775b510d63c3386f371","unresolved":false,"context_lines":[{"line_number":70,"context_line":"treating an already-absent file as success."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Two additional bugs are fixed as part of this same REST parity work:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* create_group_snapshot could clone from live volume data instead of"},{"line_number":75,"context_line":"  the crash-consistent group snapshot, because source_snapshot was"},{"line_number":76,"context_line":"  silently dropped while building the clone source path in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5c353285_07621820","line":73,"in_reply_to":"5f62ae2f_2bcad785","updated":"2026-08-17 11:22:04.000000000","message":"Raised a different patch as discussed here: https://review.opendev.org/c/openstack/cinder/+/1001119\nThanks.","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"d40ec45fde69ddb814c85d2ac9ab07dbef744d35","unresolved":true,"context_lines":[{"line_number":70,"context_line":"treating an already-absent file as success."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Two additional bugs are fixed as part of this same REST parity work:"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"* create_group_snapshot could clone from live volume data instead of"},{"line_number":75,"context_line":"  the crash-consistent group snapshot, because source_snapshot was"},{"line_number":76,"context_line":"  silently dropped while building the clone source path in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"0ace211f_bab09631","line":73,"in_reply_to":"c8b5c9b8_77d3080f","updated":"2026-08-13 16:17:23.000000000","message":"\"create_group_snapshot could clone from live volume data instead of the crash-consistent group snapshot\" is a serious bug. You will want to backport it to stable branches and downstream distributions so that people using snapshots don\u0027t have data corruption. This is a very good reason to put it in its own patch.\n\n(It should also be done anyway to help with reviewing and risk-assessing changes.)","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"}],"/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"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"a96c7cb5770f93dc8a493dd404dcd8309c1c954d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"c893bbe3_d216e5f2","updated":"2026-08-17 09:49:30.000000000","message":"Fixed comments from Amit/Eric. Reviewers, please do take a look and review. Thanks a lot.","commit_id":"5039dc6e66aff892421cb1a4e49674630018cb9d"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"bd1bea34adecd5fcf6c8eff4d31fb9201a14d35b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"7809da7c_1cc627df","updated":"2026-08-19 14:24:15.000000000","message":"Hi @eharney@redhat.com @auniyal@redhat.com, I have addressed comments as given. Could you please review. Thank you so much!!","commit_id":"cc25f63d0742ec752f13d91c3dc622163ae67664"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"30958b64b72d1529c16e00d6df590c65ac5d24d6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"a3e714fa_96d5c864","updated":"2026-08-17 14:33:27.000000000","message":"LGTM ..!","commit_id":"cc25f63d0742ec752f13d91c3dc622163ae67664"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"f530c3b0e72e14bc5b0a43b359e93827b10d5bb6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"91d567f8_b7c44b66","updated":"2026-08-21 15:14:34.000000000","message":"Still LGTM with the code for https://bugs.launchpad.net/cinder/+bug/2163623 pulled out into its own patch (the child patch of this one).","commit_id":"cc25f63d0742ec752f13d91c3dc622163ae67664"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"36873c6522586d72a60ccf8028bed1e8c7dac1a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"b9d8218d_44061dcc","updated":"2026-08-17 12:37:09.000000000","message":"run-NetApp CI","commit_id":"cc25f63d0742ec752f13d91c3dc622163ae67664"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"77daed6a242e376765c2265661eed3166ec57efb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"f9d003f6_d2b28039","updated":"2026-08-21 16:06:42.000000000","message":"I concur with brian, good to see the code for the bug pulled into a separate patch - definately submit for backport as soon as it lands.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"68df0bee_1776b1be","updated":"2026-08-21 17:18:52.000000000","message":"See inline comments - some of these are definatley blockers","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"386366d3_7d88f66b","updated":"2026-08-24 15:31:00.000000000","message":"Thank you so much @simon@everpuredata.com for the review and comments. Addressed all possible comments, please take a look and approve!","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"117e5bfd485016f63dd029d2d559dae2f0ffd2bb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"cba9fd19_1f2911b6","updated":"2026-08-22 06:25:58.000000000","message":"Thanks for the comments Simon. I have some responses. Please take a look.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"93f3ded2b4d5eb19386d2cc4856469b6246941be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"462e852a_c68f9c4d","updated":"2026-08-24 16:10:51.000000000","message":"Please resolve the comments that are still unresolved. Overall LGTM. Thanks Sai for addressing open comments.","commit_id":"f6bdd458c03b3ce72ae4db3fa1953a8c7f803ad0"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"d683490a2e4159ac5301210417fe7f60216aca89","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"1766a56c_bd3a6f58","updated":"2026-08-24 15:46:00.000000000","message":"Thanks for addressing my concerns. Looking good now.","commit_id":"f6bdd458c03b3ce72ae4db3fa1953a8c7f803ad0"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"e79a76d6ee51f31f1ef5b8adf979b021cd64a1dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"358b2ad6_b6790835","updated":"2026-08-27 15:24:33.000000000","message":"Looks like all the issues that have come up in discussion have been resolved; overall, the patch LGTM.","commit_id":"f0eb64a731ea25f4a67f24a5bb9886eb24b7a86d"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ded82875beb77bc36bca3551228eb5a83288227a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"91315336_cb9a8064","updated":"2026-08-27 20:29:07.000000000","message":"recheck\n\ntempest.scenario.test_server_basic_ops.TestServerBasicOps.test_server_basic_ops failed in volbak job","commit_id":"f0eb64a731ea25f4a67f24a5bb9886eb24b7a86d"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"968f363e83600d80112e8a8094b4b2367aa765fe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"cb657dcd_821bfe5b","updated":"2026-08-24 17:50:11.000000000","message":"run-NetApp CI","commit_id":"f0eb64a731ea25f4a67f24a5bb9886eb24b7a86d"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"fc4ffe7373be0464c0eadf4de2501609923a82a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"fe858979_57ef8d25","updated":"2026-08-28 02:41:47.000000000","message":"@rosmaita.fossdev@gmail.com jobernar@redhat.com @eharney@redhat.com Rebased onto master to resolve a conflict in __getattr__ with 998810/1002127 — no functional changes, just merged both the guards. Could you please approve and open the gates!! Thank you so much for all the help/suggestions.","commit_id":"2278582d2586d012da2fe602a67416858cfad778"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"356d862265f84637adc6643a435dbb3c0d8ec8cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"8ca5ed04_84aa58b7","updated":"2026-08-28 15:47:59.000000000","message":"That py311 job failure was a bit concerning, but I reran locally a bunch of times and had no failures.  Patch LGTM after a pretty simple rebase, so carrying over the previous +2s.","commit_id":"2278582d2586d012da2fe602a67416858cfad778"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"32c53b9f4665a8d454914de70bedb77e3eb694ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"48e313d4_e2970196","updated":"2026-08-28 03:47:14.000000000","message":"recheck","commit_id":"2278582d2586d012da2fe602a67416858cfad778"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"84f59a22d4bc98a080ae63c171fb13a00a41f9a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"f90174b5_0814a7ba","updated":"2026-08-28 05:24:04.000000000","message":"recheck","commit_id":"2278582d2586d012da2fe602a67416858cfad778"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"3525346a0504b4e3fa6fc500c9c08056ccc6e1bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"4b576c04_f9c625e7","updated":"2026-08-28 03:42:03.000000000","message":"recheck\nFailures not related to this change are failing here: openstack-tox-py311","commit_id":"2278582d2586d012da2fe602a67416858cfad778"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"20f0673ea5e1add8729d25d887c4249e58f7c90d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"33827e40_4a6bbc5c","updated":"2026-08-28 07:08:49.000000000","message":"run-NetApp CI","commit_id":"2278582d2586d012da2fe602a67416858cfad778"}],"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"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","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":18,"id":"23b688bb_3023bfcc","line":782,"updated":"2026-08-21 17:18:52.000000000","message":"This should be done as a separate patch as it is an unrelated bug fix, as noted by Eric. That will make it easily backportable","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","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":18,"id":"0649fa5d_6d0ab842","line":782,"in_reply_to":"23b688bb_3023bfcc","updated":"2026-08-24 15:31:00.000000000","message":"Done: https://review.opendev.org/c/openstack/cinder/+/1002127","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"}],"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"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"75b2918a068d948d576fd826efccd6cfa8fa2e07","unresolved":false,"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":"8d8e4928_885c87fe","line":718,"in_reply_to":"d055c174_72b84da4","updated":"2026-08-17 10:12:53.000000000","message":"Done. Thanks Brian.","commit_id":"42a20a4929892ee281ea72e8c1f76b86139f05c7"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":708,"context_line":"                logical_data_limit \u003d int("},{"line_number":709,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        except netapp_api.NaApiError:"},{"line_number":712,"context_line":"            LOG.exception("},{"line_number":713,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":714,"context_line":"                flexvol_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"044e87c3_abe3698b","line":711,"updated":"2026-08-21 17:18:52.000000000","message":"Swallowing the error here leaves the initialised defaults from 691-692 in place — `logical_data_size \u003d 0` and `logical_data_limit \u003d 1` — and those are returned as if they were real values.\n`logical_data_limit \u003d 1` is then used as a divisor in `get_flexvol_dedupe_used_percent` (line 733), so with any non-zero unsplit_size the result is astronomical: 1 GB unsplit gives `100.0 * 1073741824 / 1`, about 1e11 percent. Since that value gates pool filtering, a transient private-CLI failure — or an ONTAP whose REST role lacks private-CLI privileges — silently drops the pool out of scheduling.\n\nThe root problem is `logical_data_limit \u003d 1` doing double duty as both \"unknown\" and \"a real limit\". Could the failure be signalled distinctly so `get_flexvol_dedupe_used_percent` can return `0.0`, matching what it already does when `CLONE_SPLIT_STATUS` is absent?","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e31e74e0999b32e6ba2813e959186213239e452a","unresolved":true,"context_lines":[{"line_number":708,"context_line":"                logical_data_limit \u003d int("},{"line_number":709,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        except netapp_api.NaApiError:"},{"line_number":712,"context_line":"            LOG.exception("},{"line_number":713,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":714,"context_line":"                flexvol_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fd1cbf4_9e8eb5b3","line":711,"in_reply_to":"044e87c3_abe3698b","updated":"2026-08-21 18:20:06.000000000","message":"What do you mean by -  \"or an ONTAP whose REST role lacks private-CLI privileges\". I did not get this comment.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","unresolved":true,"context_lines":[{"line_number":708,"context_line":"                logical_data_limit \u003d int("},{"line_number":709,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        except netapp_api.NaApiError:"},{"line_number":712,"context_line":"            LOG.exception("},{"line_number":713,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":714,"context_line":"                flexvol_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"eca72374_d0089bc8","line":711,"in_reply_to":"35f81cea_93e03fdf","updated":"2026-08-24 15:31:00.000000000","message":"Agreed with Anoop\u0027s analysis — this preserves ZAPI parity by design, and the bad-reading scenario is narrow (requires the private-CLI SIS call to fail while clone-split-status still succeeds with unsplit clones) and doesn\u0027t gate the default NetApp scheduling filter. We\u0027ll track a follow-up to make get_flexvol_dedupe_used_percent return 0.0 when logical_data_limit isn\u0027t plausible (e.g. \u003c\u003d 1), applied to both REST and ZAPI, rather than changing behavior in this series.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"4f4c6ceb17e86761fbeded1f4619a1f22ac7cebb","unresolved":true,"context_lines":[{"line_number":708,"context_line":"                logical_data_limit \u003d int("},{"line_number":709,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        except netapp_api.NaApiError:"},{"line_number":712,"context_line":"            LOG.exception("},{"line_number":713,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":714,"context_line":"                flexvol_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"6fd9725d_f9e9e170","line":711,"in_reply_to":"5fd1cbf4_9e8eb5b3","updated":"2026-08-21 19:02:04.000000000","message":"Fair question — that phrase was carrying more weight than I could back up, so let me withdraw it and restate the actual concern.\n\nI was reasoning from how ONTAP RBAC works generally, i.e. that a custom REST role could be provisioned without access to the `/api/private/cli/ passthrough`. I hadn\u0027t verified that against ONTAP docs or a real cluster, so please disregard it as an example — however it isn\u0027t necessary for the point I was making.\n\nWhat I\u0027m actually flagging is that the except `netapp_api.NaApiError` here swallows **any** failure of that call and leaves the initialised defaults from lines 691-692 in place — `logical_data_size \u003d 0` and `logical_data_limit \u003d 1` — which are then returned as though they were real values. `logical_data_limit` becomes the divisor in `get_flexvol_dedupe_used_percent` at line 733:\n\n\n`unsplit_size \u003d 1 GiB  -\u003e  100.0 * 1073741824 / 1  -\u003e  ~1.07e11 percent`\n\nSince `dedupe_used_percent` gates pool filtering, a single failed call on that endpoint makes the pool look catastrophically over its dedupe limit and drop out of scheduling until the next successful SSC refresh. A transient 5xx or a timeout is enough to trigger it — no privilege scenario required.\n\nThe root cause is that `logical_data_limit \u003d 1` is doing double duty as both \"we couldn\u0027t determine this\" and \"the limit is 1\". Could the failure be signalled distinctly, so `get_flexvol_dedupe_used_percent` returns `0.0`? That would match what it already does when `CLONE_SPLIT_STATUS` is absent, which is the same \"we can\u0027t tell\" situation.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"117e5bfd485016f63dd029d2d559dae2f0ffd2bb","unresolved":true,"context_lines":[{"line_number":708,"context_line":"                logical_data_limit \u003d int("},{"line_number":709,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        except netapp_api.NaApiError:"},{"line_number":712,"context_line":"            LOG.exception("},{"line_number":713,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":714,"context_line":"                flexvol_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"35f81cea_93e03fdf","line":711,"in_reply_to":"6fd9725d_f9e9e170","updated":"2026-08-22 06:25:58.000000000","message":"Thanks Simon — you\u0027re right about the arithmetic in the narrow case where the private-CLI SIS lookup fails but clone-split-status still returns a non-zero unsplit-size, leaving logical-data-limit at the initialized default of 1 and producing a very large percentage.\n\nI\u0027d push back a bit on the operational severity though:\n\n- This matches existing ZAPI behaviour, by design. The ZAPI client uses the same defaults (0/1), swallows NaApiError from sis-get-iter, and applies the same formula in get_flexvol_dedupe_used_percent(). This REST port intentionally preserves that model (see the earlier thread on best-effort supplementary data vs aborting SSC for all flexvols). PS18 even has a unit test covering the defaults+unsplit combination.\n\n- Default scheduling is not gated on netapp_dedupe_used_percent. NetApp\u0027s built-in filter is capabilities.utilization \u003c 70. An inflated dedupe value is published as pool metadata, but it does not affect the default filter unless an operator has configured a custom filter/goodness that references netapp_dedupe_used_percent.\n\n- This requires a partial failure mode (SIS/private-CLI fails while public clone-split-status succeeds and there are unsplit clones). If both supplementary calls fail, the result is 0%. In normal operation both hit the same cluster with the same credentials.\n\n- Scope is already limited — dedupe percent is only refreshed with cluster credentials, not for FlexGroups (NFS), and not on disaggregated platforms, same as today.\n\n- Cache bounded — even if a bad reading occurred, it is refreshed at most every netapp_dedupe_cache_expiry_duration (default 600s).\n\nI agree the limit\u003d1 is awkward, and returning 0.0 from get_flexvol_dedupe_used_percent() when the limit is not a plausible real value (e.g. \u003c\u003d 1) would be reasonable hardening — potentially in both REST and ZAPI in a follow-up. For this REST-gap series I\u0027d prefer to land ZAPI parity first unless you feel strongly we should change both clients here.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"9f28891e3b577a2cd9ab7c51b6c54a7405929748","unresolved":false,"context_lines":[{"line_number":708,"context_line":"                logical_data_limit \u003d int("},{"line_number":709,"context_line":"                    record.get(\u0027logical_data_limit\u0027, 1) or 1)"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        except netapp_api.NaApiError:"},{"line_number":712,"context_line":"            LOG.exception("},{"line_number":713,"context_line":"                \u0027Failed to get SIS logical data info for volume %s.\u0027,"},{"line_number":714,"context_line":"                flexvol_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"65ed6c8f_4f9fe45b","line":711,"in_reply_to":"eca72374_d0089bc8","updated":"2026-08-24 17:10:18.000000000","message":"Marked as resolved.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        total_dedupe_blocks \u003d (dedupe_info.get(\u0027logical-data-size\u0027, 0) +"},{"line_number":732,"context_line":"                               clone_split_info.get(\u0027unsplit-size\u0027, 0))"},{"line_number":733,"context_line":"        dedupe_used_percent \u003d (100.0 * float(total_dedupe_blocks) /"},{"line_number":734,"context_line":"                               dedupe_info.get(\u0027logical-data-limit\u0027, 1))"},{"line_number":735,"context_line":"        return dedupe_used_percent"},{"line_number":736,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ff532ee6_ae30680c","line":733,"updated":"2026-08-21 17:18:52.000000000","message":"Follow on from line 711 - this divides by a value that may be the \"unknown\" default of 1 rather than a real limit. Even with line 711 fixed, a guard here (return 0.0 when the limit isn\u0027t a plausible real value) would stop a bad reading from taking a pool offline.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"9f28891e3b577a2cd9ab7c51b6c54a7405929748","unresolved":false,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        total_dedupe_blocks \u003d (dedupe_info.get(\u0027logical-data-size\u0027, 0) +"},{"line_number":732,"context_line":"                               clone_split_info.get(\u0027unsplit-size\u0027, 0))"},{"line_number":733,"context_line":"        dedupe_used_percent \u003d (100.0 * float(total_dedupe_blocks) /"},{"line_number":734,"context_line":"                               dedupe_info.get(\u0027logical-data-limit\u0027, 1))"},{"line_number":735,"context_line":"        return dedupe_used_percent"},{"line_number":736,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1dd53797_db145024","line":733,"in_reply_to":"9973d230_a83b44c7","updated":"2026-08-24 17:10:18.000000000","message":"Marked as resolved.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","unresolved":true,"context_lines":[{"line_number":730,"context_line":""},{"line_number":731,"context_line":"        total_dedupe_blocks \u003d (dedupe_info.get(\u0027logical-data-size\u0027, 0) +"},{"line_number":732,"context_line":"                               clone_split_info.get(\u0027unsplit-size\u0027, 0))"},{"line_number":733,"context_line":"        dedupe_used_percent \u003d (100.0 * float(total_dedupe_blocks) /"},{"line_number":734,"context_line":"                               dedupe_info.get(\u0027logical-data-limit\u0027, 1))"},{"line_number":735,"context_line":"        return dedupe_used_percent"},{"line_number":736,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9973d230_a83b44c7","line":733,"in_reply_to":"ff532ee6_ae30680c","updated":"2026-08-24 15:31:00.000000000","message":"Same reasoning as the line 711 thread — matches existing ZAPI behavior, and the bad reading is bounded by the dedupe cache expiry and only affects clusters where the SIS private-CLI call fails while unsplit clones exist. We\u0027ll add the 0.0 guard here too as part of the same follow-up hardening patch for both clients, rather than in this series.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":928,"context_line":"                return \u00270\u0027"},{"line_number":929,"context_line":"            else:"},{"line_number":930,"context_line":"                raise e"},{"line_number":931,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":932,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":933,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":934,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"1b47ebc3_9cfb00a7","line":931,"updated":"2026-08-21 17:18:52.000000000","message":"This will always return `0KB` as I couldn\u0027t see a top-level `unique_bytes`. I think you are reading the wrong level.\nShould it be something like:\n```\nrecords \u003d response.get(\u0027records\u0027, [])\nraw \u003d records[0].get(\u0027unique_bytes\u0027, \u00270KB\u0027) if records else \u00270KB\u0027\n```","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e31e74e0999b32e6ba2813e959186213239e452a","unresolved":true,"context_lines":[{"line_number":928,"context_line":"                return \u00270\u0027"},{"line_number":929,"context_line":"            else:"},{"line_number":930,"context_line":"                raise e"},{"line_number":931,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":932,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":933,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":934,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"24495f55_c018d5f8","line":931,"in_reply_to":"1b47ebc3_9cfb00a7","updated":"2026-08-21 18:20:06.000000000","message":"This get query is private cli API response. It does not return records. This part is tested functionally.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"4f4c6ceb17e86761fbeded1f4619a1f22ac7cebb","unresolved":false,"context_lines":[{"line_number":928,"context_line":"                return \u00270\u0027"},{"line_number":929,"context_line":"            else:"},{"line_number":930,"context_line":"                raise e"},{"line_number":931,"context_line":"        raw \u003d response.get(\u0027unique_bytes\u0027, \u00270KB\u0027)"},{"line_number":932,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":933,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":934,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"6914c1ec_cf1c7e60","line":931,"in_reply_to":"24495f55_c018d5f8","updated":"2026-08-21 19:02:04.000000000","message":"Acknowledged","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":932,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":933,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":934,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"},{"line_number":935,"context_line":"            unique_bytes \u003d str(int(raw[:-2]) * 1024)"},{"line_number":936,"context_line":"        else:"},{"line_number":937,"context_line":"            unique_bytes \u003d str(raw)"},{"line_number":938,"context_line":"        LOG.debug(\u0027file-usage for path %(path)s is %(bytes)s\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"47346d4d_5bc49e36","line":935,"updated":"2026-08-21 17:18:52.000000000","message":"Yuo are only handling `KB` - what about anything that comes in as `MB` or `GB` or `TB`? Can you gaurantee that your responses only hold KB vales or values with no suffix?","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e31e74e0999b32e6ba2813e959186213239e452a","unresolved":true,"context_lines":[{"line_number":932,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":933,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":934,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"},{"line_number":935,"context_line":"            unique_bytes \u003d str(int(raw[:-2]) * 1024)"},{"line_number":936,"context_line":"        else:"},{"line_number":937,"context_line":"            unique_bytes \u003d str(raw)"},{"line_number":938,"context_line":"        LOG.debug(\u0027file-usage for path %(path)s is %(bytes)s\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"de0806a5_b168ef66","line":935,"in_reply_to":"47346d4d_5bc49e36","updated":"2026-08-21 18:20:06.000000000","message":"The comment clearly says that this is a private cli endpoint that returns values in KB always.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"4f4c6ceb17e86761fbeded1f4619a1f22ac7cebb","unresolved":false,"context_lines":[{"line_number":932,"context_line":"        # The private/cli endpoint returns unique_bytes as a string with a KB"},{"line_number":933,"context_line":"        # suffix (e.g. \"51408KB\"). Strip the suffix and convert to bytes."},{"line_number":934,"context_line":"        if isinstance(raw, str) and raw.upper().endswith(\u0027KB\u0027):"},{"line_number":935,"context_line":"            unique_bytes \u003d str(int(raw[:-2]) * 1024)"},{"line_number":936,"context_line":"        else:"},{"line_number":937,"context_line":"            unique_bytes \u003d str(raw)"},{"line_number":938,"context_line":"        LOG.debug(\u0027file-usage for path %(path)s is %(bytes)s\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9268fbd5_0cf32404","line":935,"in_reply_to":"de0806a5_b168ef66","updated":"2026-08-21 19:02:04.000000000","message":"Comments and REST responses rarely converge in my experience- LOL!\nBut I\u0027ll take your word for it...","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":1010,"context_line":"        }"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    @utils.retry(exception.SnapshotIsBusy, retries\u003d5)"},{"line_number":1013,"context_line":"    def wait_for_busy_snapshot(self, flexvol, snapshot_name):"},{"line_number":1014,"context_line":"        \"\"\"Checks for and handles a busy snapshot."},{"line_number":1015,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"f0976932_a6c74506","line":1012,"updated":"2026-08-21 17:18:52.000000000","message":"you are using retry 5 here, but `wait_for_busy_snapshot` only uses 3. If you are looking parity, then this is a timing divergence","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":1010,"context_line":"        }"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    @utils.retry(exception.SnapshotIsBusy, retries\u003d5)"},{"line_number":1013,"context_line":"    def wait_for_busy_snapshot(self, flexvol, snapshot_name):"},{"line_number":1014,"context_line":"        \"\"\"Checks for and handles a busy snapshot."},{"line_number":1015,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"f0b07c43_dca4099f","line":1012,"in_reply_to":"57d47ba1_b7be54a3","updated":"2026-08-24 15:31:00.000000000","message":"Done. Dropped the explicit retries\u003d5 so wait_for_busy_snapshot falls back to the @utils.retry decorator\u0027s default of retries\u003d3.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"117e5bfd485016f63dd029d2d559dae2f0ffd2bb","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":1010,"context_line":"        }"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    @utils.retry(exception.SnapshotIsBusy, retries\u003d5)"},{"line_number":1013,"context_line":"    def wait_for_busy_snapshot(self, flexvol, snapshot_name):"},{"line_number":1014,"context_line":"        \"\"\"Checks for and handles a busy snapshot."},{"line_number":1015,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"57d47ba1_b7be54a3","line":1012,"in_reply_to":"da4020dc_bb107b87","updated":"2026-08-22 06:25:58.000000000","message":"Agree with the difference in retries. I would rather fix this in a follow up and do not see this as a blocker to this patch. We can have a follow up patch to keep it at default 3.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e31e74e0999b32e6ba2813e959186213239e452a","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":1010,"context_line":"        }"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    @utils.retry(exception.SnapshotIsBusy, retries\u003d5)"},{"line_number":1013,"context_line":"    def wait_for_busy_snapshot(self, flexvol, snapshot_name):"},{"line_number":1014,"context_line":"        \"\"\"Checks for and handles a busy snapshot."},{"line_number":1015,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"f5cd0994_5c71cd56","line":1012,"in_reply_to":"f0976932_a6c74506","updated":"2026-08-21 18:20:06.000000000","message":"This retry applies to wait_for_busy_snapshot. Did you mean a different method uses 3 retries?","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"4f4c6ceb17e86761fbeded1f4619a1f22ac7cebb","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"            \u0027owners\u0027: owners,"},{"line_number":1010,"context_line":"        }"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    @utils.retry(exception.SnapshotIsBusy, retries\u003d5)"},{"line_number":1013,"context_line":"    def wait_for_busy_snapshot(self, flexvol, snapshot_name):"},{"line_number":1014,"context_line":"        \"\"\"Checks for and handles a busy snapshot."},{"line_number":1015,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da4020dc_bb107b87","line":1012,"in_reply_to":"f5cd0994_5c71cd56","updated":"2026-08-21 19:02:04.000000000","message":"sorry - missed a bit in the comment. I meant `client_base.wait_for_busy_snapshot`, which uses the same decorator, but without passing a `reties` value, therefore the decorator default to `retires\u003d3`. That is the difference, so there is a definate time delay difference between the default decorator failure of 3 seconds and the `retries\u003d5` which takes 15 seconds.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":2102,"context_line":"        }"},{"line_number":2103,"context_line":"        cg_list \u003d self.send_request("},{"line_number":2104,"context_line":"            \u0027/application/consistency-groups\u0027, \u0027get\u0027, query\u003dquery)"},{"line_number":2105,"context_line":"        if not cg_list.get(\u0027records\u0027):"},{"line_number":2106,"context_line":"            msg \u003d _(\u0027Could not find consistency group %s after creation.\u0027)"},{"line_number":2107,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg % cg_name)"},{"line_number":2108,"context_line":"        cg_uuid \u003d cg_list[\u0027records\u0027][0][\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"b19c7b2b_60c8b14b","line":2105,"updated":"2026-08-21 17:18:52.000000000","message":"The CG is leaked here. At this point the POST at 2085 has already created it, but the try/finally that guarantees deletion doesn\u0027t start until 2110. So both this raise and an NaApiError from the GET above exit with the ephemeral CG still on the array.\nReleatdd ,there doesn\u0027t to be anything for an operaotr to correlate any orphaned CGs against. Including the `snapshot_name` in the CG name would help make cleanup easier.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"4f4c6ceb17e86761fbeded1f4619a1f22ac7cebb","unresolved":false,"context_lines":[{"line_number":2102,"context_line":"        }"},{"line_number":2103,"context_line":"        cg_list \u003d self.send_request("},{"line_number":2104,"context_line":"            \u0027/application/consistency-groups\u0027, \u0027get\u0027, query\u003dquery)"},{"line_number":2105,"context_line":"        if not cg_list.get(\u0027records\u0027):"},{"line_number":2106,"context_line":"            msg \u003d _(\u0027Could not find consistency group %s after creation.\u0027)"},{"line_number":2107,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg % cg_name)"},{"line_number":2108,"context_line":"        cg_uuid \u003d cg_list[\u0027records\u0027][0][\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"db6f7b6f_ea806849","line":2105,"in_reply_to":"0aa415c7_98ce262f","updated":"2026-08-21 19:02:04.000000000","message":"OK - understood - a follow up patch should this become an issue would be OK","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e31e74e0999b32e6ba2813e959186213239e452a","unresolved":true,"context_lines":[{"line_number":2102,"context_line":"        }"},{"line_number":2103,"context_line":"        cg_list \u003d self.send_request("},{"line_number":2104,"context_line":"            \u0027/application/consistency-groups\u0027, \u0027get\u0027, query\u003dquery)"},{"line_number":2105,"context_line":"        if not cg_list.get(\u0027records\u0027):"},{"line_number":2106,"context_line":"            msg \u003d _(\u0027Could not find consistency group %s after creation.\u0027)"},{"line_number":2107,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg % cg_name)"},{"line_number":2108,"context_line":"        cg_uuid \u003d cg_list[\u0027records\u0027][0][\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"0aa415c7_98ce262f","line":2105,"in_reply_to":"b19c7b2b_60c8b14b","updated":"2026-08-21 18:20:06.000000000","message":"There are CG name constraints in ONTAP that are constrained by 31 characters. Anything apart from what is used, will end up truncating and will not work either.\n\nOn leaked CG - the likelyhood of having a scenario where CG create request did not fail and GET response could not find it, is probably an overkill. So I dont think in any scenario this would ever occur. IMO we can fix this in a later patch to remove this check as looks like AI generated code added some slop.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"}],"cinder/volume/drivers/netapp/dataontap/nfs_cmode.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":1164,"context_line":"                      \u0027partially copied file directly.\u0027, job_uuid)"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        dest_client \u003d dot_utils.get_client_for_backend(dest_backend_name)"},{"line_number":1167,"context_line":"        file_path \u003d \u0027/vol/%s/%s\u0027 % (dest_pool, file_name)"},{"line_number":1168,"context_line":"        try:"},{"line_number":1169,"context_line":"            dest_client.delete_file(file_path)"},{"line_number":1170,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5d0dd7b9_db7a4692","line":1167,"updated":"2026-08-21 17:18:52.000000000","message":"So this is both an item not listed in tecommit message, plus it is also something that should probably be in its own patch for easier backporting.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","unresolved":true,"context_lines":[{"line_number":1164,"context_line":"                      \u0027partially copied file directly.\u0027, job_uuid)"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        dest_client \u003d dot_utils.get_client_for_backend(dest_backend_name)"},{"line_number":1167,"context_line":"        file_path \u003d \u0027/vol/%s/%s\u0027 % (dest_pool, file_name)"},{"line_number":1168,"context_line":"        try:"},{"line_number":1169,"context_line":"            dest_client.delete_file(file_path)"},{"line_number":1170,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"cb225ed5_001edaf3","line":1167,"in_reply_to":"5d0dd7b9_db7a4692","updated":"2026-08-24 15:31:00.000000000","message":"This is intrinsic to this patch\u0027s REST destroy_file_copy() support, not separable. Previously, delete_file() cleanup only ran on exception — which worked because ZAPI\u0027s destroy_file_copy() always raised in practice. REST\u0027s destroy_file_copy() only stops the job and leaves the partial file behind (unlike ZAPI, which removes it), so cleanup now has to run unconditionally, with REST_NO_SUCH_FILE/EAPINOTFOUND treated as the expected already-absent case. Splitting this out isn\u0027t practical without also splitting the REST implementation itself.\n\nFair point on the commit message — added the info calling out this cancel-cleanup behavior difference.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"9f28891e3b577a2cd9ab7c51b6c54a7405929748","unresolved":false,"context_lines":[{"line_number":1164,"context_line":"                      \u0027partially copied file directly.\u0027, job_uuid)"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        dest_client \u003d dot_utils.get_client_for_backend(dest_backend_name)"},{"line_number":1167,"context_line":"        file_path \u003d \u0027/vol/%s/%s\u0027 % (dest_pool, file_name)"},{"line_number":1168,"context_line":"        try:"},{"line_number":1169,"context_line":"            dest_client.delete_file(file_path)"},{"line_number":1170,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7562b149_fe46649e","line":1167,"in_reply_to":"cb225ed5_001edaf3","updated":"2026-08-24 17:10:18.000000000","message":"Marked as resolved.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"}],"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"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"023972c1eea1488e8820c0fbeaa4886d550c6cf2","unresolved":true,"context_lines":[{"line_number":18,"context_line":"      images can be safely removed."},{"line_number":19,"context_line":"    * Reporting clone-split progress and deduplication space savings"},{"line_number":20,"context_line":"      for a volume."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":18,"id":"83e6585c_e75d6954","line":21,"updated":"2026-08-21 17:18:52.000000000","message":"No mention of the dependency of these two private endpoints:\n* `/private/cli/volume/file/show-disk-usage` (acknowledged in the commit message as a short-term workaround)\n* `/private/cli/volume/efficiency` (not acknowledged anywhere)","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"f23814001152f30deec59037fa091ee30efec20c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"      images can be safely removed."},{"line_number":19,"context_line":"    * Reporting clone-split progress and deduplication space savings"},{"line_number":20,"context_line":"      for a volume."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":18,"id":"ab1335a2_a038a10c","line":21,"in_reply_to":"83e6585c_e75d6954","updated":"2026-08-24 15:31:00.000000000","message":"Updated the release note to also disclose /private/cli/volume/efficiency, alongside the already-mentioned /private/cli/volume/file/show-disk-usage.","commit_id":"33bf097899a42c88ec40a5a101b09533cadd9aa3"}]}
