)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e258cda8_c51be69a","updated":"2026-09-24 14:40:04.000000000","message":"The intent is right and the force-detach rewrite is cleaner than before. -1 for the port-removal behaviour at 338-347, which can strip FC ports from a host during an iSCSI attach, and the LUN handling at 377. Details inline.\n\nAlso this desperately needs a rebase.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"}],"cinder/tests/unit/volume/drivers/test_infinidat.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":true,"context_lines":[{"line_number":156,"context_line":"        self._mock_volume.get_all_metadata.return_value \u003d {}"},{"line_number":157,"context_line":"        self._mock_volume.create_snapshot.return_value \u003d self._mock_volume"},{"line_number":158,"context_line":"        self._mock_snapshot \u003d mock.Mock()"},{"line_number":159,"context_line":"        self._mock_snapshot.get_parent.return_value \u003d self._mock_volume"},{"line_number":160,"context_line":"        self._mock_host \u003d mock.Mock()"},{"line_number":161,"context_line":"        self._mock_host.get_luns.return_value \u003d []"},{"line_number":162,"context_line":"        self._mock_host.get_ports.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"9375c4d4_f311beee","line":159,"range":{"start_line":159,"start_character":0,"end_line":159,"end_character":71},"updated":"2026-09-24 14:40:04.000000000","message":"The test changes only swap ``safe_get`` for ``get_host_by_initiator_address`` in existing cases. Please add tests for: one existing host with missing ports, one host with extra ports (both protocol classes), two legacy hosts mapped to the same volume, a LUN mismatch, and CHAP applied to multiple hosts.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"}],"cinder/volume/drivers/infinidat.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":true,"context_lines":[{"line_number":216,"context_line":"    def _make_snapshot_name(self, cinder_snapshot):"},{"line_number":217,"context_line":"        return \u0027openstack-snap-%s\u0027 % cinder_snapshot.id"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _make_host_name(self):"},{"line_number":220,"context_line":"        return \u0027openstack-host-%s\u0027 % uuid.uuid4()"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _make_cg_name(self, cinder_group):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f53e0487_4d138b22","line":219,"range":{"start_line":219,"start_character":0,"end_line":219,"end_character":30},"updated":"2026-09-24 14:40:04.000000000","message":"The commit message says \"one host object per Cinder host\", but the name is now a random UUID, so the array side cannot be correlated with a compute node. Suggest ``openstack-host-\u003csanitised connector[\u0027host\u0027]\u003e``, or at least record ``connector[\u0027host\u0027]`` in ``_set_host_metadata``.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                              \u0027host %s with ports %s\u0027,"},{"line_number":345,"context_line":"                              port, host.get_name(),"},{"line_number":346,"context_line":"                              host.get_ports())"},{"line_number":347,"context_line":"                    host.remove_port(port)"},{"line_number":348,"context_line":"            for port in missed_ports:"},{"line_number":349,"context_line":"                LOG.debug(\u0027Add missed port %s to existing host %s \u0027"},{"line_number":350,"context_line":"                          \u0027with ports %s\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"98388817_54fcf2d4","line":347,"range":{"start_line":347,"start_character":0,"end_line":347,"end_character":42},"updated":"2026-09-24 14:40:04.000000000","message":"This removes every port on the matched host that is not in _this_ connector. Two cases where that is destructive:\n\n  * Mixed protocol. An iSCSI connector carries a single IQN. If the same compute node also uses an FC backend on this array, the host object holds WWPNs too; the iSCSI attach deletes them and breaks the FC mappings.\n  * Initiators an administrator added by hand.\n  \nPlease restrict removal to ports of the same class as the connector (WWN vs IQN), or better, never remove ports here and only add the missing ones. There is no unit test for this branch.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":true,"context_lines":[{"line_number":374,"context_line":"                                   host.get_name()))"},{"line_number":375,"context_line":"                        raise exception.VolumeBackendAPIException(data\u003ddata)"},{"line_number":376,"context_line":"            if host_lun is None:"},{"line_number":377,"context_line":"                mapping \u003d host.map_volume(infinidat_volume)"},{"line_number":378,"context_line":"                host_lun \u003d mapping.get_lun()"},{"line_number":379,"context_line":"                LOG.debug(\u0027Create mapping with LUN %s for volume %s to \u0027"},{"line_number":380,"context_line":"                          \u0027host %s with ports %s\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"e35d1b08_0817ef00","line":377,"range":{"start_line":377,"start_character":0,"end_line":377,"end_character":59},"updated":"2026-09-24 14:40:04.000000000","message":"With two legacy per-WWPN hosts, the second ``map_volume`` gets its own LUN. If it differs you raise at 387, but the mapping created here stays behind. infinisdk\u0027s ``map_volume`` accepts ``lun\u003d``; pass ``common_lun`` for the second and later hosts so the array is asked for the same LUN, and only raise if that is refused.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":true,"context_lines":[{"line_number":587,"context_line":"        else:"},{"line_number":588,"context_line":"            volume_type \u003d \u0027iscsi\u0027"},{"line_number":589,"context_line":"        result_data \u003d dict()"},{"line_number":590,"context_line":"        hosts \u003d set()"},{"line_number":591,"context_line":"        if connector is None:"},{"line_number":592,"context_line":"            # Force-detach: remove this volume from all hosts it is mapped to"},{"line_number":593,"context_line":"            for mapping in infinidat_volume.get_logical_units():"}],"source_content_type":"text/x-python","patch_set":1,"id":"1399d366_242978eb","line":590,"range":{"start_line":590,"start_character":0,"end_line":590,"end_character":21},"updated":"2026-09-24 14:40:04.000000000","message":"``set()`` of infinisdk host objects relies on them being hashable and comparing by identity. If two lookups return distinct objects for the same host you will unmap twice. A dict keyed by ``host.get_id()`` avoids the question.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"}],"releasenotes/notes/bug-2158914-infinidat-create-single-host-object-5d75445501558fdd.yaml":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"f9f17094af8e36afb28ae5a5f80b9f9528eb91a6","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Infinidat driver: Existing InfiniBox host objects created by previous"},{"line_number":5,"context_line":"    driver versions are not migrated automatically. The driver will continue"},{"line_number":6,"context_line":"    to use an existing host object while it has at least one active volume"},{"line_number":7,"context_line":"    mapping. After the last volume is detached and the host object no longer"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"8073b34e_9d1397dd","line":4,"updated":"2026-09-24 14:40:04.000000000","message":"Please add that, until the legacy host objects age out, an attach from a node with a mix of legacy and new host objects maps the volume to every matching host object, all with the same LUN.","commit_id":"0249230d224d88cdd0af4607a576b70e42ab1444"}]}
