)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"cb061994d756378b0313d8efa01300075cba202c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4ee312dc_b072af60","updated":"2026-08-21 15:12:51.000000000","message":"Code and tests LGTM, but please fix the release note.","commit_id":"40ab291b7f5c9d088e7ab8457cce687f1e45c5e9"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"10600ce9496b3a66ec7975d156eb93247a9c394e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"15190304_48254346","updated":"2026-08-18 04:33:47.000000000","message":"LGTM","commit_id":"40ab291b7f5c9d088e7ab8457cce687f1e45c5e9"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"6f6597c9db653983c8dc8d2416856793d2bf39d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4053a7ea_72e0d7f6","updated":"2026-08-17 13:48:07.000000000","message":"run-NetApp CI","commit_id":"40ab291b7f5c9d088e7ab8457cce687f1e45c5e9"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"00f42055c53ec5b5ab4579ebd82241b496d9b7a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"320d1e69_7cd7095b","updated":"2026-08-21 15:49:40.000000000","message":"My concern has been addressed; hopefully zuul and the netapp CI will agree!","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"76e0d4add5c1a46397c7d1f737ab2e444d1a668e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"26129e78_d472cdfd","updated":"2026-08-21 17:39:09.000000000","message":"No NetApp CI response yet - is there actually a NetApp CI for NFS - all I see are iscsi, fcp and nvme-tcp.\nWe need a CI that tests the NFS data integrity paths this patch is actually working on... I note the commit message live validation note, but we really should have a CI job for this as its pretty major protocol for NetApp","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"5eaae17f3580f71ef8534f991cf8a03965aa4a92","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1e65bfbc_6ef7593c","in_reply_to":"26129e78_d472cdfd","updated":"2026-08-24 17:47:33.000000000","message":"These fixes are well tested functionally as mentioned in the commit message. CI run today does not accommodate NFS, and it\u0027s our backlog to address. We are tracking it. Thanks much!!","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b6f875b6888cc23dc4030fa7348becc123b058f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"63afd6a4_4bd18428","updated":"2026-08-25 05:20:44.000000000","message":"LGTM","commit_id":"4323a98d6c43bf32fed9e0f3bc706fe0cc750a36"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"bf6fe6a2bd3f3265aa31db31c27f9eaddb50543e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e94d1ddd_baeb416f","updated":"2026-08-24 18:05:02.000000000","message":"Looks good now - thanks for addressing the requests.","commit_id":"4323a98d6c43bf32fed9e0f3bc706fe0cc750a36"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"5eaae17f3580f71ef8534f991cf8a03965aa4a92","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e9b0d0b2_185d8cd1","updated":"2026-08-24 17:47:33.000000000","message":"Thank you so much simon@everpuredata.com for thorough review and comments. Really appreciate it. Addressed all your comments. Could you please take a look and approve.","commit_id":"4323a98d6c43bf32fed9e0f3bc706fe0cc750a36"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"b393c13ca318e7530d9b9486fa1399ccb7ca2bf6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"814f6d81_55c21cb0","updated":"2026-08-24 17:51:47.000000000","message":"run-NetApp CI","commit_id":"4323a98d6c43bf32fed9e0f3bc706fe0cc750a36"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"03f6037020f6061744112de112bd4218328e4e81","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ea7eb770_f673d289","updated":"2026-08-25 02:14:02.000000000","message":"run-NetApp CI","commit_id":"4323a98d6c43bf32fed9e0f3bc706fe0cc750a36"}],"cinder/volume/drivers/netapp/dataontap/client/client_cmode_rest.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"76e0d4add5c1a46397c7d1f737ab2e444d1a668e","unresolved":true,"context_lines":[{"line_number":2071,"context_line":"                # the .snapshot/ path is inaccessible.  Fall back to the"},{"line_number":2072,"context_line":"                # private CLI endpoint which resolves the snapshot by name"},{"line_number":2073,"context_line":"                # internally without requiring .snapshot/ visibility."},{"line_number":2074,"context_line":"                self._clone_via_private_cli("},{"line_number":2075,"context_line":"                    vserver, flex_vol, src_path, dest_path, source_snapshot)"},{"line_number":2076,"context_line":"        else:"},{"line_number":2077,"context_line":"            self.send_request(\u0027/storage/file/clone\u0027, \u0027post\u0027, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d9240593_86516357","line":2074,"updated":"2026-08-21 17:39:09.000000000","message":"The private-CLI fallback discards the `body` built above, so two settings are silently lost when `snapshot_directory_access_enabled` is `False`:\n\n* `body[\u0027is_backup\u0027] \u003d True` (line 2058, when `is_snapshot and BACKUP_CLONE_PARAM`) — the clone is no longer marked as a backup clone\n* `body[\u0027overwrite_destination\u0027] \u003d True` (line 2061, when `dest_exists`) — the clone can now fail if the destination already exists\n\n`_clone_via_private_cli` only sends vserver/volume/source-path/destination-path/snapshot-name. Could the equivalent private-CLI flags be passed, or the limitation at least be documented in the helper\u0027s docstring so the divergence is discoverable?","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"5eaae17f3580f71ef8534f991cf8a03965aa4a92","unresolved":false,"context_lines":[{"line_number":2071,"context_line":"                # the .snapshot/ path is inaccessible.  Fall back to the"},{"line_number":2072,"context_line":"                # private CLI endpoint which resolves the snapshot by name"},{"line_number":2073,"context_line":"                # internally without requiring .snapshot/ visibility."},{"line_number":2074,"context_line":"                self._clone_via_private_cli("},{"line_number":2075,"context_line":"                    vserver, flex_vol, src_path, dest_path, source_snapshot)"},{"line_number":2076,"context_line":"        else:"},{"line_number":2077,"context_line":"            self.send_request(\u0027/storage/file/clone\u0027, \u0027post\u0027, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":2,"id":"e6f4f6e3_6a0a489d","line":2074,"in_reply_to":"d9240593_86516357","updated":"2026-08-24 17:47:33.000000000","message":"Fixed. _clone_via_private_cli now accepts is_backup/overwrite_destination and threads them through to -is-backup/-overwrite-destination on the private CLI call. Added a dedicated test (test_clone_file_with_dir_access_disabled_is_backup_and_overwrite) covering the fallback with both flags set.","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"76e0d4add5c1a46397c7d1f737ab2e444d1a668e","unresolved":true,"context_lines":[{"line_number":2174,"context_line":"        if primary_exc is not None:"},{"line_number":2175,"context_line":"            raise primary_exc"},{"line_number":2176,"context_line":""},{"line_number":2177,"context_line":"    def _check_lun_visible(self, lun_path):"},{"line_number":2178,"context_line":"        \"\"\"Checks that a cloned LUN is visible via the management catalog."},{"line_number":2179,"context_line":""},{"line_number":2180,"context_line":"        ONTAP\u0027s clone endpoints (REST and private CLI) both complete"}],"source_content_type":"text/x-python","patch_set":2,"id":"d44b1ba9_e1f43c3d","line":2177,"updated":"2026-08-21 17:39:09.000000000","message":"I\u0027d suggest dropping this. It can\u0027t affect the outcome — it only logs a warning, and the docstring says as much (\"a single sanity check, not a retry loop, since polling was found to be unnecessary\") — so it\u0027s one extra REST round trip per LUN clone for no behavioural benefit.\n\nIt\u0027s also querying the wrong endpoint for the job: `get_lun_by_args` hits the collection endpoint immediately after creation, which is exactly the read-after-write lag that change 988315 is adding `get_lun_by_uuid()` to work around (\"avoiding the collection catalog\u0027s read-after-write lag relative to the object\u0027s own creation response\"). So on the arrays 988315 targets, this will likely emit spurious warnings for clones that succeeded.\n\nIf the check is worth keeping, it should either use the single-resource fetch or be made actionable.","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"5eaae17f3580f71ef8534f991cf8a03965aa4a92","unresolved":false,"context_lines":[{"line_number":2174,"context_line":"        if primary_exc is not None:"},{"line_number":2175,"context_line":"            raise primary_exc"},{"line_number":2176,"context_line":""},{"line_number":2177,"context_line":"    def _check_lun_visible(self, lun_path):"},{"line_number":2178,"context_line":"        \"\"\"Checks that a cloned LUN is visible via the management catalog."},{"line_number":2179,"context_line":""},{"line_number":2180,"context_line":"        ONTAP\u0027s clone endpoints (REST and private CLI) both complete"}],"source_content_type":"text/x-python","patch_set":2,"id":"d1b7629d_635bee49","line":2177,"in_reply_to":"d44b1ba9_e1f43c3d","updated":"2026-08-24 17:47:33.000000000","message":"Agreed, dropped it. It never affected control flow, and you\u0027re right that it\u0027s prone to false positives from read-after-write lag on the collection endpoint. Removed _check_lun_visible and both call sites; confirmed no dedicated test depended on it (only indirectly via now-removed get_lun_by_args mocks).","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"76e0d4add5c1a46397c7d1f737ab2e444d1a668e","unresolved":true,"context_lines":[{"line_number":2229,"context_line":"                # snapshot_directory_access_enabled is False; fall back to"},{"line_number":2230,"context_line":"                # the private CLI endpoint which resolves the snapshot by"},{"line_number":2231,"context_line":"                # name without relying on .snapshot/ path visibility."},{"line_number":2232,"context_line":"                self._clone_lun_via_private_cli("},{"line_number":2233,"context_line":"                    volume, name, new_name, source_snapshot)"},{"line_number":2234,"context_line":"                return"},{"line_number":2235,"context_line":"        source_path +\u003d f\u0027/{name}\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"56abb93e_cdae7fac","line":2232,"updated":"2026-08-21 17:39:09.000000000","message":"Same issue as line 2074, but with a worse consequence: this returns before the body is built at 2235, so the fallback silently drops\n\n* `space_reserved` → `space.guarantee.requested` is never set\n* `qos_policy_group_name` → `body[\u0027qos_policy\u0027]` is never applied\n\nA clone that should carry a QoS policy silently won\u0027t, on any FlexVol with `snapshot_directory_access_enabled\u003dFalse`. Please pass `-space-reserve` and `-qos-policy-group` through to the private CLI, or fail loudly rather than degrade silently.","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"5eaae17f3580f71ef8534f991cf8a03965aa4a92","unresolved":false,"context_lines":[{"line_number":2229,"context_line":"                # snapshot_directory_access_enabled is False; fall back to"},{"line_number":2230,"context_line":"                # the private CLI endpoint which resolves the snapshot by"},{"line_number":2231,"context_line":"                # name without relying on .snapshot/ path visibility."},{"line_number":2232,"context_line":"                self._clone_lun_via_private_cli("},{"line_number":2233,"context_line":"                    volume, name, new_name, source_snapshot)"},{"line_number":2234,"context_line":"                return"},{"line_number":2235,"context_line":"        source_path +\u003d f\u0027/{name}\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"b72645a1_6b10bc5d","line":2232,"in_reply_to":"56abb93e_cdae7fac","updated":"2026-08-24 17:47:33.000000000","message":"Fixed — passing these through now rather than failing loudly, to keep behavior consistent with the normal (non-fallback) path. _clone_lun_via_private_cli forwards space_reserved→-no-reserve and qos_policy_group_name→-qos-policy-group/-qos-adaptive-policy-group. Added test_clone_lun_with_dir_access_disabled_space_reserved_and_qos to cover it.","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"76e0d4add5c1a46397c7d1f737ab2e444d1a668e","unresolved":true,"context_lines":[{"line_number":2279,"context_line":"            volume \u003d self._get_volume_by_args("},{"line_number":2280,"context_line":"                vol_name\u003dvolume_name,"},{"line_number":2281,"context_line":"                fields\u003d\u0027snapshot_directory_access_enabled\u0027)"},{"line_number":2282,"context_line":"            return volume.get(\u0027snapshot_directory_access_enabled\u0027, True)"},{"line_number":2283,"context_line":"        except exception.VolumeBackendAPIException:"},{"line_number":2284,"context_line":"            LOG.warning(\u0027Could not retrieve snapshot_directory_access_enabled \u0027"},{"line_number":2285,"context_line":"                        \u0027for volume %s; assuming False.\u0027, volume_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"e8ba7cf3_898d3472","line":2282,"updated":"2026-08-21 17:39:09.000000000","message":"These two branches disagree on the default for what is the same condition — \"we couldn\u0027t determine the setting\":\n\n```\nreturn volume.get(\u0027snapshot_directory_access_enabled\u0027, True)   # field absent  -\u003e True  -\u003e .snapshot/ path\nexcept exception.VolumeBackendAPIException:\n    return False                                               # lookup failed -\u003e False -\u003e private CLI\n```\n\nThe private-CLI fallback works whether or not `.snapshot/` is accessible, so `False` is the safer answer in both cases. Assuming `True` on a missing field builds a `.snapshot/` path that may not resolve. Either align them on `False`, or add a comment explaining why the two unknowns are treated differently.","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"5eaae17f3580f71ef8534f991cf8a03965aa4a92","unresolved":false,"context_lines":[{"line_number":2279,"context_line":"            volume \u003d self._get_volume_by_args("},{"line_number":2280,"context_line":"                vol_name\u003dvolume_name,"},{"line_number":2281,"context_line":"                fields\u003d\u0027snapshot_directory_access_enabled\u0027)"},{"line_number":2282,"context_line":"            return volume.get(\u0027snapshot_directory_access_enabled\u0027, True)"},{"line_number":2283,"context_line":"        except exception.VolumeBackendAPIException:"},{"line_number":2284,"context_line":"            LOG.warning(\u0027Could not retrieve snapshot_directory_access_enabled \u0027"},{"line_number":2285,"context_line":"                        \u0027for volume %s; assuming False.\u0027, volume_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3db3ab3f_1dba4e13","line":2282,"in_reply_to":"e8ba7cf3_898d3472","updated":"2026-08-24 17:47:33.000000000","message":"Aligned both branches on False — couldn\u0027t find a justification for the asymmetry, and the private-CLI fallback works either way, so False is the safer default when we can\u0027t determine the setting. Added test_get_volume_snapshot_dir_access_field_missing_returns_false to lock this in.","commit_id":"6e5812de4f6b7ac98b5f832ebb06a9bfa2540ef7"}],"releasenotes/notes/netapp-ontap-cg-clone-snapshot-dir-fallback-db7ede4ef10f3888.yaml":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"cb061994d756378b0313d8efa01300075cba202c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b55c7e8d_f4d94189","line":8,"updated":"2026-08-21 15:12:51.000000000","message":"I hate to do this to you, but please follow the bugfix format for a release note.  Having a link to the bug here is helpful to operators who want to understand the issue.\n\nhttps://docs.openstack.org/cinder/latest/contributor/releasenotes.html#drivers","commit_id":"40ab291b7f5c9d088e7ab8457cce687f1e45c5e9"},{"author":{"_account_id":36179,"name":"Saikumar Pulluri","display_name":"Saikumar Pulluri","email":"saikumar1016@gmail.com","username":"pulluri"},"change_message_id":"cdad9e9f14a7c3c1fbed1396644c93d46dafe7ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9690cd28_32608a7a","line":8,"in_reply_to":"b55c7e8d_f4d94189","updated":"2026-08-21 15:44:31.000000000","message":"Thanks for the review Brian @rosmaita.fossdev@gmail.com, fixed the release notes format.","commit_id":"40ab291b7f5c9d088e7ab8457cce687f1e45c5e9"}]}
