)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"b2479fb917b9be6a80f5a4ed4938f8d7fe1421f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ccfd2e2f_d58475c8","updated":"2026-10-20 18:11:49.000000000","message":"@adeiter@infinidat.com","commit_id":"e0823c0de3134bb437df6c3db06ff2b92ffec685"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"30a2936bb5a62097d7d6f7196cb766dc10af1b4c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d981e2fe_ce085d9e","updated":"2026-10-21 14:08:05.000000000","message":"Hello Erlon,\n\nThank you for working on compatibility with older InfiniSDK versions!\nI understand the need to support existing deployments and make snapshot promotion conditional on the SDK and storage capabilities.\n\nI would like to clarify one point in the commit message:\n\n\u003e This prevents existing deployments with older SDKs, including\n\u003e 220.0.0 bundled with host-power-tools, from starting even though the\n\u003e previous data-copy implementation remains available\n\nHost PowerTools is distributed as a self-contained (RPM, DEB, MSI or BFF) package containing its own isolated Relocatable Python runtime and its complete dependency set, including InfiniSDK. These dependencies are private to Host PowerTools and are not exposed to the Python environment running OpenStack services.\n\nTherefore, the InfiniSDK `220.0.0` bundled with Host PowerTools does not affect the SDK imported by Cinder. It would be helpful to distinguish these environments in the commit message and identify the InfiniSDK version actually used by the affected `cinder-volume` service.\n\nSeparately, I have some concerns about restoring `infinisdk\u003e\u003d103.0.1` as the minimum requirement. I checked the sources for that version and found several incompatibilities with the current driver and Python runtime:\n\n1. **Compatibility with the Python versions required by Cinder**\n\n   The current Cinder `master` branch requires **Python 3.11 or later**, as explicitly declared by `requires-python \u003d \"\u003e\u003d3.11\"` in [pyproject.toml](https://github.com/openstack/cinder/blob/master/pyproject.toml#L14).\n\n   InfiniSDK `103.0.1` uses `from collections import Iterable` in `core/field_filter.py` and `core/utils/query_utils.py`, and `collections.Mapping` in `core/events.py`.\n\n   These aliases were removed in [Python 3.10](https://docs.python.org/3.10/whatsnew/3.10.html#removed). Consequently, the unmodified SDK contains import-time failures on all Python versions currently supported by Cinder `master`, including its minimum supported version, Python 3.11.\n\n   A distribution may have patched these issues separately, but the dependency declaration also permits the original PyPI package.\n\n2. **The version helper used during driver initialization is missing**\n\n   `infinisdk.core.utils.environment.get_infinisdk_version()` is not present in `103.0.1`. The patch calls it unconditionally in `do_setup()`, so initialization would fail with `AttributeError` even if the Python compatibility issues were addressed.\n\n   Using `importlib.metadata.version(\u0027infinisdk\u0027)` could address this particular issue.\n\n3. **Other SDK interfaces required by the driver are missing**\n\n   The volume model in `103.0.1` provides `get_pool()`, but does not provide `get_pool_name()`. The current driver calls `get_pool_name()` when managing existing volumes and snapshots, listing manageable resources, and handling volume migration.\n\n   Those operations would also require compatibility changes if we intend to support `103.0.1`.\n\nSome of these incompatibilities predate this patch. Nevertheless, restoring this lower bound would declare support for a version that does not satisfy the current driver\u0027s requirements.\n\nThe added tests verify promotion capability and fallback selection using mocks. Since they also mock the version helper, they do not exercise the actual interface or import behavior of the older SDK.\n\nCould we establish the minimum supported version through validation with the real SDK package in Cinder\u0027s Python environment, and update the commit message to describe the affected deployment accurately? I would support retaining `250.0.0` as the requirement specifically for snapshot promotion, together with a separately validated minimum version for the driver\u0027s existing functionality.\n\nCould you please clarify why you need to maintain older versions of the SDK, and which specific versions are you using in production?\n\nA straightforward alternative would be to update InfiniSDK alongside Cinder as part of the normal upgrade process, ensuring that the Python environment running `cinder-volume` meets the driver’s declared dependency requirements. For distribution-packaged deployments, this could be handled through the corresponding SDK package and dependency updates, giving operators a consistent and tested combination of Cinder and InfiniSDK.\n\nNewer InfiniSDK releases include both new functionality and fixes for issues identified in earlier versions. Infinidat strongly recommends using up-to-date SDK releases to benefit from these fixes, compatibility improvements, and ongoing maintenance. This is an important consideration when selecting the minimum supported SDK version, even for deployments that do not require the latest features.\n\nThank you!","commit_id":"b5a3600685f6968f083a330c05aecd340cce1c37"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"1f45fc62532041c2e9054d91e47b7f1fa3119b43","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"41986519_ec5597a2","in_reply_to":"62dade6c_e423b327","updated":"2026-11-06 13:50:42.000000000","message":"Hi Ishraq,\n\nSo, all users from those older cinder releases will continue to use the old version of the cinder driver (since the snapshot promotion patchis not back portable), and therefore might continue to use unsupported versions of the library. So, nothing will change for then there.\n\nI suggest that we add a \"warning\" in this patch if the user is using \u0027version \u003c\u003d 258.0.0\u0027, stating that they are in an UNSUPPORTED version and recommending them to upgrade their library, but not interrupt the driver startup, letting then to use the old behaviour. What do you think?\n\nRegarding our users using Infinidat, because our products are open source, not all users that uses Ubuntu are under our pro-support umbrella (we might not be aware of all of them), but we are still need to make sure upgrades works for them.\n\nErlon","commit_id":"b5a3600685f6968f083a330c05aecd340cce1c37"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"0fbaf59189e1c2bcd40aea302f81c8255ed7c64f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"f37e4842_7b89a389","in_reply_to":"d981e2fe_ce085d9e","updated":"2026-10-21 19:56:04.000000000","message":"Hi Alexander,\n\nThanks for the detailed review. Regarding your questions, some of our customers use very old versions of both storage and SDK. Some have a combination of InfiniSDK 258 and InfiniSDK 183, and their InfuzeOS versions are 7.1.15 and 6.0.14. They have very strict policies on whether to upgrade.\n\nAdditionally, according to Ubuntu policy, no user action should be required after an Ubuntu package update. Therefore, if we update, we should not require the user to perform any actions to keep the deployment functional. We need to ensure that this new change will not cause any disturbance in the current deployment.\n\nRegarding the minimum supported version, I have tested the SDK against the possible versions of Ubuntu and found that 141.1.1 is compatible with all driver versions we are backporting (hibiscus-caracal)[1], so we can safely set that as our minimum version, considering that if someone is using the driver it must be using something greater than that. Ill set the snapshot supported version to 258.0.0, as it is the first version \u003e\u003d 250 released on pip.\n\nWhat do you think?\n\n_________________\n[1] https://gist.github.com/sombrafam/68aa228c2409225dd423d7b93d7c0661","commit_id":"b5a3600685f6968f083a330c05aecd340cce1c37"},{"author":{"_account_id":38048,"name":"Ishraq Ahmed","email":"iahmed@infinidat.com"},"change_message_id":"b894262ffe3d7d6db8d414a110bfb13b2dab49b3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"62dade6c_e423b327","in_reply_to":"f37e4842_7b89a389","updated":"2026-11-05 17:05:00.000000000","message":"Hello Erlon,  \n\nThe Infinidat Cinder driver has always \u0027kept up\u0027 with InfiniSDK, and it\u0027s impractical for us to support and maintain a wide range of combinations of driver and SDK. Note that SDK 141.x is more than 7 years old, and there have been 16 releases after it. \n\nPlease ask the customer(s) to reach out to us via support.infinidat.com, and let\u0027s collaborate in building a package that will help them overcome the version dependencies. \n\nBest,\nIshraq","commit_id":"b5a3600685f6968f083a330c05aecd340cce1c37"}],"cinder/volume/drivers/infinidat.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"ffec59c93f8ad206a6f73bb013311651dc0d8a7e","unresolved":true,"context_lines":[{"line_number":191,"context_line":"            self.management_address, auth, use_ssl\u003duse_ssl)"},{"line_number":192,"context_line":"        self._driver_supports_snapshot_promotion \u003d ("},{"line_number":193,"context_line":"            sdk_supports_snapshot_promotion and"},{"line_number":194,"context_line":"            self._system.compat.has_promote_snapshot())"},{"line_number":195,"context_line":"        if not sdk_supports_snapshot_promotion:"},{"line_number":196,"context_line":"            LOG.warning("},{"line_number":197,"context_line":"                \u0027InfiniSDK %(version)s does not support snapshot promotion; \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a3517c1_89921e01","line":194,"updated":"2026-10-25 14:23:27.000000000","message":"The and on lines 192–194 does not evaluate has_promote_snapshot() when the parsed version is below SNAPSHOT_PROMOTION_MIN_SDK_VERSION. That matches PyPI: 240.2.1 has no has_promote_snapshot, and the next published release, 258.0.0, defines it (compatibility.py lines 318–322). There is no PyPI release from 250.0.0 through 257, so this gate does not call a missing method on a published wheel.\n\nWhen the method does run, _init_features() GETs _features. HTTP 404 is treated as \"feature absent\", and has_promote_snapshot() then compares the system version with 8.1. Any other non-success status calls assert_success(), which raises APICommandFailed. That class subclasses APICommandException, which subclasses InfiniSDKException (InfiniSDK 258.0.0, exceptions.py lines 6, 30, and 85). do_setup() is not wrapped by infinisdk_to_cinder_exceptions, so the exception reaches _init_host() and the whole backend stays down. Catch InfiniSDKException here, log the storage warning, and leave the flag false.","commit_id":"b5a3600685f6968f083a330c05aecd340cce1c37"}],"pyproject.toml":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"ffec59c93f8ad206a6f73bb013311651dc0d8a7e","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    \"pywbem\u003e\u003d0.7.0\", #LGPLv2.1+"},{"line_number":85,"context_line":"    \"python-3parclient\u003e\u003d4.2.10\", # Apache-2.0"},{"line_number":86,"context_line":"    \"krest\u003e\u003d1.3.0\", # Apache-2.0"},{"line_number":87,"context_line":"    \"infinisdk\u003e\u003d103.0.1\", # BSD-3"},{"line_number":88,"context_line":"    \"py-pure-client\u003e\u003d1.89.0\", # BSD"},{"line_number":89,"context_line":"    \"rsd-lib\u003e\u003d1.1.0\", # Apache-2.0"},{"line_number":90,"context_line":"    \"storpool\u003e\u003d7.1.0\", # Apache-2.0"}],"source_content_type":"text/x-toml","patch_set":2,"id":"b3b9801b_c0b1769c","line":87,"updated":"2026-10-25 14:23:27.000000000","message":"infinisdk\u003e\u003d103.0.1 cannot be the minimum on master. requires-python is \u003e\u003d3.11 (pyproject.toml line 14). Importing InfiniSDK 103.0.1 loads infinisdk/core/field.py, which imports infinisdk/core/field_filter.py. That file starts with from collections import Iterable. On Python 3.14 that statement raises ImportError: cannot import name \u0027Iterable\u0027. The driver only catches ImportError around import infinisdk (infinidat.py lines 45–55) and then do_setup() reports the library as missing.\n\n103.0.1 also has no get_infinisdk_version() and no pool_name field. make_getter() creates get_\u003cfield\u003e() only for declared fields, and this driver calls get_pool_name() at lines 1123, 1193, 1279, 1356, 1439, and 1480.\n\n116.1.3 still has from collections import Iterable. 127.2.1 is the oldest release on PyPI that I inspected which uses collections.abc, defines get_infinisdk_version(), and declares pool_name. I have not run the driver against 127.2.1. 141.1.1 is not on PyPI; 141.1.0 is. The unit test mocks get_infinisdk_version, so the 103.0.1 row never imports that package. Pin a release that imports on Python 3.11 or later","commit_id":"b5a3600685f6968f083a330c05aecd340cce1c37"}]}
