)]}'
{"/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":"e8b45ca57ef882fe617434502e22a8bf3093bf39","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fix: netapp file copy between volumes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. This patch strips leading slashed from the volume name."},{"line_number":10,"context_line":"   Otherwise the _get_volume_by_args call would fail because the Netapp API"},{"line_number":11,"context_line":"   only allows volumes with letter or underscores as first character"},{"line_number":12,"context_line":"   (NetApp API 917887)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"56c6b3ee_734ecdba","line":9,"updated":"2025-11-27 07:33:51.000000000","message":"leading slash (typo)","commit_id":"a1021a904d30fa12bf13c2ea0dc989ade1d8728b"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"5d31060fe115837286979c469ce6e96310f3a8d2","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fix: netapp file copy between volumes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. This patch strips leading slashed from the volume name."},{"line_number":10,"context_line":"   Otherwise the _get_volume_by_args call would fail because the Netapp API"},{"line_number":11,"context_line":"   only allows volumes with letter or underscores as first character"},{"line_number":12,"context_line":"   (NetApp API 917887)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"f04211c1_09b8c8d0","line":9,"in_reply_to":"56c6b3ee_734ecdba","updated":"2025-12-16 14:31:24.000000000","message":"adjusted","commit_id":"a1021a904d30fa12bf13c2ea0dc989ade1d8728b"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"3498e56e14e0d0306f72fb76f8ffa0e4e1106bc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6644922f_56186d87","updated":"2025-12-16 12:55:29.000000000","message":"Please take a look at the comments.","commit_id":"a1021a904d30fa12bf13c2ea0dc989ade1d8728b"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e8b45ca57ef882fe617434502e22a8bf3093bf39","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6363ae5d_10229bc2","updated":"2025-11-27 07:33:51.000000000","message":"Run-NetApp CI","commit_id":"a1021a904d30fa12bf13c2ea0dc989ade1d8728b"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"5d31060fe115837286979c469ce6e96310f3a8d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4d2a7226_9edd31ea","in_reply_to":"6644922f_56186d87","updated":"2025-12-16 14:31:24.000000000","message":"ack - fixed","commit_id":"a1021a904d30fa12bf13c2ea0dc989ade1d8728b"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"155b5b7d9960a80ab5a90cfaa8d6e767e8f0d212","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"57212d3e_dbd1b968","updated":"2025-12-18 16:43:15.000000000","message":"LGTM","commit_id":"af1974bb45ba4af33ceb1469362a92ee15019bae"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"670da51aeeb542e41dfb1b91f126197f8f893f63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d0fe3efc_cfc3f8ea","updated":"2026-01-28 12:26:34.000000000","message":"@anoop.shukla@netapp.com\n@gawasthi2010@gmail.com\n@rosmaita.fossdev@gmail.com\n\nActually this approach is also not working because we can\u0027t use the returned job uuid to track the copy job. The copy job directly returns success. Follow up operations like registering an copied image in the image-cache will fail due to file busy errors from the netapp api.\n\nAfer opening a netapp case(#2010582439), I learned from the suppport that:\n- The job UUID returned by the POST /api/storage/file/copy call refers to the REST request/job context, not the actual file‑copy operation. This is why that job often reports state\u003d\"success\". Immediately it reflects the acceptance of the request, not the progression of the underlying copy.\n- We should use the private cli wrapper api(\"/api/private/cli/file/copy?fields\u003ddestination-file-path\") endpoint to get the actual copy status according to the netapp ontap folks.\n\nGiven that the driver copy is currently broken without the netapp_copyoffload_tool and this tool is even considered deprecated, I\u0027m unsure how to proceed. Should we either:\n1. Implement the status check via the private wrapper CLI\n2. Remove the copy support completely in the ZAPI/REST driver versions in the volume create path\n\nTo be fair I\u0027m considering more the 2nd option due to performance benchmarks on our side:\nAn 100MB image for example:\n- regular download from glance: below 10sec (~especially with my multipart download blueprint)\n- netapp copy via api and correct status check: between 1-3 minutes until the copy is done(seems like size doesn\u0027t matter much)","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"00d211c1cf78e26b41508de8a51ec0b17af84086","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"bc9cdd97_f70d9ba5","updated":"2026-04-10 08:19:08.000000000","message":"LGTM","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"3c1b3ae4713b72f16cd04e305130424267d6d3dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0fe4116a_1441761c","updated":"2026-01-08 17:16:57.000000000","message":"recheck - Ci failure","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"30fab2cec898f6d40f11aa886dd3703b3aefeb8c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"628c807f_18ed9d15","updated":"2026-01-20 13:41:12.000000000","message":"recheck - ci timeout","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"33a6ca6cc7f3feb9567973765ae60499e73ef734","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a936c89d_f3972996","in_reply_to":"8715cbc9_00ef9891","updated":"2026-04-07 12:22:05.000000000","message":"Sure if it\u0027s the official recommandation to use that private api, I can add this endpoint so that it works for other users.\nFor my current setup I removed it due to the performance reasons mentioned above.","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"22968abf60e2cf8de0b2cc98f22a2722b7fad5c3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a67d8451_9c1bd811","in_reply_to":"91288701_a24aab2b","updated":"2026-04-27 10:55:57.000000000","message":"@anoop.shukla@netapp.com I implemented the private cli workaround and tested it in our env:\n1. Start copying file img-cache-7fd2d673-fc76-4385-b600-d38df2e65d59 from XX ...\n2. Waiting for file copy job 4a41efb9-4227-11f1-b34f-d039ea57a963 to complete. Current status is: allocation_map.\n3. Waiting for file copy job 4a41efb9-4227-11f1-b34f-d039ea57a963 to complete. Current status is: data.\n4. Waiting for file copy job 4a41efb9-4227-11f1-b34f-d039ea57a963 to complete. Current status is: complete.\n\nVolume created successfully","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e6c2592a93f37de44c142e51e9120183d5f3f318","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a6cb3157_3bb7fc03","in_reply_to":"a67d8451_9c1bd811","updated":"2026-05-04 18:26:59.000000000","message":"Awesome. Thanks for the testing @max.lamprecht@digits.schwarz. BTW, just for the knowledge - ONTAP ZAPI to REST documentation does not have an alternative of the get iter - https://docs.netapp.com/us-en/ontap-restmap/file.html#file-copy-get-iter","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"fdaaee62e5a304e1854b86b03044d2225f3b88d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4d164a1b_f9fbc74b","in_reply_to":"a6cb3157_3bb7fc03","updated":"2026-05-05 14:34:58.000000000","message":"Acknowledged","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"00d211c1cf78e26b41508de8a51ec0b17af84086","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"91288701_a24aab2b","in_reply_to":"a936c89d_f3972996","updated":"2026-04-10 08:19:08.000000000","message":"I am aware of many gaps that are there wrt file APIs, this would be one of them. For now, we can work it around via the private cli API as we do not have alternative. In future if this gets addressed by platform team, we can revisit the impl to use the public API. For now I do not see an adverse implication of using the private cli API.","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"ce14810ac04c8c558053ebb7690efaebc550f46e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8715cbc9_00ef9891","in_reply_to":"d0fe3efc_cfc3f8ea","updated":"2026-04-02 16:37:01.000000000","message":"Hi Max. Thanks for the message. Have you tested the private CLI API: /api/private/cli/file/copy?fields\u003ddestination-file-path to be working for this use case? If so, can we not use that API and internally we can track a request to the platform team to provide a way to track the copy status. Which will take some time, but eventually we should be able to move to a public REST API instead.","commit_id":"824e1a85ef0d7c059f80205f8bb5c932dcd8f2b2"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"0b73db627079583d5bdd2d0c02289a69aa3f69e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4197de01_a0d5769b","updated":"2026-09-09 09:13:48.000000000","message":"Any updates on this patch??","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"e6c2592a93f37de44c142e51e9120183d5f3f318","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"db3dcfb6_5ce6ad33","updated":"2026-05-04 18:26:59.000000000","message":"Some additional comments. I think the code looks good overall. Will wait for resolving of the open comments for +1.","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"034feb640cde3b6c789b6f52997f3f37e412b3b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"de9c8a6a_e12e6b96","updated":"2026-06-08 13:03:23.000000000","message":"Thank you for working on this. LGTM.","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"7e1c9bdfaeda3111e14cc9631261db3aa797063f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"dc9b9266_ea9d6eeb","updated":"2026-04-28 19:01:58.000000000","message":"recheck - cinder-tempest-plugin-lvm-lio-barbican Connection to the 172.24.5.121 via SSH timed out kernel panic","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"2a70851f2406e7775ed0b75c595aa5ba0df43519","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e83883dd_2787a2de","updated":"2026-04-27 15:16:42.000000000","message":"recheck - cinder-tempest-plugin-lvm-lio-barbican Connection to the 172.24.5.143 via SSH timed out","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"d5c213a7fa9a568d307bf40124b0d126eff3b60e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"00fbe8d0_f85dfcd4","updated":"2026-04-30 18:15:30.000000000","message":"recheck - devstack-plugin-nfs-tempest-full - TIMED_OUT","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"be5e352b61556e19ca328f13c77c1581b80b324d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"6c8a3b7c_05bd04d6","updated":"2026-04-30 08:36:19.000000000","message":"recheck - devstack-plugin-nfs-tempest-full - TIMED_OUT","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"a174a15476a4730c8e07eacefe5b2cadbfe86f70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"efe4405b_d8c7dc54","updated":"2026-04-28 13:23:51.000000000","message":"recheck - devstack-plugin-nfs-tempest-full timeout","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"871a9ef373e51b0bbb1416936d34d44db95d8065","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3290f3d6_16836a57","updated":"2026-04-29 15:19:46.000000000","message":"recheck - openstack-tox-py313 cinder.tests.unit.backup.drivers.test_backup_ceph.BackupCephTestCase - fixtures._fixtures.timeout.TimeoutException","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"ab46f7f4293987d96d6b15992bfb2664adefd00b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"26b960a4_a11dd1df","in_reply_to":"4197de01_a0d5769b","updated":"2026-09-21 08:20:36.000000000","message":"rebased it","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":36180,"name":"Gireesh Awasthi","display_name":"Gireesh","email":"gawasthi2010@gmail.com","username":"agireesh","status":"NetApp"},"change_message_id":"c9966bee997a94c824ffa00514101a6d390a7b2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8c20fc5a_89b3fea6","updated":"2026-10-07 09:49:57.000000000","message":"LGTM ..!","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"87501a9d9dc577ff8d49369e487a4040f2b56eae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"96e3f379_191f9be4","updated":"2026-09-24 05:19:07.000000000","message":"LGTM. NetApp CI is successful as well.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"d1de9f141e047f4a52a2a515c624579ad58325da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"41103327_64b623b4","updated":"2026-09-22 13:14:10.000000000","message":"Run-NetApp CI","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"24a4e6fea62a151e1c7b96b2b7d134c7ca0f1bc7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"bf315a5d_b652b24c","updated":"2026-09-14 05:48:48.000000000","message":"recheck - tempest-slow-py3 tempest.scenario.test_volume_backup_restore.TestVolumeBackupRestore.test_volume_backup_restore - Volume is in ERROR state","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"}],"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":"e6c2592a93f37de44c142e51e9120183d5f3f318","unresolved":true,"context_lines":[{"line_number":2585,"context_line":""},{"line_number":2586,"context_line":"        if not result or not result.get(\u0027records\u0027) or \\"},{"line_number":2587,"context_line":"                len(result.get(\u0027records\u0027)) \u003d\u003d 0:"},{"line_number":2588,"context_line":"            return None"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"        records \u003d result.get(\u0027records\u0027)"},{"line_number":2591,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3cff104b_8ccb837b","line":2588,"updated":"2026-05-04 18:26:59.000000000","message":"We should log this state before returning.","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"fdaaee62e5a304e1854b86b03044d2225f3b88d3","unresolved":true,"context_lines":[{"line_number":2585,"context_line":""},{"line_number":2586,"context_line":"        if not result or not result.get(\u0027records\u0027) or \\"},{"line_number":2587,"context_line":"                len(result.get(\u0027records\u0027)) \u003d\u003d 0:"},{"line_number":2588,"context_line":"            return None"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"        records \u003d result.get(\u0027records\u0027)"},{"line_number":2591,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"aab51141_e46baf3f","line":2588,"in_reply_to":"3cff104b_8ccb837b","updated":"2026-05-05 14:34:58.000000000","message":"Hey @anoop.shukla@netapp.com,\n\nI\u0027m not sure if we need sonmething here. In the calling function, there is already an error log. -\u003e https://github.com/openstack/cinder/blob/849ddb6cef2b06084b7b116cb2ae5ce7da610e1b/cinder/volume/drivers/netapp/dataontap/nfs_cmode.py#L1189-L1192\n\nThis get\u0027s also used by the zapi implementation","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"034feb640cde3b6c789b6f52997f3f37e412b3b3","unresolved":true,"context_lines":[{"line_number":2585,"context_line":""},{"line_number":2586,"context_line":"        if not result or not result.get(\u0027records\u0027) or \\"},{"line_number":2587,"context_line":"                len(result.get(\u0027records\u0027)) \u003d\u003d 0:"},{"line_number":2588,"context_line":"            return None"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"        records \u003d result.get(\u0027records\u0027)"},{"line_number":2591,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"f3922800_d9ad4dda","line":2588,"in_reply_to":"aab51141_e46baf3f","updated":"2026-06-08 13:03:23.000000000","message":"Ack","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":35676,"name":"Max","email":"max.lamprecht@digits.schwarz","username":"lamprechtm"},"change_message_id":"f3ebd32a831f771172bd33c4049bd932792004d6","unresolved":false,"context_lines":[{"line_number":2585,"context_line":""},{"line_number":2586,"context_line":"        if not result or not result.get(\u0027records\u0027) or \\"},{"line_number":2587,"context_line":"                len(result.get(\u0027records\u0027)) \u003d\u003d 0:"},{"line_number":2588,"context_line":"            return None"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"        records \u003d result.get(\u0027records\u0027)"},{"line_number":2591,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"a3c2b40e_ca218937","line":2588,"in_reply_to":"f3922800_d9ad4dda","updated":"2026-06-08 14:52:46.000000000","message":"resolved","commit_id":"bc1a084db7073b3bbcd29c3b9705b94c88d40fd9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":505,"context_line":"            # strip leading \u0027/\u0027 from path"},{"line_number":506,"context_line":"            # Reason NetApp API 917887: Volume name: The first character"},{"line_number":507,"context_line":"            # must be a letter or underscore."},{"line_number":508,"context_line":"            query[\u0027name\u0027] \u003d vol_name.lstrip(\u0027/\u0027)"},{"line_number":509,"context_line":"        if vol_path:"},{"line_number":510,"context_line":"            query[\u0027nas.path\u0027] \u003d vol_path"},{"line_number":511,"context_line":"        if vserver:"}],"source_content_type":"text/x-python","patch_set":7,"id":"4548a4a4_7f10592f","line":508,"updated":"2026-10-08 14:49:45.000000000","message":"lstrip(\u0027/\u0027) is the right place for the 917887 rejection. A volume name\ncannot start with \u0027/\u0027, so names that are already legal are unchanged.\n\nRemote cache copy passes the export junction into start_file_copy().\nget_export_host_junction_path() returns the text after \u0027:\u0027 of\nhost:/path, so that string starts with \u0027/\u0027. _get_destination_ip_and_path()\nthen does dest_path.rsplit(\u0027/\u0027, 1)[0], which keeps the leading slash.\nThe image-service path already strips one slash before _copy_file()\n(nfs_cmode.py, split(\u0027/\u0027, 1) on the source and dest share paths).\nMigration uses pool.split(\u0027:/\u0027)[1], which has no leading slash, so\nlstrip is a no-op there.\n\nPlease add a unit test that vol_name\u003d\u0027/vol1\u0027 is sent as name\u003dvol1.\nThe junction is what this driver already passes as the volume name;\nlstrip does not make a junction that differs from the flexvol name\nstart matching.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":3282,"context_line":"        }"},{"line_number":3283,"context_line":""},{"line_number":3284,"context_line":"        result \u003d self.send_request(\u0027/storage/file/copy\u0027, \u0027post\u0027, body\u003dbody,"},{"line_number":3285,"context_line":"                                   enable_tunneling\u003dFalse)"},{"line_number":3286,"context_line":"        return result[\u0027uuid\u0027]"},{"line_number":3287,"context_line":""},{"line_number":3288,"context_line":"    def destroy_file_copy(self, job_uuid):"}],"source_content_type":"text/x-python","patch_set":7,"id":"69f3465e_063688f6","line":3285,"updated":"2026-10-08 14:49:45.000000000","message":"Please keep wait_on_accepted\u003dFalse and return result[\u0027job\u0027][\u0027uuid\u0027].\n\nCurrent master already passes wait_on_accepted\u003dFalse. send_request()\ndefaults wait_on_accepted to True, and on HTTP 202 it calls\n_wait_job_result(). That waiter uses stop_after_attempt(\nnetapp_async_rest_timeout / 2) with a 2s interval. The option default\nis 60 seconds (options.py, minimum 60). The scanner poll in\n_copy_file() is allowed netapp_migrate_volume_timeout, default 3600.\n\nThis patch\u0027s own NOTE says the /cluster/jobs state goes to success\nwhen the request is accepted, not when the scanner finishes. Waiting\non that job does not wait for the copy. Returning result[\u0027uuid\u0027] is\nthe waited job object; with wait_on_accepted\u003dFalse the 202 body is\nresult[\u0027job\u0027][\u0027uuid\u0027], and result[\u0027uuid\u0027] raises KeyError.\n\nIf a future ONTAP release keeps that job in \"running\" until the\nscanner finishes, start_file_copy() hits the 60s waiter and the\n3600s poll never starts.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":3296,"context_line":"            raise na_utils.NetAppDriverException(msg % (job_uuid, e))"},{"line_number":3297,"context_line":""},{"line_number":3298,"context_line":"    def get_file_copy_status(self, job_uuid, dest_file_name):"},{"line_number":3299,"context_line":"        \"\"\"Get file copy job status from a given job\u0027s UUID.\"\"\""},{"line_number":3300,"context_line":"        # NOTE(Max): /cluster/jobs/{job_uuid} endpoint immediately returns the"},{"line_number":3301,"context_line":"        # job info with the state of \u0027success\u0027. Sadly the job state does not"},{"line_number":3302,"context_line":"        # reflect the actual file copy progress, and the file copy can still"}],"source_content_type":"text/x-python","patch_set":7,"id":"b281b6ab_5569c246","line":3299,"updated":"2026-10-08 14:49:45.000000000","message":"Docstring still says \"from a given job\u0027s UUID\". The query does not\nsend job_uuid.\n\nThe KB link and the reason /cluster/jobs success is only request\nacceptance should stay. Please drop the link to this Gerrit change\n(lines 3308-3311).\n\n\"not result.get(\u0027records\u0027)\" is already false for [], so the\nlen(result.get(\u0027records\u0027)) \u003d\u003d 0 clause on the next line is redundant.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":3326,"context_line":""},{"line_number":3327,"context_line":"        records \u003d result.get(\u0027records\u0027)"},{"line_number":3328,"context_line":""},{"line_number":3329,"context_line":"        if len(records) \u003e 1:"},{"line_number":3330,"context_line":"            LOG.warning(\u0027Multiple file copy records found for file \u0027"},{"line_number":3331,"context_line":"                        \u0027%(dest_file)s. Returning the status of the first \u0027"},{"line_number":3332,"context_line":"                        \u0027record. Records: %(records)s\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3deccd4f_8776a327","line":3329,"updated":"2026-10-08 14:49:45.000000000","message":"job_uuid is not used. The docstring on this method still says the\nstatus comes from the job UUID. The query is only\ndestination-file-path\u003d/{dest_file_name}. When len(records) \u003e 1 this\nlogs and returns records[0].\n\nZAPI file-copy-get-iter is filtered by job-uuid before it takes the\nfirst row. This call is not. If the first row is an older \"complete\"\nfor the same destination, _copy_file() returns and\n_finish_volume_migration() deletes the source\n(nfs_cmode.py _finish_volume_migration deletes the source volume\nafter _copy_file returns).\n\nPlease select the row for this destination. If more than one row is\nstill in progress, fail the copy. The fixture\u0027s destination_file_path\nis [\"/volume-ead38d08-0ff4-4ea8-a76b-66a6725670f0\"], which is not the\nqueried /{dest_file}, and the node name is dea-nas201b. Please use a\nfake path that matches the query.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":3334,"context_line":""},{"line_number":3335,"context_line":"        copy_status \u003d {"},{"line_number":3336,"context_line":"            \u0027job-status\u0027: records[0].get(\u0027scanner_status\u0027),"},{"line_number":3337,"context_line":"            \u0027last-failure-reason\u0027: records[0].get(\u0027last-failure-reason\u0027)"},{"line_number":3338,"context_line":"        }"},{"line_number":3339,"context_line":""},{"line_number":3340,"context_line":"        return copy_status"}],"source_content_type":"text/x-python","patch_set":7,"id":"ab588ad7_945445e0","line":3337,"updated":"2026-10-08 14:49:45.000000000","message":"records[0].get(\u0027last-failure-reason\u0027) does not match the private CLI\nresponse keys this client already parses.\n\nget_flexvol_dedupe_info() requests fields logical-data-size and\nlogical-data-limit on /private/cli/volume/efficiency and reads\nlogical_data_size and logical_data_limit (underscores). This method\nalready reads scanner_status, and the poll log on this change showed\nallocation_map / data / complete, so that underscore key is the one\nONTAP returned. last-failure-reason is the hyphenated query name.\nA destroyed copy then surfaces as \"Error copying file X. None.\"\n\ntest_get_file_copy_status cannot catch this. The fixture has no failure\nfield, and .get(\u0027last-failure-reason\u0027) is None for a missing key, so\nthe assertion passes with either spelling. Please put\nlast_failure_reason on the record and assert that value.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"}],"cinder/volume/drivers/netapp/dataontap/nfs_cmode.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":769,"context_line":"                      \"file copy operation.\", volume[\u0027id\u0027])"},{"line_number":770,"context_line":"            # set provider_location otherwise register_image_in_cache"},{"line_number":771,"context_line":"            # will fail to find the share"},{"line_number":772,"context_line":"            volume[\u0027provider_location\u0027] \u003d volume_utils.extract_host("},{"line_number":773,"context_line":"                volume[\u0027host\u0027], level\u003d\u0027pool\u0027)"},{"line_number":774,"context_line":"        self._register_image_in_cache(volume, image_id)"},{"line_number":775,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"040a39eb_1a58bab5","line":772,"updated":"2026-10-08 14:49:45.000000000","message":"This assignment matches the copy-offload branch at line 699:\nvolume_utils.extract_host(volume[\u0027host\u0027], level\u003d\u0027pool\u0027).\n_register_image_in_cache() passes volume[\u0027provider_location\u0027] into\n_do_clone_rel_img_cache() as the share. A missing share is caught\nthere and logged; it does not fail the volume create\n(nfs_base.py _register_image_in_cache). The comment \"will fail to\nfind the share\" overstates it: registration is skipped and the next\ncreate of this image misses the cache.\n\ntest_copy_from_remote_cache sets\nhost\u003d\u0027fakeHost@%s#%s\u0027 % (fake.BACKEND_NAME, fake.POOL_NAME) so\nextract_host() does not raise, and never checks the field. For\nuse_copyoffload_tool\u003dFalse please assert\nfake_vol[\u0027provider_location\u0027] \u003d\u003d fake.POOL_NAME. The True branch\ndoes not run these lines.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"165ca388fbbe0716905e3df66780c655ab18ab48","unresolved":true,"context_lines":[{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"        def _wait_file_copy_complete():"},{"line_number":1237,"context_line":"            copy_status \u003d self.zapi_client.get_file_copy_status(job_uuid,"},{"line_number":1238,"context_line":"                                                                dest_file_name)"},{"line_number":1239,"context_line":"            LOG.debug(\u0027Waiting for file copy job %s to complete. Current \u0027"},{"line_number":1240,"context_line":"                      \u0027status is: %s.\u0027, job_uuid, copy_status[\u0027job-status\u0027])"},{"line_number":1241,"context_line":"            if not copy_status:"}],"source_content_type":"text/x-python","patch_set":7,"id":"593124a2_a40a9549","line":1238,"updated":"2026-10-08 14:49:45.000000000","message":"get_file_copy_status() returns None when records is missing or empty.\nThis debug line reads copy_status[\u0027job-status\u0027] before the None check\non the next line, so the NetAppDriverException is unreachable and the\ncallback raises TypeError.\n\nThat None check and the format string under it are already on master.\nThey matter on this patch because the new REST method returns None\nfor an empty CLI response, and the old REST method returned a dict\nonce /cluster/jobs had a state. ZAPI also returns None when\nfile-copy-get-iter has no attributes-list, so this is the same hole\non that path.\n\nThe message is also not a valid format: \"Job UUID % doesn\u0027t\" has a\nbare %. The % operator is given (file_name, job_uuid). After the None\ncheck is moved above the log, this branch raises ValueError instead\nof NetAppDriverException. Please use %s.\n\nIf the CLI row can appear after the POST returns, failing the first\nempty poll aborts a copy that is just starting. ZAPI treats a missing\njob as fatal; for this CLI poll, an empty response needs an explicit\nchoice: keep failing, or keep polling until the migrate timeout.","commit_id":"6f6b7d875367a0107bd0c50c5f98d5b3aa29b97e"}]}
