)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":37888,"name":"Akshay Ranade","display_name":"Akshay Ranade","email":"akshay.ranade@ibm.com","username":"rakshay"},"change_message_id":"be7ae116c9511bb74d4c4edd7a78c926d6245ff4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"bef9f708_710938e4","updated":"2026-01-16 15:42:58.000000000","message":"If volume.group_id is present but the group type is not a CG-snapshot type, the code currently skips the add_member call. Since the volume still belongs to a group_id in Cinder, how is the backend kept in sync?","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":36538,"name":"Harsh Ailani","display_name":"Harsh Ailani","email":"harsh.ailani@ibm.com","username":"harshailani"},"change_message_id":"2328ae747ffc84c0a9a875bde14d906cc8869898","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f11cb31b_63bd5ca3","updated":"2026-01-16 14:15:19.000000000","message":"Minor comments. Otherwise code logic looks good.","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"92403126_90b86305","in_reply_to":"f11cb31b_63bd5ca3","updated":"2026-03-13 14:57:51.000000000","message":"Hello Harsh,\n\nThank you very much for the review!\n\n\u003e Minor comments. Otherwise code logic looks good.\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"9fce1331a48287dee0a4bed0222d1a067f257e08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7d3a009b_62159eea","updated":"2026-04-01 12:34:39.000000000","message":"thnx for the update, lgtm","commit_id":"a7edbd50b0a45c84f41a4d71235087dce605ae0b"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"da8b865e25068f0ce0665cfd9be770cc3c82d26d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"51b8ae61_46e98064","updated":"2026-09-28 12:43:11.000000000","message":"Just a small adjustment based on Simon\u0027s comment","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f4870fd6e75146589c61fc3b9ab337dffcae1309","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"27c0fb13_b5d48091","updated":"2026-09-24 14:33:48.000000000","message":"Looks good and the earlier rounds fixed the real issues (cleanup on failure, resize delta). +1 from me with one question inline about provisioning/compression on promoted clones, and a couple of release-note asks.\n\nNote this conflicts with 950574 and 995743 (all three bump to 1.16 and touch the same regions); whichever lands first forces the others to rebase.","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"46b35a547e972f6016096ea612c2557f147827c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8d412dba_5375a182","updated":"2026-09-23 20:56:17.000000000","message":"recheck openstack-tox-py314 timed out, with two workers last reporting\ncompleted tests in cinder.tests.unit.backup.drivers.test_backup_ceph.\n\nA similar timeout occurred on change 1006841, patch set 1, and the same\njob subsequently passed after recheck without a new patch set.\nRetrying to obtain another data point.","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"99c1eecf_9bc2f994","in_reply_to":"27c0fb13_b5d48091","updated":"2026-10-01 06:52:11.000000000","message":"Hello Simon,\n\nThank you very much for the review!\n\n\u003e Looks good and the earlier rounds fixed the real issues (cleanup on failure, resize delta). +1 from me with one question inline about provisioning/compression on promoted clones, and a couple of release-note asks.\n\u003e \n\u003e Note this conflicts with 950574 and 995743 (all three bump to 1.16 and touch the same regions); whichever lands first forces the others to rebase.\n\n\nPromoted clones now explicitly apply the backend provisioning and compression settings. When `infinidat_use_compression` is unset, the configured pool’s compression setting is applied, matching normal volume creation. I’ve also updated the release notes to document the minimum InfiniSDK version and the fallback to generic data copying.\n\nAgreed regarding the conflicts with 950574 and 995743. I’ll handle these changes sequentially and rebase the remaining patches as each change merges, resolving the overlapping changes and adjusting the driver version numbers accordingly.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ed6c9bd8_38443cd2","in_reply_to":"51b8ae61_46e98064","updated":"2026-10-01 06:52:11.000000000","message":"Hello Erlon,\n\nThank you very much for the review!\n\n\u003e Just a small adjustment based on Simon\u0027s comment\n\nI’ve addressed Simon’s comments: promoted clones now apply provisioning and compression settings consistently with normal volume creation, with corresponding unit tests. I’ve also added the snapshot-of-snapshot comment.\n\nThe startup messages now state the minimum InfiniSDK requirement without prescribing an installation command.\n\nThe release notes now document InfuzeOS 8.1 support, the InfiniSDK \u003e\u003d 250.0.0 requirement, and the fallback to generic data copying.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"bf15e00030e01bffc77b5c22ce0a99a3a82c32d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b2b47b6f_aaa4a80b","updated":"2026-10-01 18:26:58.000000000","message":"LGTM","commit_id":"4202c9c20e12572ab7ff7f7c38bbae5ffe63e045"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"85890ec03606195aa8d4584869266edcf162a8ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c94c020c_5379eb42","updated":"2026-10-02 15:14:00.000000000","message":"Other reviewers did a great job here working out any kinks.\nZuul, CI passing.\nLGTM.","commit_id":"4202c9c20e12572ab7ff7f7c38bbae5ffe63e045"}],"cinder/volume/drivers/infinidat.py":[{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"fe9370b70ad3f0845be25da298c937fc1be62b9e","unresolved":true,"context_lines":[{"line_number":180,"context_line":"        if pkg_version.parse(version) \u003c pkg_version.parse(\u0027250.0.0\u0027):"},{"line_number":181,"context_line":"            message \u003d (_(\u0027The installed version of the infinisdk Python \u0027"},{"line_number":182,"context_line":"                         \u0027library is out of date: %(version)s, please \u0027"},{"line_number":183,"context_line":"                         \u0027update it with: pip3 install -U infinisdk\u0027)"},{"line_number":184,"context_line":"                       % {\u0027version\u0027: version})"},{"line_number":185,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"},{"line_number":186,"context_line":"        auth \u003d (self.configuration.san_login,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dbd3b55a_e057f753","line":183,"range":{"start_line":183,"start_character":35,"end_line":183,"end_character":69},"updated":"2026-01-16 15:37:41.000000000","message":"I think it\u0027d better to hint to the required min version in this message than propose an update command.","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        if pkg_version.parse(version) \u003c pkg_version.parse(\u0027250.0.0\u0027):"},{"line_number":181,"context_line":"            message \u003d (_(\u0027The installed version of the infinisdk Python \u0027"},{"line_number":182,"context_line":"                         \u0027library is out of date: %(version)s, please \u0027"},{"line_number":183,"context_line":"                         \u0027update it with: pip3 install -U infinisdk\u0027)"},{"line_number":184,"context_line":"                       % {\u0027version\u0027: version})"},{"line_number":185,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"},{"line_number":186,"context_line":"        auth \u003d (self.configuration.san_login,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c0517e08_e2433924","line":183,"range":{"start_line":183,"start_character":35,"end_line":183,"end_character":69},"in_reply_to":"dbd3b55a_e057f753","updated":"2026-03-13 14:57:51.000000000","message":"Hello Silvan,\n\nThank you very much for the review!\n\n\u003e I think it\u0027d better to hint to the required min version in this message than propose an update command.\n\nFixed in patch set #2\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":36538,"name":"Harsh Ailani","display_name":"Harsh Ailani","email":"harsh.ailani@ibm.com","username":"harshailani"},"change_message_id":"2328ae747ffc84c0a9a875bde14d906cc8869898","unresolved":true,"context_lines":[{"line_number":733,"context_line":"            with self._attach_context(connection) as attach_info:"},{"line_number":734,"context_line":"                yield attach_info"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"    def _create_promoted_clone(self, volume, infinidat_parent):"},{"line_number":737,"context_line":"        name \u003d self._make_volume_name(volume)"},{"line_number":738,"context_line":"        LOG.debug(\u0027Creating cloned volume %s from %s\u0027,"},{"line_number":739,"context_line":"                  name, infinidat_parent.get_name())"}],"source_content_type":"text/x-python","patch_set":1,"id":"ca548a3d_d779c13b","line":736,"updated":"2026-01-16 14:15:19.000000000","message":"A docstring would be good here.","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[{"line_number":733,"context_line":"            with self._attach_context(connection) as attach_info:"},{"line_number":734,"context_line":"                yield attach_info"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"    def _create_promoted_clone(self, volume, infinidat_parent):"},{"line_number":737,"context_line":"        name \u003d self._make_volume_name(volume)"},{"line_number":738,"context_line":"        LOG.debug(\u0027Creating cloned volume %s from %s\u0027,"},{"line_number":739,"context_line":"                  name, infinidat_parent.get_name())"}],"source_content_type":"text/x-python","patch_set":1,"id":"2382f976_081cde30","line":736,"in_reply_to":"ca548a3d_d779c13b","updated":"2026-03-13 14:57:51.000000000","message":"Hello Harsh,\n\nThank you very much for the review!\n\n\u003e A docstring would be good here.\n\nFixed in patch set #2\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"2e2add9f31876e8f98958fdd4d3e2776afb15e02","unresolved":true,"context_lines":[{"line_number":743,"context_line":"        infinidat_volume.promote_snapshot()"},{"line_number":744,"context_line":"        volume_size \u003d infinidat_volume.get_size()"},{"line_number":745,"context_line":"        if volume_size \u003c volume.size * capacity.GiB:"},{"line_number":746,"context_line":"            self.extend_volume(volume, volume.size)"},{"line_number":747,"context_line":"        self._set_qos(volume, infinidat_volume)"},{"line_number":748,"context_line":"        self._set_cinder_object_metadata(infinidat_volume, volume)"},{"line_number":749,"context_line":"        if volume.group_id:"}],"source_content_type":"text/x-python","patch_set":1,"id":"dc0cfc60_e3799c38","line":746,"updated":"2026-02-20 15:16:10.000000000","message":"you are passing volume and volume.size to .Both new_size and volume.size reference the same Cinder volume object\u0027s size field (the requested clone size), so delta \u003d 0. The resize is a no-op.\n\ndef extend_volume(self, volume, new_size):\n    infinidat_volume \u003d self._get_infinidat_volume(volume)\n    delta \u003d (new_size - volume.size) * capacity.GiB   # (TARGET - TARGET) \u003d 0\n    infinidat_volume.resize(delta)","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[{"line_number":743,"context_line":"        infinidat_volume.promote_snapshot()"},{"line_number":744,"context_line":"        volume_size \u003d infinidat_volume.get_size()"},{"line_number":745,"context_line":"        if volume_size \u003c volume.size * capacity.GiB:"},{"line_number":746,"context_line":"            self.extend_volume(volume, volume.size)"},{"line_number":747,"context_line":"        self._set_qos(volume, infinidat_volume)"},{"line_number":748,"context_line":"        self._set_cinder_object_metadata(infinidat_volume, volume)"},{"line_number":749,"context_line":"        if volume.group_id:"}],"source_content_type":"text/x-python","patch_set":1,"id":"eefb0579_1a4d3527","line":746,"in_reply_to":"dc0cfc60_e3799c38","updated":"2026-03-13 14:57:51.000000000","message":"Hello Jayaanand,\n\nThank you very much for the review!\n\n\u003e you are passing volume and volume.size to .Both new_size and volume.size reference the same Cinder volume object\u0027s size field (the requested clone size), so delta \u003d 0. The resize is a no-op.\n\u003e \n\u003e def extend_volume(self, volume, new_size):\n\u003e     infinidat_volume \u003d self._get_infinidat_volume(volume)\n\u003e     delta \u003d (new_size - volume.size) * capacity.GiB   # (TARGET - TARGET) \u003d 0\n\u003e     infinidat_volume.resize(delta)\n\n\nI double-checked this code path. \n\nIn our driver the `extend_volume()` implementation computes the resize delta using the actual backend volume size, not `volume.size` from the Cinder volume object:\n```\ndef extend_volume(self, volume, new_size):\n    infinidat_volume \u003d self._get_infinidat_volume(volume)\n    size_delta \u003d new_size * capacity.GiB - infinidat_volume.get_size()\n    infinidat_volume.resize(size_delta)\n```\n\nSo when `_create_promoted_clone()` calls:\n```\nself.extend_volume(volume, volume.size)\n```\n\nAnd `volume.size` represents the requested size of the new Cinder volume, while the current backend size is obtained via `infinidat_volume.get_size()`.\n\nIn the clone case the backend volume created via:\n```\ncreate_snapshot(..., write_protected\u003dFalse)\npromote_snapshot()\n```\n\nKeeps the source volume size. Therefore if a larger clone is requested, an extend operation is required.\n\nI also verified the behavior with additional debug logs. I just added some additional debug lines:\n```\n 680     @infinisdk_to_cinder_exceptions\n 681     def extend_volume(self, volume, new_size):\n 682         \"\"\"Extend the size of a volume.\"\"\"\n 683         infinidat_volume \u003d self._get_infinidat_volume(volume)\n 684         size_delta \u003d new_size * capacity.GiB - infinidat_volume.get_size()\n 685         LOG.debug(\u0027\u003d\u003e NOTES FOR 940236: extend_volume: delta \u003d %s\u0027, size_delta)\n 686         infinidat_volume.resize(size_delta)\n\n...\n\n 737     def _create_promoted_clone(self, volume, infinidat_parent):\n 738         name \u003d self._make_volume_name(volume)\n 739         LOG.debug(\u0027Creating cloned volume %s from %s\u0027,\n 740                   name, infinidat_parent.get_name())\n 741         infinidat_volume \u003d infinidat_parent.create_snapshot(\n 742             name\u003dname, write_protected\u003dFalse)\n 743         LOG.debug(\u0027Promote cloned volume %s\u0027, name)\n 744         infinidat_volume.promote_snapshot()\n 745         volume_size \u003d infinidat_volume.get_size()\n 746         LOG.debug(\u0027\u003d\u003e NOTES FOR 940236: create promote clone: Infinidat parent volume size: %s\u0027, infinidat_parent.get_size())\n 747         LOG.debug(\u0027\u003d\u003e NOTES FOR 940236: create promote clone: Infinidat cloned volume size: %s\u0027, infinidat_volume.get_size())\n 748         LOG.debug(\u0027\u003d\u003e NOTES FOR 940236: create promote clone: Cinder new volume size: %s\u0027, volume.size * capacity.GiB)\n 749         if volume_size \u003c volume.size * capacity.GiB:\n 750             LOG.debug(\u0027\u003d\u003e NOTES FOR 940236: create promote clone: we must extend Infinidat cloned volume from %s \u003d\u003e %s\u0027, volume_size, volume.size * capaci     ty.GiB)\n 751             self.extend_volume(volume, volume.size)\n 752         self._set_qos(volume, infinidat_volume)\n 753         self._set_cinder_object_metadata(infinidat_volume, volume)\n 754         if volume.group_id:\n 755             group \u003d volume_utils.group_get_by_id(volume.group_id)\n 756             if volume_utils.is_group_a_cg_snapshot_type(group):\n 757                 infinidat_group \u003d self._get_infinidat_cg(group)\n 758                 infinidat_group.add_member(infinidat_volume)\n```\n\nAnd then create a volume:\n```\n$ openstack volume create --size 1 volume\n\n$ openstack volume list\n+--------------------------------------+--------+-----------+------+-------------+\n| ID                                   | Name   | Status    | Size | Attached to |\n+--------------------------------------+--------+-----------+------+-------------+\n| d00a5df5-f438-47a6-99c9-1b5b3f78302a | volume | available |    1 |             |\n+--------------------------------------+--------+-----------+------+-------------+\n```\n\nAnd then create a clone from the volume:\n```\n$ openstack volume create --source  volume --size 2 clone\n\n$ openstack volume list\n+--------------------------------------+--------+-----------+------+-------------+\n| ID                                   | Name   | Status    | Size | Attached to |\n+--------------------------------------+--------+-----------+------+-------------+\n| 9cef9c0f-ac2b-40e0-a69e-d0609a0e3599 | clone  | available |    2 |             |\n| d00a5df5-f438-47a6-99c9-1b5b3f78302a | volume | available |    1 |             |\n+--------------------------------------+--------+-----------+------+-------------+\n```\n\nAnd then check the log file:\n```\nMar 11 11:59:31 node-1 cinder-volume[611370]: DEBUG cinder.volume.drivers.infinidat [None req-77fd91f3-c02d-4377-b27f-fa0d22556010 admin None]\n\u003d\u003e NOTES FOR 940236: create promote clone: Infinidat parent volume size: 1 GiB {{(pid\u003d611370) _create_promoted_clone /opt/stack/cinder/cinder/volume/drivers/infinidat.py:746}}\n\nMar 11 11:59:31 node-1 cinder-volume[611370]: DEBUG cinder.volume.drivers.infinidat [None req-77fd91f3-c02d-4377-b27f-fa0d22556010 admin None]\n\u003d\u003e NOTES FOR 940236: create promote clone: Infinidat cloned volume size: 1 GiB\n{{(pid\u003d611370) _create_promoted_clone /opt/stack/cinder/cinder/volume/drivers/infinidat.py:747}}\n\nMar 11 11:59:31 node-1 cinder-volume[611370]: DEBUG cinder.volume.drivers.infinidat [None req-77fd91f3-c02d-4377-b27f-fa0d22556010 admin None]\n\u003d\u003e NOTES FOR 940236: create promote clone: Cinder new volume size: 2 GiB\n{{(pid\u003d611370) _create_promoted_clone /opt/stack/cinder/cinder/volume/drivers/infinidat.py:748}}\n\nMar 11 11:59:31 node-1 cinder-volume[611370]: DEBUG cinder.volume.drivers.infinidat [None req-77fd91f3-c02d-4377-b27f-fa0d22556010 admin None]\n\u003d\u003e NOTES FOR 940236: create promote clone: we must extend Infinidat cloned volume from 1 GiB \u003d\u003e 2 GiB\n{{(pid\u003d611370) _create_promoted_clone /opt/stack/cinder/cinder/volume/drivers/infinidat.py:750}}\n\nMar 11 11:59:31 node-1 cinder-volume[611370]: DEBUG cinder.volume.drivers.infinidat [None req-77fd91f3-c02d-4377-b27f-fa0d22556010 admin None]\n\u003d\u003e NOTES FOR 940236: extend_volume: delta \u003d 1 GiB\n{{(pid\u003d611370) extend_volume /opt/stack/cinder/cinder/volume/drivers/infinidat.py:685}}\n```\n\nAs you can see the `resize` operation is not a no-op.\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"2e2add9f31876e8f98958fdd4d3e2776afb15e02","unresolved":true,"context_lines":[{"line_number":748,"context_line":"        self._set_cinder_object_metadata(infinidat_volume, volume)"},{"line_number":749,"context_line":"        if volume.group_id:"},{"line_number":750,"context_line":"            group \u003d volume_utils.group_get_by_id(volume.group_id)"},{"line_number":751,"context_line":"            if volume_utils.is_group_a_cg_snapshot_type(group):"},{"line_number":752,"context_line":"                infinidat_group \u003d self._get_infinidat_cg(group)"},{"line_number":753,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"0386c578_f954fd13","line":751,"updated":"2026-02-20 15:16:10.000000000","message":"older implementation has delete infinidat_volume.delete(). Missing in new implementation. Cleanup is not required?","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        self._set_cinder_object_metadata(infinidat_volume, volume)"},{"line_number":749,"context_line":"        if volume.group_id:"},{"line_number":750,"context_line":"            group \u003d volume_utils.group_get_by_id(volume.group_id)"},{"line_number":751,"context_line":"            if volume_utils.is_group_a_cg_snapshot_type(group):"},{"line_number":752,"context_line":"                infinidat_group \u003d self._get_infinidat_cg(group)"},{"line_number":753,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fdc41ce5_08ff30a5","line":751,"in_reply_to":"0386c578_f954fd13","updated":"2026-03-13 14:57:51.000000000","message":"Hello Jayaanand,\n\nThank you very much for the review!\n\n\u003e older implementation has delete infinidat_volume.delete(). Missing in new implementation. Cleanup is not required?\n\nFixed in patch set #2\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":37888,"name":"Akshay Ranade","display_name":"Akshay Ranade","email":"akshay.ranade@ibm.com","username":"rakshay"},"change_message_id":"5dfc29e8eaeec164d8aec7ec4f80227a0a2dca24","unresolved":true,"context_lines":[{"line_number":750,"context_line":"            group \u003d volume_utils.group_get_by_id(volume.group_id)"},{"line_number":751,"context_line":"            if volume_utils.is_group_a_cg_snapshot_type(group):"},{"line_number":752,"context_line":"                infinidat_group \u003d self._get_infinidat_cg(group)"},{"line_number":753,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"    def _create_copy_from_snapshot(self, volume, snapshot):"},{"line_number":756,"context_line":"        \"\"\"Create a generic clone from a snapshot."}],"source_content_type":"text/x-python","patch_set":1,"id":"ef57700a_508fcfba","line":753,"updated":"2026-01-16 14:53:31.000000000","message":"after promoting the snapshot, what if any of the following operations like extend_volume() or _set_qos() or add_member() fail? do they raise any exceptions? if yes, won\u0027t this create a zombie volume on backend? if no will this be rolled back?","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[{"line_number":750,"context_line":"            group \u003d volume_utils.group_get_by_id(volume.group_id)"},{"line_number":751,"context_line":"            if volume_utils.is_group_a_cg_snapshot_type(group):"},{"line_number":752,"context_line":"                infinidat_group \u003d self._get_infinidat_cg(group)"},{"line_number":753,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"    def _create_copy_from_snapshot(self, volume, snapshot):"},{"line_number":756,"context_line":"        \"\"\"Create a generic clone from a snapshot."}],"source_content_type":"text/x-python","patch_set":1,"id":"57453e0a_fd7cb1c3","line":753,"in_reply_to":"ef57700a_508fcfba","updated":"2026-03-13 14:57:51.000000000","message":"Hello Akshay,\n\nThank you very much for the review!\n\n\u003e after promoting the snapshot, what if any of the following operations like extend_volume() or _set_qos() or add_member() fail? do they raise any exceptions? if yes, won\u0027t this create a zombie volume on backend? if no will this be rolled back?\n\nFixed in patch set #2\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":36538,"name":"Harsh Ailani","display_name":"Harsh Ailani","email":"harsh.ailani@ibm.com","username":"harshailani"},"change_message_id":"2328ae747ffc84c0a9a875bde14d906cc8869898","unresolved":true,"context_lines":[{"line_number":756,"context_line":"        \"\"\"Create a generic clone from a snapshot."},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        Old versions of InfiniBox do not support detached clones,"},{"line_number":759,"context_line":"        so we use dd to copy data. This can be a slow operation:"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        - create destination volume"},{"line_number":762,"context_line":"        - map source snapshot and destination volume"}],"source_content_type":"text/x-python","patch_set":1,"id":"83b495ed_01db4fed","line":759,"updated":"2026-01-16 14:15:19.000000000","message":"end of line is a \":\"","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"75f53edae47b82e3738354e6df9768813ac044a7","unresolved":false,"context_lines":[{"line_number":756,"context_line":"        \"\"\"Create a generic clone from a snapshot."},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        Old versions of InfiniBox do not support detached clones,"},{"line_number":759,"context_line":"        so we use dd to copy data. This can be a slow operation:"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        - create destination volume"},{"line_number":762,"context_line":"        - map source snapshot and destination volume"}],"source_content_type":"text/x-python","patch_set":1,"id":"3116ee0c_6ea0e24a","line":759,"in_reply_to":"83b495ed_01db4fed","updated":"2026-03-13 14:57:51.000000000","message":"Hello Harsh,\n\nThank you very much for the review!\n\n\u003e end of line is a \":\"\n\nFixed in patch set #2\n\nThank you and have a nice day!","commit_id":"0e832ae5017955fac96341ab844f2b64dd2ba22e"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f4870fd6e75146589c61fc3b9ab337dffcae1309","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        \"\"\"Driver initialization\"\"\""},{"line_number":176,"context_line":"        if infinisdk is None:"},{"line_number":177,"context_line":"            message \u003d (_(\u0027The infinisdk Python library is required but not \u0027"},{"line_number":178,"context_line":"                         \u0027installed, please install it with: pip3 install \u0027"},{"line_number":179,"context_line":"                         \u0027\"infinisdk\u003e\u003d%(min_sdk_version)s\"\u0027)"},{"line_number":180,"context_line":"                       % {\u0027min_sdk_version\u0027: MIN_SDK_VERSION})"},{"line_number":181,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d38793ba_e7ca5034","line":178,"range":{"start_line":178,"start_character":0,"end_line":178,"end_character":75},"updated":"2026-09-24 14:33:48.000000000","message":"Silvan\u0027s PS1 point was to state the minimum version rather than give a pip command; PS2 added the version but kept the command (here and at 186). Distro-packaged deployments cannot run ``pip3 install``, so please just say \"infinisdk \u003e\u003d 250.0.0 is required\".","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        \"\"\"Driver initialization\"\"\""},{"line_number":176,"context_line":"        if infinisdk is None:"},{"line_number":177,"context_line":"            message \u003d (_(\u0027The infinisdk Python library is required but not \u0027"},{"line_number":178,"context_line":"                         \u0027installed, please install it with: pip3 install \u0027"},{"line_number":179,"context_line":"                         \u0027\"infinisdk\u003e\u003d%(min_sdk_version)s\"\u0027)"},{"line_number":180,"context_line":"                       % {\u0027min_sdk_version\u0027: MIN_SDK_VERSION})"},{"line_number":181,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"}],"source_content_type":"text/x-python","patch_set":3,"id":"40df6082_4468ba34","line":178,"range":{"start_line":178,"start_character":0,"end_line":178,"end_character":75},"in_reply_to":"beb629d5_3e842be3","updated":"2026-10-01 06:52:11.000000000","message":"Hello Erlon,\n\nThank you very much for the review!\n\nI’ve removed the pip commands from both messages.\nThey now state that `infinisdk \u003e\u003d 250.0.0` is required, without prescribing an installation method.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"da8b865e25068f0ce0665cfd9be770cc3c82d26d","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        \"\"\"Driver initialization\"\"\""},{"line_number":176,"context_line":"        if infinisdk is None:"},{"line_number":177,"context_line":"            message \u003d (_(\u0027The infinisdk Python library is required but not \u0027"},{"line_number":178,"context_line":"                         \u0027installed, please install it with: pip3 install \u0027"},{"line_number":179,"context_line":"                         \u0027\"infinisdk\u003e\u003d%(min_sdk_version)s\"\u0027)"},{"line_number":180,"context_line":"                       % {\u0027min_sdk_version\u0027: MIN_SDK_VERSION})"},{"line_number":181,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"}],"source_content_type":"text/x-python","patch_set":3,"id":"beb629d5_3e842be3","line":178,"range":{"start_line":178,"start_character":0,"end_line":178,"end_character":75},"in_reply_to":"d38793ba_e7ca5034","updated":"2026-09-28 12:43:11.000000000","message":"-1: Simon has a point here.","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"da8b865e25068f0ce0665cfd9be770cc3c82d26d","unresolved":true,"context_lines":[{"line_number":755,"context_line":"        Workflow:"},{"line_number":756,"context_line":"            1. Create a writable snapshot of the source volume."},{"line_number":757,"context_line":"            2. Promote the snapshot to a regular volume."},{"line_number":758,"context_line":"            3. If the promoted volume size is smaller than the requested"},{"line_number":759,"context_line":"               Cinder volume size, extend the backend volume."},{"line_number":760,"context_line":"            4. Apply QoS and Cinder metadata."},{"line_number":761,"context_line":"            5. If the volume belongs to a consistency group snapshot type,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dd69caeb_98d242e4","line":758,"range":{"start_line":758,"start_character":46,"end_line":758,"end_character":53},"updated":"2026-09-28 12:43:11.000000000","message":"bigger?","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[{"line_number":755,"context_line":"        Workflow:"},{"line_number":756,"context_line":"            1. Create a writable snapshot of the source volume."},{"line_number":757,"context_line":"            2. Promote the snapshot to a regular volume."},{"line_number":758,"context_line":"            3. If the promoted volume size is smaller than the requested"},{"line_number":759,"context_line":"               Cinder volume size, extend the backend volume."},{"line_number":760,"context_line":"            4. Apply QoS and Cinder metadata."},{"line_number":761,"context_line":"            5. If the volume belongs to a consistency group snapshot type,"}],"source_content_type":"text/x-python","patch_set":3,"id":"e968de59_c48dd8fd","line":758,"range":{"start_line":758,"start_character":46,"end_line":758,"end_character":53},"in_reply_to":"dd69caeb_98d242e4","updated":"2026-10-01 06:52:11.000000000","message":"Hello Erlon,\n\nThank you very much for the review!\n\n\u003e bigger?\n\nI’ve reworded this for clarity: “If the requested Cinder volume size is larger than the promoted volume size, extend the backend volume.” The original comparison was correct; the wording now makes it clearer which size is larger.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f4870fd6e75146589c61fc3b9ab337dffcae1309","unresolved":true,"context_lines":[{"line_number":768,"context_line":"        name \u003d self._make_volume_name(volume)"},{"line_number":769,"context_line":"        LOG.debug(\u0027Creating cloned volume %s from %s\u0027,"},{"line_number":770,"context_line":"                  name, infinidat_parent.get_name())"},{"line_number":771,"context_line":"        infinidat_volume \u003d infinidat_parent.create_snapshot("},{"line_number":772,"context_line":"            name\u003dname, write_protected\u003dFalse)"},{"line_number":773,"context_line":"        LOG.debug(\u0027Promote cloned volume %s\u0027, name)"},{"line_number":774,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"6ee16bdc_19ecc75e","line":771,"range":{"start_line":771,"start_character":0,"end_line":771,"end_character":60},"updated":"2026-09-24 14:33:48.000000000","message":"Question on behaviour parity with the dd path. ``_create_volume`` applies ``san_thin_provision`` (provtype) and ``infinidat_use_compression`` to the destination. A promoted snapshot inherits the _parent\u0027s_ provtype and compression instead, so the same volume type produces a different result depending on whether the array supports promotion. Should the promoted volume have provtype/compression set explicitly after ``promote_snapshot()``, or is the inherited behaviour intended? If intended, please document it.","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[{"line_number":768,"context_line":"        name \u003d self._make_volume_name(volume)"},{"line_number":769,"context_line":"        LOG.debug(\u0027Creating cloned volume %s from %s\u0027,"},{"line_number":770,"context_line":"                  name, infinidat_parent.get_name())"},{"line_number":771,"context_line":"        infinidat_volume \u003d infinidat_parent.create_snapshot("},{"line_number":772,"context_line":"            name\u003dname, write_protected\u003dFalse)"},{"line_number":773,"context_line":"        LOG.debug(\u0027Promote cloned volume %s\u0027, name)"},{"line_number":774,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"11365922_f35d8436","line":771,"range":{"start_line":771,"start_character":0,"end_line":771,"end_character":60},"in_reply_to":"6ee16bdc_19ecc75e","updated":"2026-10-01 06:52:11.000000000","message":"Hello Simon,\n\nThank you very much for the review!\n\n\u003e Question on behaviour parity with the dd path. ``_create_volume`` applies ``san_thin_provision`` (provtype) and ``infinidat_use_compression`` to the destination. A promoted snapshot inherits the _parent\u0027s_ provtype and compression instead, so the same volume type produces a different result depending on whether the array supports promotion. Should the promoted volume have provtype/compression set explicitly after ``promote_snapshot()``, or is the inherited behaviour intended? If intended, please document it.\n\nThe inherited behaviour was not intended. After `promote_snapshot()`, the driver now explicitly applies provisioning according to `san_thin_provision` and compression according to `infinidat_use_compression`.\n\nWhen `infinidat_use_compression` is unset, the configured pool’s compression setting is applied rather than retaining the source volume’s setting. This matches the behaviour of `_create_volume()`.\n\nI’ve also added unit tests covering both cloning paths, thin/thick provisioning, and explicit or pool-derived compression settings.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f4870fd6e75146589c61fc3b9ab337dffcae1309","unresolved":true,"context_lines":[{"line_number":822,"context_line":"    @infinisdk_to_cinder_exceptions"},{"line_number":823,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":824,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""},{"line_number":825,"context_line":"        if self._system.compat.has_promote_snapshot():"},{"line_number":826,"context_line":"            infinidat_snapshot \u003d self._get_infinidat_snapshot(snapshot)"},{"line_number":827,"context_line":"            self._create_promoted_clone(volume, infinidat_snapshot)"},{"line_number":828,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7de44ae5_86cbd221","line":825,"range":{"start_line":825,"start_character":0,"end_line":825,"end_character":54},"updated":"2026-09-24 14:33:48.000000000","message":"Since the same call path now covers snapshot-of-snapshot (create_volume_from_snapshot promotes a child of a snapshot), a one-line comment that InfiniBox supports creating and promoting a snapshot of a snapshot would save the next reader a trip to the docs.","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[{"line_number":822,"context_line":"    @infinisdk_to_cinder_exceptions"},{"line_number":823,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":824,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""},{"line_number":825,"context_line":"        if self._system.compat.has_promote_snapshot():"},{"line_number":826,"context_line":"            infinidat_snapshot \u003d self._get_infinidat_snapshot(snapshot)"},{"line_number":827,"context_line":"            self._create_promoted_clone(volume, infinidat_snapshot)"},{"line_number":828,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"68893cfc_8d68f6bb","line":825,"range":{"start_line":825,"start_character":0,"end_line":825,"end_character":54},"in_reply_to":"7de44ae5_86cbd221","updated":"2026-10-01 06:52:11.000000000","message":"Hello Simon,\n\nThank you very much for the review!\n\n\u003e Since the same call path now covers snapshot-of-snapshot (create_volume_from_snapshot promotes a child of a snapshot), a one-line comment that InfiniBox supports creating and promoting a snapshot of a snapshot would save the next reader a trip to the docs.\n\nDone — I’ve added a comment explaining that InfiniBox supports creating and promoting a snapshot of a snapshot, preserving the original snapshot.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"}],"releasenotes/notes/bp-infinidat-add-snapshot-promote-758402709835fbbc.yaml":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f4870fd6e75146589c61fc3b9ab337dffcae1309","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Infinidat driver: Added support for snapshot promote feature."},{"line_number":5,"context_line":"    The snapshot promotion feature, now available for the Infinidat"},{"line_number":6,"context_line":"    storage software, provides a very efficient method for creating"},{"line_number":7,"context_line":"    independent volumes from existing snapshots or volumes with"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"6e8aa194_c81f4cf6","line":4,"updated":"2026-09-24 14:33:48.000000000","message":"Two upgrade-visible facts belong here: the driver now refuses to start with infinisdk older than 250.0.0, and arrays without promotion support fall back to the existing dd copy. Please also name the InfiniBox software version that enables promotion.","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"4a4a505810ae6ce288419272eb2e22051e68fb7e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Infinidat driver: Added support for snapshot promote feature."},{"line_number":5,"context_line":"    The snapshot promotion feature, now available for the Infinidat"},{"line_number":6,"context_line":"    storage software, provides a very efficient method for creating"},{"line_number":7,"context_line":"    independent volumes from existing snapshots or volumes with"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"ae8cb7c0_e27138ca","line":4,"in_reply_to":"6e8aa194_c81f4cf6","updated":"2026-10-01 06:52:11.000000000","message":"Hello Simon,\n\nThank you very much for the review!\n\n\u003e Two upgrade-visible facts belong here: the driver now refuses to start with infinisdk older than 250.0.0, and arrays without promotion support fall back to the existing dd copy. Please also name the InfiniBox software version that enables promotion.\n\nI’ve updated the release notes to state that InfiniSDK \u003e\u003d 250.0.0 is required and that the driver will not initialize with an older version. They also document the fallback to generic data copying when promotion is unavailable.\n\nSnapshot promotion was introduced in InfuzeOS 8.1. I’ve updated the release notes to include this version, the minimum InfiniSDK requirement, and the fallback to generic data copying.\n\nThank you!","commit_id":"f3b043c42591a4cb452c5c5b0b2474bc3b60ad97"}]}
