)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"6c1d9bff961613cad4ded02ab175529300867712","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d66e0427_8f2a17cf","updated":"2026-07-17 05:25:20.000000000","message":"Very strange.  Getting pep8 failures that didn\u0027t occur locally.  Some of the errors were hand-merge issues, but several should have been caught locally (using master locally).","commit_id":"426ba568f88e0c55210c0a6a995ed2936994660a"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"09481e64c023dd3eaa1c040b6ae33816d60024eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"03af7a9f_6419ab2e","updated":"2026-08-21 15:16:36.000000000","message":"Anthony - im not seeing Hitachi CI reporting, is this support being tested? Curious about the results.","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"761641a539a4d5c3c08b3ab2ecd9ebbd38552d2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"50a3afcd_09d63d49","updated":"2026-07-31 19:02:49.000000000","message":"recheck tempest-slow-py3 \"resource busy\"","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"21a7c9b15732bd22099250d1336e825618ee379a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"5915f8e4_9ae7709a","updated":"2026-07-31 20:22:27.000000000","message":"recheck tempest-slow-py3 timeouts / busy device","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"46e05fee34dc0b298f9c7e8e5a19d0be97b502b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"b86731e0_7b83bcd0","in_reply_to":"03af7a9f_6419ab2e","updated":"2026-08-24 20:01:27.000000000","message":"Weird - looking into it.  It last reported in PS9.","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"d4ff51bb9b87aee4c1e44d4a74fc59d6dcefb6aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"801d4e4a_12b0867d","in_reply_to":"210823b7_b2063df4","updated":"2026-09-11 09:59:13.000000000","message":"@jobernar@redhat.com Our CI results are now visible, and CI is passing.","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"c22b540f71ac33ccf8f0133d1ed886de125353b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"2857183b_2c27d408","in_reply_to":"801d4e4a_12b0867d","updated":"2026-09-11 10:00:16.000000000","message":"Make sure to use the latest results as it\u0027s a new repo.","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"cf175080ffdd1b61df1c3f07a785e1592679c0f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"210823b7_b2063df4","in_reply_to":"b86731e0_7b83bcd0","updated":"2026-08-28 22:11:41.000000000","message":"We\u0027re fixing this now - in the meantime I\u0027m rebasing against the current driver state.","commit_id":"0d889b6001d01650b72c45b0ef231eec646e31f0"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e84212d03efe6998e05474af6c0da3b5e8cea4ee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e3002340_c10f17ac","updated":"2026-08-27 00:11:33.000000000","message":"Recheck tempest-slow-py3 device or resource busy","commit_id":"3d5a760611398060781ecb6224b4bbe86d31001f"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ddf6b539d1ff597e4566a3bc83619b752b72a1e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"68d7e454_dc1200c6","updated":"2026-09-17 23:28:58.000000000","message":"Thanks for your great, thorough review @jayaanand.borra@netapp.com.\n\nI have made updates according to your comments.","commit_id":"d71adbf0fa8132f8c5435fa846d1901568656a55"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"d14d0c20_835754da","updated":"2026-09-24 05:44:49.000000000","message":"The overall shape (subsystem per connector, namespace per LDEV, cached NQN searcher mirroring the iSCSI one) looks right and the test coverage is good.\n\nI have two correctness issues that I think need fixing before this merges (the LDEV_ALREADY_AS_NAMESPACE branch and NVM subsystem ID 0 in force-detach), plus a request to use the core protocol constants and a few smaller items inline. -1 for the two correctness issues only.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"5c3c31ab_6dadf87e","in_reply_to":"d14d0c20_835754da","updated":"2026-09-26 09:37:28.000000000","message":"Good review, thanks Simon.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"eaa0002e_580b9b81","updated":"2026-09-26 09:37:28.000000000","message":"Updated for Simon\u0027s comments.  He found some good stuff.","commit_id":"b74b6e6d4859b42622fe0e5e593a295992bc668a"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a3c1dd84b8d7ca3787182be3f3bda2da31ff398e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"82d9e681_ea543bda","updated":"2026-09-26 13:35:31.000000000","message":"couple of nits, but otherwise thanks for addressing the comments.","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"b115637ba7eaed65f73771f8662784b960c3e915","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"3e1ed019_d0fb050a","updated":"2026-09-29 08:00:09.000000000","message":"Thanks Simon.  Your reviews of this patch have been most useful.","commit_id":"d6f55c938b6f58c53c5b62d19a2a5b7dd31bb42a"}],"cinder/tests/unit/volume/drivers/hitachi/test_hitachi_hbsd_rest_nvmeof.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":24,"context_line":"# Helpers"},{"line_number":25,"context_line":"######################"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def _make_driver(cls\u003drest_nvmeof.HBSDRESTNVMEOF):"},{"line_number":28,"context_line":"    \"\"\"Return a driver instance with all heavyweight attributes mocked.\"\"\""},{"line_number":29,"context_line":"    conf \u003d mock.MagicMock()"},{"line_number":30,"context_line":"    conf.hitachi_target_ports \u003d [\u0027CL1-A\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"bbdbf71b_215c569f","line":27,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    # make hasattr() return True for pair target port param"},{"line_number":36,"context_line":"    conf.hitachi_rest_pair_target_ports \u003d [\u0027CL1-B\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    db \u003d mock.MagicMock()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    with mock.patch.object("},{"line_number":41,"context_line":"            rest_nvmeof.rest.HBSDREST, \u0027__init__\u0027, return_value\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"30d39af3_dbea766e","line":38,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: F841 local variable \u0027db\u0027 is assigned to but never used","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.drv \u003d _make_driver()"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def test_query_by_int_returns_nqn_list(self):"},{"line_number":83,"context_line":"        \"\"\"When subsystem is an int, returns list of NQNs for that subsystem.\"\"\""},{"line_number":84,"context_line":"        self.drv.client.get_host_nqns.return_value \u003d ["},{"line_number":85,"context_line":"            {\u0027hostNqn\u0027: \u0027nqn.host1\u0027},"},{"line_number":86,"context_line":"            {\u0027hostNqn\u0027: \u0027nqn.host2\u0027},"}],"source_content_type":"text/x-python","patch_set":3,"id":"e4e54531_7f8bf38d","line":83,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        self.assertEqual(3, gid)"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    def test_reraises_when_group_not_found_on_fallback(self):"},{"line_number":490,"context_line":"        \"\"\"When the group is not found in fallback, original exception raised.\"\"\""},{"line_number":491,"context_line":"        self.drv.client.add_host_grp.side_effect \u003d Exception(\u0027conflict\u0027)"},{"line_number":492,"context_line":"        self.drv.client.get_host_grps.return_value \u003d []"},{"line_number":493,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":3,"id":"2ad0506c_68b5afce","line":490,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        \"\"\"When the group is not found in fallback, original exception raised.\"\"\""},{"line_number":491,"context_line":"        self.drv.client.add_host_grp.side_effect \u003d Exception(\u0027conflict\u0027)"},{"line_number":492,"context_line":"        self.drv.client.get_host_grps.return_value \u003d []"},{"line_number":493,"context_line":"        self.assertRaises("},{"line_number":494,"context_line":"            Exception,"},{"line_number":495,"context_line":"            self.drv.create_target_to_storage, \u0027CL1-A\u0027, {}, None)"},{"line_number":496,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b8a87337_ac2f8c5c","line":493,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: H202: assertRaises Exception too broad","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        \"\"\"Namespace is deleted when add_host_namespace_path raises.\"\"\""},{"line_number":547,"context_line":"        self.drv.client.add_host_namespace_path.side_effect \u003d Exception(\u0027fail\u0027)"},{"line_number":548,"context_line":"        targets \u003d self._targets()"},{"line_number":549,"context_line":"        self.assertRaises("},{"line_number":550,"context_line":"            Exception,"},{"line_number":551,"context_line":"            self.drv.map_ldev_from_attach, {}, targets, 0, None)"},{"line_number":552,"context_line":"        self.drv.client.delete_namespace.assert_called_once_with(10, 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"71f5b51e_71daa0f9","line":549,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: H202: assertRaises Exception too broad","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":673,"context_line":"    def test_returns_none_when_namespace_or_subsystem_missing(self):"},{"line_number":674,"context_line":"        self.drv.get_ldev_info.return_value \u003d {"},{"line_number":675,"context_line":"            \u0027nvmSubsystemId\u0027: 7,"},{"line_number":676,"context_line":"            \u0027namespaceId\u0027: 0,"},{"line_number":677,"context_line":"        }"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        result \u003d self.drv.get_group_info_from_ldev(123)"}],"source_content_type":"text/x-python","patch_set":22,"id":"d171b5c4_e0d40f3d","line":676,"range":{"start_line":676,"start_character":0,"end_line":676,"end_character":29},"updated":"2026-09-24 05:44:49.000000000","message":"This test encodes the truthiness bug in get_group_info_from_ldev as expected behaviour. Once that is fixed, please make the \"missing\" case use None, and add a case with nvmSubsystemId 0 that expects (0, nsid) back.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":673,"context_line":"    def test_returns_none_when_namespace_or_subsystem_missing(self):"},{"line_number":674,"context_line":"        self.drv.get_ldev_info.return_value \u003d {"},{"line_number":675,"context_line":"            \u0027nvmSubsystemId\u0027: 7,"},{"line_number":676,"context_line":"            \u0027namespaceId\u0027: 0,"},{"line_number":677,"context_line":"        }"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        result \u003d self.drv.get_group_info_from_ldev(123)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7106d868_72ddc272","line":676,"range":{"start_line":676,"start_character":0,"end_line":676,"end_character":29},"in_reply_to":"d171b5c4_e0d40f3d","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a3c1dd84b8d7ca3787182be3f3bda2da31ff398e","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    with mock.patch.object("},{"line_number":40,"context_line":"            rest_nvmeof.rest.HBSDREST, \u0027__init__\u0027, return_value\u003dNone):"},{"line_number":41,"context_line":"        drv \u003d cls.__new__(cls)"},{"line_number":42,"context_line":"        drv.conf \u003d conf"},{"line_number":43,"context_line":"        drv.client \u003d mock.MagicMock()"},{"line_number":44,"context_line":"        drv.storage_info \u003d {"}],"source_content_type":"text/x-python","patch_set":26,"id":"a83c9d3f_b0d8a5fc","line":41,"updated":"2026-09-26 13:35:31.000000000","message":"Nit, test hygiene only. Because this fixture skips ``HBSDREST.__init__``, ``request_thread_pool_executor`` is never created, and ``HBSDREST.__del__`` (hbsd_rest.py:367) raises when each driver instance is collected. Every run of this module prints:\n\n```\nException ignored in: \u003cfunction HBSDREST.__del__ ...\u003e\nAttributeError: \u0027HBSDRESTNVMEOF\u0027 object has no attribute \u0027request_thread_pool_executor\u0027\n```\n\nTests still pass, but it drowns real output. Either add ``drv.request_thread_pool_executor \u003d mock.MagicMock()`` here alongside ``drv.client``, or (arguably better, since it protects any half-constructed driver) make ``__del__`` tolerant:\n\n```\nexecutor \u003d getattr(self, \u0027request_thread_pool_executor\u0027, None)\nif executor is not None:\n    executor.shutdown(wait\u003dFalse, cancel_futures\u003dFalse)\n```","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"b115637ba7eaed65f73771f8662784b960c3e915","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    with mock.patch.object("},{"line_number":40,"context_line":"            rest_nvmeof.rest.HBSDREST, \u0027__init__\u0027, return_value\u003dNone):"},{"line_number":41,"context_line":"        drv \u003d cls.__new__(cls)"},{"line_number":42,"context_line":"        drv.conf \u003d conf"},{"line_number":43,"context_line":"        drv.client \u003d mock.MagicMock()"},{"line_number":44,"context_line":"        drv.storage_info \u003d {"}],"source_content_type":"text/x-python","patch_set":26,"id":"aa927abf_7b51d524","line":41,"in_reply_to":"a83c9d3f_b0d8a5fc","updated":"2026-09-29 08:00:09.000000000","message":"Good catch, thanks.  I saw that, but I realized it was benign and didn\u0027t have time to try to figure it out \u0026 the test output is just noise to me anyway (save the end when there\u0027s a failure).  Still finding so many wild things Python can do, haha.","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"}],"cinder/volume/drivers/hitachi/hbsd_common.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":244,"context_line":"                    \u0027target_prefix\u0027] + \u0027{wwn}\u0027,"},{"line_number":245,"context_line":"            }"},{"line_number":246,"context_line":"        if (self.storage_info[\u0027protocol\u0027] \u003d\u003d \u0027iSCSI\u0027 or"},{"line_number":247,"context_line":"                self.storage_info[\u0027protocol\u0027] \u003d\u003d \u0027NVMe-TCP\u0027):"},{"line_number":248,"context_line":"            self.group_name_format \u003d {"},{"line_number":249,"context_line":"                \u0027group_name_max_len\u0027: _GROUP_NAME_MAX_LEN_ISCSI,"},{"line_number":250,"context_line":"                \u0027group_name_var_cnt\u0027: {"}],"source_content_type":"text/x-python","patch_set":22,"id":"a13ebfbd_f933473a","line":247,"range":{"start_line":247,"start_character":50,"end_line":247,"end_character":58},"updated":"2026-09-24 05:44:49.000000000","message":"Please use ``constants.NVMEOF_TCP`` from cinder.common.constants rather than the literal, here and at lines 1007 and 1327, and for \u0027proto\u0027 in hbsd_nvmeof.py line 34. Those constants exist so that drivers, the scheduler\u0027s capability filters and os-brick agree on the exact protocol string; a literal that drifts breaks matching silently.\n\nThe file already has \u0027FC\u0027 and \u0027iSCSI\u0027 literals in the same chains. Moving those to constants.FC / constants.ISCSI would be a welcome follow-up, but the new lines should not add to the count.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                    \u0027target_prefix\u0027] + \u0027{wwn}\u0027,"},{"line_number":245,"context_line":"            }"},{"line_number":246,"context_line":"        if (self.storage_info[\u0027protocol\u0027] \u003d\u003d \u0027iSCSI\u0027 or"},{"line_number":247,"context_line":"                self.storage_info[\u0027protocol\u0027] \u003d\u003d \u0027NVMe-TCP\u0027):"},{"line_number":248,"context_line":"            self.group_name_format \u003d {"},{"line_number":249,"context_line":"                \u0027group_name_max_len\u0027: _GROUP_NAME_MAX_LEN_ISCSI,"},{"line_number":250,"context_line":"                \u0027group_name_var_cnt\u0027: {"}],"source_content_type":"text/x-python","patch_set":22,"id":"ddfbb23e_91287e81","line":247,"range":{"start_line":247,"start_character":50,"end_line":247,"end_character":58},"in_reply_to":"a13ebfbd_f933473a","updated":"2026-09-26 09:37:28.000000000","message":"Thanks for helping tame the wild west.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"        data \u003d {"},{"line_number":1300,"context_line":"            \u0027target_nqn\u0027: targets[\u0027nvm_subsystem\u0027][\u0027nqn\u0027],"},{"line_number":1301,"context_line":"            \u0027vol_uuid\u0027: utils.format_uuid(targets[\u0027ldev_nguid\u0027]),"},{"line_number":1302,"context_line":"            \u0027ns_id\u0027: namespace_id,"},{"line_number":1303,"context_line":"            \u0027portals\u0027: []"},{"line_number":1304,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":22,"id":"f57bda44_ca74f10b","line":1301,"range":{"start_line":1301,"start_character":0,"end_line":1301,"end_character":65},"updated":"2026-09-24 05:44:49.000000000","message":"os-brick\u0027s NVMe-oF connector also accepts ``volume_nguid`` and falls back to matching on the nguid sysfs attribute when the uuid attribute does not match. Since what you have here is the NGUID, consider passing it as ``volume_nguid`` too (raw, no reformatting). Costs nothing and makes attach robust if an array ever reports a UUID descriptor that differs from the NGUID.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"        data \u003d {"},{"line_number":1300,"context_line":"            \u0027target_nqn\u0027: targets[\u0027nvm_subsystem\u0027][\u0027nqn\u0027],"},{"line_number":1301,"context_line":"            \u0027vol_uuid\u0027: utils.format_uuid(targets[\u0027ldev_nguid\u0027]),"},{"line_number":1302,"context_line":"            \u0027ns_id\u0027: namespace_id,"},{"line_number":1303,"context_line":"            \u0027portals\u0027: []"},{"line_number":1304,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":22,"id":"958c8180_6cf14f41","line":1301,"range":{"start_line":1301,"start_character":0,"end_line":1301,"end_character":65},"in_reply_to":"f57bda44_ca74f10b","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"}],"cinder/volume/drivers/hitachi/hbsd_nvmeof.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                         driver\u003dself.__class__.__name__,"},{"line_number":359,"context_line":"                         version\u003dself.get_version())"},{"line_number":360,"context_line":"        super(HBSDNVMEOFTCPDriver, self).__init__(*args,"},{"line_number":361,"context_line":"            driver_info\u003d_DRIVER_INFO_NVME_TCP, **kwargs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"24c3322b_168bb3e4","line":361,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                         driver\u003dself.__class__.__name__,"},{"line_number":359,"context_line":"                         version\u003dself.get_version())"},{"line_number":360,"context_line":"        super(HBSDNVMEOFTCPDriver, self).__init__(*args,"},{"line_number":361,"context_line":"            driver_info\u003d_DRIVER_INFO_NVME_TCP, **kwargs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dd40f2e0_75730b05","line":361,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: W292 no newline at end of file","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"77762cda99020843914e26f73fce7ec67f58d69b","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                         driver\u003dself.__class__.__name__,"},{"line_number":359,"context_line":"                         version\u003dself.get_version())"},{"line_number":360,"context_line":"        super(HBSDNVMEOFTCPDriver, self).__init__(*args,"},{"line_number":361,"context_line":"              driver_info\u003d_DRIVER_INFO_NVME_TCP, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"706a70f0_55f3a96f","line":361,"updated":"2026-07-17 08:50:20.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"49a5bfac2ea26ce24fc724b3a2edabd9b3a8de54"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"67cf48fddc50c21e5c0675f6113626c5ba59093b","unresolved":true,"context_lines":[{"line_number":279,"context_line":"    @volume_utils.trace"},{"line_number":280,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":281,"context_line":"        \"\"\"Terminate connection between the server and the volume.\"\"\""},{"line_number":282,"context_line":"        if connector is None:"},{"line_number":283,"context_line":"            connector \u003d {}"},{"line_number":284,"context_line":"        if utils.is_shared_connection(volume, connector):"},{"line_number":285,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":20,"id":"9e559f86_6e1ef73b","line":282,"updated":"2026-09-17 03:41:50.000000000","message":"Converting connector\u003dNone to {} does not implement NVMe force detach. HBSDCommon.terminate_connection() then calls get_port_hostgroup_map(), whose inherited implementation only reads SCSI LDEV ports. A namespace-only NVMe mapping therefore returns an empty map and exits without calling detach_ldev(). Is this fine for Driver?","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ddf6b539d1ff597e4566a3bc83619b752b72a1e3","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    @volume_utils.trace"},{"line_number":280,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":281,"context_line":"        \"\"\"Terminate connection between the server and the volume.\"\"\""},{"line_number":282,"context_line":"        if connector is None:"},{"line_number":283,"context_line":"            connector \u003d {}"},{"line_number":284,"context_line":"        if utils.is_shared_connection(volume, connector):"},{"line_number":285,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":20,"id":"bc9c1a56_ec92f415","line":282,"in_reply_to":"9e559f86_6e1ef73b","updated":"2026-09-17 23:28:58.000000000","message":"Great catch.  This definitely needs an adjustment.  Either there isn\u0027t a tempest case for this, or the storage will allow deletion of a volume with a namespace attached I guess. \n\nI have overridden the requisite functionality for this to handle it for NVMe.","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":58,"context_line":"}"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@interface.volumedriver"},{"line_number":62,"context_line":"class HBSDNVMEOFDriver(driver.BaseVD):"},{"line_number":63,"context_line":"    \"\"\"NVMEOF channel base class for Hitachi HBSD Driver."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"b18a916f_f38f6a91","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":23},"updated":"2026-09-24 05:44:49.000000000","message":"``@interface.volumedriver`` is on the abstract base, which cannot be instantiated (it requires driver_info in kwargs). The class operators configure, and the one that should appear in the driver list and docs, is HBSDNVMEOFTCPDriver. Please move the decorator there (the FC and iSCSI modules decorate their concrete class).","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"}"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"@interface.volumedriver"},{"line_number":62,"context_line":"class HBSDNVMEOFDriver(driver.BaseVD):"},{"line_number":63,"context_line":"    \"\"\"NVMEOF channel base class for Hitachi HBSD Driver."},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"63f91d77_06089fe5","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":23},"in_reply_to":"b18a916f_f38f6a91","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"332aad825366faa44daceb8023d7589730f049e7","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from oslo_utils import excutils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import interface"},{"line_number":22,"context_line":"from cinder.common import constants"},{"line_number":23,"context_line":"from cinder.volume import driver"},{"line_number":24,"context_line":"from cinder.volume.drivers.hitachi import hbsd_common as common"},{"line_number":25,"context_line":"from cinder.volume.drivers.hitachi import hbsd_replication as replication"}],"source_content_type":"text/x-python","patch_set":25,"id":"9aa68c74_d624b5ad","line":22,"updated":"2026-09-26 11:56:29.000000000","message":"pep8: H306: imports not in alphabetical order (cinder.interface, cinder.common.constants)","commit_id":"c23246b4766f2f813ef904ec433ef185c84dbe68"}],"cinder/volume/drivers/hitachi/hbsd_rest.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":949,"context_line":"        targets[\u0027list\u0027].sort()"},{"line_number":950,"context_line":"        for port in target_ports:"},{"line_number":951,"context_line":"            targets[\u0027lun\u0027][port] \u003d False"},{"line_number":952,"context_line":"       return int(self.map_ldev_from_attach(connector, targets, ldev, lun))"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"    def _find_mapped_targets_from_storage("},{"line_number":955,"context_line":"            self, targets, ldev, target_ports, is_pair\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"326e1031_6575814a","line":952,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E999 IndentationError: unindent does not match any outer indentation level","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":425,"context_line":"        # this method behavior."},{"line_number":426,"context_line":"        pass"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    def _set_dr_mode(self, body, capacity_saving):"},{"line_number":429,"context_line":"        dr_mode \u003d _CAPACITY_SAVING_DR_MODE.get(capacity_saving)"},{"line_number":430,"context_line":"        if not dr_mode:"},{"line_number":431,"context_line":"            msg \u003d self.output_log("}],"source_content_type":"text/x-python","patch_set":22,"id":"a1451fff_c5d285a5","line":428,"range":{"start_line":428,"start_character":0,"end_line":428,"end_character":50},"updated":"2026-09-24 05:44:49.000000000","message":"``_set_dr_mode`` has no callers. Looks like a leftover from the PS18 rebase conflict in this file. Please remove it or wire it in where ``_CAPACITY_SAVING_DR_MODE.get(csv)`` is used a few lines below.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        # this method behavior."},{"line_number":426,"context_line":"        pass"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    def _set_dr_mode(self, body, capacity_saving):"},{"line_number":429,"context_line":"        dr_mode \u003d _CAPACITY_SAVING_DR_MODE.get(capacity_saving)"},{"line_number":430,"context_line":"        if not dr_mode:"},{"line_number":431,"context_line":"            msg \u003d self.output_log("}],"source_content_type":"text/x-python","patch_set":22,"id":"dece502e_6da362c9","line":428,"range":{"start_line":428,"start_character":0,"end_line":428,"end_character":50},"in_reply_to":"a1451fff_c5d285a5","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"}],"cinder/volume/drivers/hitachi/hbsd_rest_api.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":989,"context_line":"        }"},{"line_number":990,"context_line":"        self._delete_object(url, **kwargs)"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"    def get_namespaces(self, nvm_subsystem_id, **kwargs):"},{"line_number":993,"context_line":"        \"\"\"Get namespaces for the given NVM subsystem.\"\"\""},{"line_number":994,"context_line":"        url \u003d \u0027%(url)s/namespaces\u0027 % {"},{"line_number":995,"context_line":"            \u0027url\u0027: self.object_url,"}],"source_content_type":"text/x-python","patch_set":22,"id":"d776f204_59085eae","line":992,"range":{"start_line":992,"start_character":0,"end_line":992,"end_character":57},"updated":"2026-09-24 05:44:49.000000000","message":"get_namespaces is not used anywhere. Drop it, or keep it if a follow-up will need it, but then please say so.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        }"},{"line_number":990,"context_line":"        self._delete_object(url, **kwargs)"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"    def get_namespaces(self, nvm_subsystem_id, **kwargs):"},{"line_number":993,"context_line":"        \"\"\"Get namespaces for the given NVM subsystem.\"\"\""},{"line_number":994,"context_line":"        url \u003d \u0027%(url)s/namespaces\u0027 % {"},{"line_number":995,"context_line":"            \u0027url\u0027: self.object_url,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7e471daf_20dbceb4","line":992,"range":{"start_line":992,"start_character":0,"end_line":992,"end_character":57},"in_reply_to":"d776f204_59085eae","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"}],"cinder/volume/drivers/hitachi/hbsd_rest_nvmeof.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from cinder.volume.drivers.hitachi import hbsd_utils as utils"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_PORT_TYPE_FIBRE    \u003d \u0027FIBRE\u0027"},{"line_number":27,"context_line":"_PORT_TYPE_FCOE     \u003d \u0027FCoE\u0027"},{"line_number":28,"context_line":"_PORT_TYPE_ISCSI    \u003d \u0027iSCSI\u0027"},{"line_number":29,"context_line":"_PORT_TYPE_NVME_TCP \u003d \u0027NVME_TCP\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"611ecf51_e0c76411","line":26,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E221 multiple spaces before operator","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_PORT_TYPE_FIBRE    \u003d \u0027FIBRE\u0027"},{"line_number":27,"context_line":"_PORT_TYPE_FCOE     \u003d \u0027FCoE\u0027"},{"line_number":28,"context_line":"_PORT_TYPE_ISCSI    \u003d \u0027iSCSI\u0027"},{"line_number":29,"context_line":"_PORT_TYPE_NVME_TCP \u003d \u0027NVME_TCP\u0027"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ea17deb2_da7b8fea","line":27,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E221 multiple spaces before operator","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_PORT_TYPE_FIBRE    \u003d \u0027FIBRE\u0027"},{"line_number":27,"context_line":"_PORT_TYPE_FCOE     \u003d \u0027FCoE\u0027"},{"line_number":28,"context_line":"_PORT_TYPE_ISCSI    \u003d \u0027iSCSI\u0027"},{"line_number":29,"context_line":"_PORT_TYPE_NVME_TCP \u003d \u0027NVME_TCP\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_PORT_MODE_NVME_TCP \u003d \u0027NVMe over TCP\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"56b2581d_4cd00305","line":28,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E221 multiple spaces before operator","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"_PORT_TYPE_NVME_TCP \u003d \u0027NVME_TCP\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_PORT_MODE_NVME_TCP \u003d \u0027NVMe over TCP\u0027"},{"line_number":32,"context_line":"_PORT_MODE_SCSI     \u003d \u0027FCP-SCSI\u0027"},{"line_number":33,"context_line":"_PORT_MODE_ISCSI    \u003d \u0027iSCSI\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e3fcef34_d0174bbe","line":32,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E221 multiple spaces before operator","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_PORT_MODE_NVME_TCP \u003d \u0027NVMe over TCP\u0027"},{"line_number":32,"context_line":"_PORT_MODE_SCSI     \u003d \u0027FCP-SCSI\u0027"},{"line_number":33,"context_line":"_PORT_MODE_ISCSI    \u003d \u0027iSCSI\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":36,"context_line":"MSG \u003d utils.HBSDMsg"}],"source_content_type":"text/x-python","patch_set":3,"id":"03e7b30b_ad1ce8f6","line":33,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E221 multiple spaces before operator","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF \u003d cfg.CONF"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class HBSDRESTNVMEOF(rest.HBSDREST):"},{"line_number":41,"context_line":"    \"\"\"REST interface NVMe class for Hitachi HBSD Driver.\"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, conf, storage_protocol, db):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfc512ab_75f197a6","line":40,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            if target_ports and is_target_ok and port in target_ports:"},{"line_number":146,"context_line":"                self.storage_info[\u0027controller_ports\u0027].append(port)"},{"line_number":147,"context_line":"            if (compute_target_ports and is_target_ok and"},{"line_number":148,"context_line":"                port in compute_target_ports):"},{"line_number":149,"context_line":"                self.storage_info[\u0027compute_ports\u0027].append(port)"},{"line_number":150,"context_line":"            if pair_target_ports and is_pair_ok and port in pair_target_ports:"},{"line_number":151,"context_line":"                self.storage_info[\u0027pair_ports\u0027].append(port)"}],"source_content_type":"text/x-python","patch_set":3,"id":"279e74f0_4b326e49","line":148,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E129 visually indented line with same indent as next logical line","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                        value\u003dself.storage_info[\u0027pair_ports\u0027])"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def init_check_port(self, port_data):"},{"line_number":163,"context_line":"        \"\"\" Check (and do any init for) port and return if it can be used.\"\"\""},{"line_number":164,"context_line":"        pass"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def init_cinder_hosts(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"2d63628b_020ddb0c","line":163,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: H401: docstring should not start with a space","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                (port_data[\u0027portType\u0027],"},{"line_number":194,"context_line":"                    port_data.get(\u0027lunSecuritySetting\u0027),"},{"line_number":195,"context_line":"                    port_data.get(\u0027portMode\u0027)"},{"line_number":196,"context_line":"                    ))"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        return is_valid"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"76957f35_aa2c81df","line":196,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E124 closing bracket does not match visual indentation","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        # Find the subsystem info."},{"line_number":216,"context_line":"        subsystem_info \u003d self.connector_searcher_nvm.find(nqn,"},{"line_number":217,"context_line":"            subsystem_names)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Initialize target ports."},{"line_number":220,"context_line":"        for port in target_ports:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fed36a9d_89695707","line":217,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        # Add host namespace path."},{"line_number":421,"context_line":"        try:"},{"line_number":422,"context_line":"            self.client.add_host_namespace_path(subsystem_id, nsid, nqn)"},{"line_number":423,"context_line":"        except:"},{"line_number":424,"context_line":"            # If we fail to add a path, delete our namespace and rethrow."},{"line_number":425,"context_line":"            self.client.delete_namespace(subsystem_id, nsid)"},{"line_number":426,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":3,"id":"fc79d71b_617bc778","line":423,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E722 do not use bare \u0027except\u0027","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        # Add host namespace path."},{"line_number":421,"context_line":"        try:"},{"line_number":422,"context_line":"            self.client.add_host_namespace_path(subsystem_id, nsid, nqn)"},{"line_number":423,"context_line":"        except:"},{"line_number":424,"context_line":"            # If we fail to add a path, delete our namespace and rethrow."},{"line_number":425,"context_line":"            self.client.delete_namespace(subsystem_id, nsid)"},{"line_number":426,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":3,"id":"2abf78d9_c7d632c2","line":423,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: H201: no \u0027except:\u0027 at least use \u0027except Exception:\u0027","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            for path in paths:"},{"line_number":475,"context_line":"                if not nqn or path[\u0027hostNqn\u0027] \u003d\u003d nqn:"},{"line_number":476,"context_line":"                    self.client.delete_host_namespace_path(subsystem_id,"},{"line_number":477,"context_line":"                                                            nsid,"},{"line_number":478,"context_line":"                                                            nqn)"},{"line_number":479,"context_line":"                    removed +\u003d 1"},{"line_number":480,"context_line":"                    if nqn:"}],"source_content_type":"text/x-python","patch_set":3,"id":"58b9b4ea_cce32df4","line":477,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":475,"context_line":"                if not nqn or path[\u0027hostNqn\u0027] \u003d\u003d nqn:"},{"line_number":476,"context_line":"                    self.client.delete_host_namespace_path(subsystem_id,"},{"line_number":477,"context_line":"                                                            nsid,"},{"line_number":478,"context_line":"                                                            nqn)"},{"line_number":479,"context_line":"                    removed +\u003d 1"},{"line_number":480,"context_line":"                    if nqn:"},{"line_number":481,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":3,"id":"32118ad8_a642753b","line":478,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        super(HBSDRESTNVMEOF_TCP, self).__init__(conf, storage_protocol, db)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def init_check_port(self, port_data):"},{"line_number":500,"context_line":"        \"\"\" Check (and do any init for) port and return if it can be used.\"\"\""},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        is_valid \u003d (port_data[\u0027portType\u0027] \u003d\u003d _PORT_TYPE_NVME_TCP and"},{"line_number":503,"context_line":"                    port_data[\u0027portMode\u0027] \u003d\u003d _PORT_MODE_NVME_TCP)"}],"source_content_type":"text/x-python","patch_set":3,"id":"99a6e8e4_95c74376","line":500,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: H401: docstring should not start with a space","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":523,"context_line":"                (port_data[\u0027portType\u0027], port_data.get(\u0027portMode\u0027)))"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return is_valid"},{"line_number":526,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b9b23652_cd842653","line":526,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: W391 blank line at end of file","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"67cf48fddc50c21e5c0675f6113626c5ba59093b","unresolved":true,"context_lines":[{"line_number":447,"context_line":"            self.client.add_host_namespace_path(subsystem_id, nsid, nqn)"},{"line_number":448,"context_line":"        except Exception:"},{"line_number":449,"context_line":"            # If we fail to add a path, delete our namespace and rethrow."},{"line_number":450,"context_line":"            self.client.delete_namespace(subsystem_id, nsid)"},{"line_number":451,"context_line":"            raise"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        subsystem \u003d self.client.get_nvm_subsystem(subsystem_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"25821173_f78b1156","line":450,"updated":"2026-09-17 03:41:50.000000000","message":"This rollback always deletes the namespace. In the LDEV_ALREADY_AS_NAMESPACE branch above, this invocation did not create the namespace; it reused an existing NSID. Deleting it when add_host_namespace_path() fails can remove mappings belonging to existing attachments. Please track whether this invocation created the namespace and only delete it in that case.","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ddf6b539d1ff597e4566a3bc83619b752b72a1e3","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            self.client.add_host_namespace_path(subsystem_id, nsid, nqn)"},{"line_number":448,"context_line":"        except Exception:"},{"line_number":449,"context_line":"            # If we fail to add a path, delete our namespace and rethrow."},{"line_number":450,"context_line":"            self.client.delete_namespace(subsystem_id, nsid)"},{"line_number":451,"context_line":"            raise"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        subsystem \u003d self.client.get_nvm_subsystem(subsystem_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"2f67b3c4_4e54b59c","line":450,"in_reply_to":"25821173_f78b1156","updated":"2026-09-17 23:28:58.000000000","message":"The above LDEV_ALREADY_AS_NAMESPACE came up during testing, so it looks like the fix missed this.","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"67cf48fddc50c21e5c0675f6113626c5ba59093b","unresolved":true,"context_lines":[{"line_number":477,"context_line":"        # We only want to clean up if we\u0027re actually on a subsystem, and it"},{"line_number":478,"context_line":"        # matches the one we expect."},{"line_number":479,"context_line":"        if (subsystem_id is not None) and (nsid is not None) and ("},{"line_number":480,"context_line":"                int(subsystem_id) \u003d\u003d targets[\u0027nvm_subsystem\u0027][\u0027id\u0027]):"},{"line_number":481,"context_line":"            nqn \u003d self.get_hba_ids_from_connector(connector)"},{"line_number":482,"context_line":"            self._unmap_namespace(int(subsystem_id), int(nsid), nqn)"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"e5ac4c02_4962a8cb","line":480,"updated":"2026-09-17 03:41:50.000000000","message":"find_targets_from_storage() only creates targets[\u0027nvm_subsystem\u0027] when the NQN search succeeds. If the LDEV still has nvmSubsystemId/namespaceId but the NQN lookup misses, this indexing raises KeyError and leaves the mapping behind. Please guard targets.get(\u0027nvm_subsystem\u0027) and handle the stale/missing-search result explicitly","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ddf6b539d1ff597e4566a3bc83619b752b72a1e3","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        # We only want to clean up if we\u0027re actually on a subsystem, and it"},{"line_number":478,"context_line":"        # matches the one we expect."},{"line_number":479,"context_line":"        if (subsystem_id is not None) and (nsid is not None) and ("},{"line_number":480,"context_line":"                int(subsystem_id) \u003d\u003d targets[\u0027nvm_subsystem\u0027][\u0027id\u0027]):"},{"line_number":481,"context_line":"            nqn \u003d self.get_hba_ids_from_connector(connector)"},{"line_number":482,"context_line":"            self._unmap_namespace(int(subsystem_id), int(nsid), nqn)"},{"line_number":483,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"8036f4ad_69982385","line":480,"in_reply_to":"e5ac4c02_4962a8cb","updated":"2026-09-17 23:28:58.000000000","message":"In this case, the search result would not be \"stale\" in a normal operation situation (the cache is refreshed when the driver adds/removes items).  So, this case should never come up in the wild without users hand-meddling. \n\nThat said, I agree we should not throw a key error in case it does.  I will validate that ```targets``` has ```nvm_subsystem``` as well for the check.","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"67cf48fddc50c21e5c0675f6113626c5ba59093b","unresolved":true,"context_lines":[{"line_number":485,"context_line":"        if self.conf.hitachi_group_delete:"},{"line_number":486,"context_line":"            # If we have no namespaces, update our deleted targets"},{"line_number":487,"context_line":"            # and remove our subsystem."},{"line_number":488,"context_line":"            subsystem \u003d self.client.get_nvm_subsystem(subsystem_id)"},{"line_number":489,"context_line":"            if \u0027namespaces\u0027 not in subsystem:"},{"line_number":490,"context_line":"                self.client.delete_nvm_subsystem(subsystem_id)"},{"line_number":491,"context_line":"                deleted_targets \u003d subsystem.get(\u0027portIds\u0027, [])"}],"source_content_type":"text/x-python","patch_set":20,"id":"deb27e10_3d881043","line":488,"updated":"2026-09-17 03:41:50.000000000","message":"This executes even when subsystem_id is None, for example on a repeated or already-unmapped detach with hitachi_group_delete\u003dTrue. That results in get_nvm_subsystem(None). Please return safely when no subsystem is associated with the LDEV before attempting subsystem cleanup.","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ddf6b539d1ff597e4566a3bc83619b752b72a1e3","unresolved":false,"context_lines":[{"line_number":485,"context_line":"        if self.conf.hitachi_group_delete:"},{"line_number":486,"context_line":"            # If we have no namespaces, update our deleted targets"},{"line_number":487,"context_line":"            # and remove our subsystem."},{"line_number":488,"context_line":"            subsystem \u003d self.client.get_nvm_subsystem(subsystem_id)"},{"line_number":489,"context_line":"            if \u0027namespaces\u0027 not in subsystem:"},{"line_number":490,"context_line":"                self.client.delete_nvm_subsystem(subsystem_id)"},{"line_number":491,"context_line":"                deleted_targets \u003d subsystem.get(\u0027portIds\u0027, [])"}],"source_content_type":"text/x-python","patch_set":20,"id":"f425db3b_25488573","line":488,"in_reply_to":"deb27e10_3d881043","updated":"2026-09-17 23:28:58.000000000","message":"I\u0027m moving this into the block mentioned in your comment on line 480 so it only activates if we\u0027ve actually unmapped the namespace.  That\u0027s how the logic should work, anyway.","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"67cf48fddc50c21e5c0675f6113626c5ba59093b","unresolved":true,"context_lines":[{"line_number":500,"context_line":"                if not nqn or path[\u0027hostNqn\u0027] \u003d\u003d nqn:"},{"line_number":501,"context_line":"                    self.client.delete_host_namespace_path(subsystem_id,"},{"line_number":502,"context_line":"                                                           nsid,"},{"line_number":503,"context_line":"                                                           nqn)"},{"line_number":504,"context_line":"                    removed +\u003d 1"},{"line_number":505,"context_line":"                    if nqn:"},{"line_number":506,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":20,"id":"19ade7ce_bf8a9afe","line":503,"updated":"2026-09-17 03:41:50.000000000","message":"When nqn is None, the loop intentionally matches every namespace path, but the DELETE is issued with host_nqn\u003dNone. delete_host_namespace_path() embeds that value in the REST URL. Please pass path[\u0027hostNqn\u0027] when removing all paths. This path is used by volume deletion through unmap_namespace().","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ddf6b539d1ff597e4566a3bc83619b752b72a1e3","unresolved":false,"context_lines":[{"line_number":500,"context_line":"                if not nqn or path[\u0027hostNqn\u0027] \u003d\u003d nqn:"},{"line_number":501,"context_line":"                    self.client.delete_host_namespace_path(subsystem_id,"},{"line_number":502,"context_line":"                                                           nsid,"},{"line_number":503,"context_line":"                                                           nqn)"},{"line_number":504,"context_line":"                    removed +\u003d 1"},{"line_number":505,"context_line":"                    if nqn:"},{"line_number":506,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a6c4a9a_060b5260","line":503,"in_reply_to":"19ade7ce_bf8a9afe","updated":"2026-09-17 23:28:58.000000000","message":"Nice catch!","commit_id":"e63ba3609cbaed71f171eca90a88fc8e0b29d2ca"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":188,"context_line":"                    (is_iscsi_port_type and"},{"line_number":189,"context_line":"                     (port_data[\u0027portMode\u0027] \u003d\u003d _PORT_MODE_ISCSI)))"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        if (not port_data[\u0027lunSecuritySetting\u0027]):"},{"line_number":192,"context_line":"            is_valid \u003d False"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        if not is_valid:"}],"source_content_type":"text/x-python","patch_set":22,"id":"d97e0b00_51d6ae7e","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":49},"updated":"2026-09-24 05:44:49.000000000","message":"``port_data[\u0027lunSecuritySetting\u0027]`` is indexed directly here but read with ``.get`` at line 202. If an NVMe-mode port ever omits the key this raises KeyError inside connect_storage and the backend fails to start. ``.get`` here as well, please.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                    (is_iscsi_port_type and"},{"line_number":189,"context_line":"                     (port_data[\u0027portMode\u0027] \u003d\u003d _PORT_MODE_ISCSI)))"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        if (not port_data[\u0027lunSecuritySetting\u0027]):"},{"line_number":192,"context_line":"            is_valid \u003d False"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        if not is_valid:"}],"source_content_type":"text/x-python","patch_set":22,"id":"d7857b3f_3efc5366","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":49},"in_reply_to":"d97e0b00_51d6ae7e","updated":"2026-09-26 09:37:28.000000000","message":"I don\u0027t think it\u0027s possible to not be included (unless the API server is having issues), portMode does the same thing, as do the other drivers.\n\nI think (boing?) I was being defensive for the log, but obviuosly that would not have mattered.  I will not use get for the log version.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        return is_valid"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def check_param(self):"},{"line_number":211,"context_line":"        \"\"\"Check parameter values and consistency among them.\"\"\""},{"line_number":212,"context_line":"        super(HBSDRESTNVMEOF, self).check_param()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"443c7005_d5d0a1cf","line":210,"range":{"start_line":210,"start_character":8,"end_line":210,"end_character":19},"updated":"2026-09-24 05:44:49.000000000","message":"This override only calls super, so it can be removed. Same for check_param_nvme_tcp in hbsd_common.py (line 954), which is a no-op hook nothing overrides, and init_check_port on the base class at line 165 (the TCP subclass is the only implementation).","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        return is_valid"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def check_param(self):"},{"line_number":211,"context_line":"        \"\"\"Check parameter values and consistency among them.\"\"\""},{"line_number":212,"context_line":"        super(HBSDRESTNVMEOF, self).check_param()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"683ac73d_3c5146c0","line":210,"range":{"start_line":210,"start_character":8,"end_line":210,"end_character":19},"in_reply_to":"443c7005_d5d0a1cf","updated":"2026-09-26 09:37:28.000000000","message":"Removed ```check_param```.\n\nThe others are staying as they are future looking.  \n\n```check_param_nvme_tcp```:  May be used in the future, and keeps established pattern.  Added comment.\n\n```init_check_port```: The intent is to use the base class with NVMe-FC eventually as well, so it will have its own ```init_check_port```.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":425,"context_line":"        subsystem_id \u003d targets[\u0027nvm_subsystem\u0027][\u0027id\u0027]"},{"line_number":426,"context_line":"        nqn \u003d self.get_hba_ids_from_connector(connector)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        LOG.debug(\"mlfa. nqn\u003d%s,subsystem_id\u003d%s,ldev\u003d%s\","},{"line_number":429,"context_line":"                  repr(nqn), repr(subsystem_id), repr(ldev))"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        # Create namespace"}],"source_content_type":"text/x-python","patch_set":22,"id":"41d7fdae_0687b6b7","line":428,"range":{"start_line":428,"start_character":19,"end_line":428,"end_character":23},"updated":"2026-09-24 05:44:49.000000000","message":"leftover development logging? drop or reword","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        subsystem_id \u003d targets[\u0027nvm_subsystem\u0027][\u0027id\u0027]"},{"line_number":426,"context_line":"        nqn \u003d self.get_hba_ids_from_connector(connector)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"        LOG.debug(\"mlfa. nqn\u003d%s,subsystem_id\u003d%s,ldev\u003d%s\","},{"line_number":429,"context_line":"                  repr(nqn), repr(subsystem_id), repr(ldev))"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        # Create namespace"}],"source_content_type":"text/x-python","patch_set":22,"id":"fe1589cb_05a3e983","line":428,"range":{"start_line":428,"start_character":19,"end_line":428,"end_character":23},"in_reply_to":"41d7fdae_0687b6b7","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":434,"context_line":"        try:"},{"line_number":435,"context_line":"            nsid \u003d self.client.add_namespace(subsystem_id, ldev)"},{"line_number":436,"context_line":"            ns_created \u003d True"},{"line_number":437,"context_line":"            LOG.debug(\"mlfa. added namespace.nsid\u003d%s\", repr(nsid))"},{"line_number":438,"context_line":"        except exception.VolumeDriverException as ex:"},{"line_number":439,"context_line":"            err_code \u003d utils.safe_get_err_code(ex.kwargs.get(\u0027errobj\u0027))"},{"line_number":440,"context_line":"            if err_code \u003d\u003d rest_api.LDEV_ALREADY_AS_NAMESPACE:"}],"source_content_type":"text/x-python","patch_set":22,"id":"c1f9f26e_dc991fba","line":437,"range":{"start_line":437,"start_character":0,"end_line":437,"end_character":66},"updated":"2026-09-24 05:44:49.000000000","message":"leftover development logging? drop or reword","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        try:"},{"line_number":435,"context_line":"            nsid \u003d self.client.add_namespace(subsystem_id, ldev)"},{"line_number":436,"context_line":"            ns_created \u003d True"},{"line_number":437,"context_line":"            LOG.debug(\"mlfa. added namespace.nsid\u003d%s\", repr(nsid))"},{"line_number":438,"context_line":"        except exception.VolumeDriverException as ex:"},{"line_number":439,"context_line":"            err_code \u003d utils.safe_get_err_code(ex.kwargs.get(\u0027errobj\u0027))"},{"line_number":440,"context_line":"            if err_code \u003d\u003d rest_api.LDEV_ALREADY_AS_NAMESPACE:"}],"source_content_type":"text/x-python","patch_set":22,"id":"39f5476f_67bfddb3","line":437,"range":{"start_line":437,"start_character":0,"end_line":437,"end_character":66},"in_reply_to":"c1f9f26e_dc991fba","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":437,"context_line":"            LOG.debug(\"mlfa. added namespace.nsid\u003d%s\", repr(nsid))"},{"line_number":438,"context_line":"        except exception.VolumeDriverException as ex:"},{"line_number":439,"context_line":"            err_code \u003d utils.safe_get_err_code(ex.kwargs.get(\u0027errobj\u0027))"},{"line_number":440,"context_line":"            if err_code \u003d\u003d rest_api.LDEV_ALREADY_AS_NAMESPACE:"},{"line_number":441,"context_line":"                ldev_info \u003d self.get_ldev_info([\u0027namespaceId\u0027], ldev)"},{"line_number":442,"context_line":"                nsid \u003d ldev_info.get(\u0027namespaceId\u0027)"},{"line_number":443,"context_line":"                LOG.debug(\"extracted nsid\u003d%s for ldev\u003d%s\", nsid, ldev)"}],"source_content_type":"text/x-python","patch_set":22,"id":"cff95336_b7d3d06d","line":440,"range":{"start_line":440,"start_character":0,"end_line":440,"end_character":62},"updated":"2026-09-24 05:44:49.000000000","message":"When add_namespace fails with LDEV_ALREADY_AS_NAMESPACE, this reads the LDEV\u0027s namespaceId and then adds a host path for that NSID in ``subsystem_id``, i.e. the connector\u0027s subsystem. Nothing checks that the LDEV\u0027s nvmSubsystemId is the same subsystem.\n\nAs far as I know an LDEV can only be a namespace in one NVM subsystem, and subsystems here are per connector, so this branch is hit on any second-host attach: Nova live migration (initialize_connection on the destination while the source is still attached), multiattach across hosts (update_volume_stats advertises multiattach\u003dTrue), or a leftover mapping after a failed detach. In the best case the REST call fails with an unhelpful error. In the worst case NSID N already exists in our subsystem for a different LDEV and the host gets someone else\u0027s volume.\n\nPlease fetch nvmSubsystemId alongside namespaceId here and, if it differs from subsystem_id, raise with a clear message. If cross-host attach is not supported for NVMe-TCP in this release, the driver should also stop reporting multiattach for this protocol and the docs should say so.\n\nThere is no unit test for this branch either; a test for the same-subsystem and different-subsystem cases would be good.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            LOG.debug(\"mlfa. added namespace.nsid\u003d%s\", repr(nsid))"},{"line_number":438,"context_line":"        except exception.VolumeDriverException as ex:"},{"line_number":439,"context_line":"            err_code \u003d utils.safe_get_err_code(ex.kwargs.get(\u0027errobj\u0027))"},{"line_number":440,"context_line":"            if err_code \u003d\u003d rest_api.LDEV_ALREADY_AS_NAMESPACE:"},{"line_number":441,"context_line":"                ldev_info \u003d self.get_ldev_info([\u0027namespaceId\u0027], ldev)"},{"line_number":442,"context_line":"                nsid \u003d ldev_info.get(\u0027namespaceId\u0027)"},{"line_number":443,"context_line":"                LOG.debug(\"extracted nsid\u003d%s for ldev\u003d%s\", nsid, ldev)"}],"source_content_type":"text/x-python","patch_set":22,"id":"6470cbeb_cbfa0766","line":440,"range":{"start_line":440,"start_character":0,"end_line":440,"end_character":62},"in_reply_to":"cff95336_b7d3d06d","updated":"2026-09-26 09:37:28.000000000","message":"Great catch.\n\n- Removed multiattach support\n- Updated docs\n- Added UT\n- Add error message and exception if the subsystem ID does not match","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":525,"context_line":"        \"\"\"Get the mapping of a port and host group.\"\"\""},{"line_number":526,"context_line":"        ldev_info \u003d self.get_ldev_info([\u0027namespaceId\u0027, \u0027nvmSubsystemId\u0027],"},{"line_number":527,"context_line":"                                       ldev_id)"},{"line_number":528,"context_line":"        if not ldev_info[\u0027namespaceId\u0027] or not ldev_info[\u0027nvmSubsystemId\u0027]:"},{"line_number":529,"context_line":"            return None"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"        return (ldev_info[\u0027nvmSubsystemId\u0027], ldev_info[\u0027namespaceId\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"a6f82d51_6cbbf29e","line":528,"range":{"start_line":528,"start_character":0,"end_line":528,"end_character":75},"updated":"2026-09-24 05:44:49.000000000","message":"``not ldev_info[\u0027nvmSubsystemId\u0027]`` treats NVM subsystem ID 0 as \"not mapped\". 0 is a valid subsystem ID, and ``_find_free_nvm_id`` returns the first undefined ID, which on a fresh array is 0. So on a new deployment the first subsystem the driver creates is the one force-detach (connector without \u0027host\u0027) will silently skip: terminate_connection logs NO_LUN and returns, leaving the namespace path behind.\n\nPlease use ``is None``, as detach_ldev (line 484) and find_all_mapped_targets_from_storage already do. namespaceId 0 is not valid so the truthiness check is harmless there, but ``is None`` on both keys is clearer.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        \"\"\"Get the mapping of a port and host group.\"\"\""},{"line_number":526,"context_line":"        ldev_info \u003d self.get_ldev_info([\u0027namespaceId\u0027, \u0027nvmSubsystemId\u0027],"},{"line_number":527,"context_line":"                                       ldev_id)"},{"line_number":528,"context_line":"        if not ldev_info[\u0027namespaceId\u0027] or not ldev_info[\u0027nvmSubsystemId\u0027]:"},{"line_number":529,"context_line":"            return None"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"        return (ldev_info[\u0027nvmSubsystemId\u0027], ldev_info[\u0027namespaceId\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"e0a1e932_ea37d01d","line":528,"range":{"start_line":528,"start_character":0,"end_line":528,"end_character":75},"in_reply_to":"a6f82d51_6cbbf29e","updated":"2026-09-26 09:37:28.000000000","message":"Excellent catch.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"}],"cinder/volume/drivers/hitachi/hbsd_utils.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c46537ef84687290edacd721976ddedf8b56bad3","unresolved":false,"context_lines":[{"line_number":1886,"context_line":""},{"line_number":1887,"context_line":"        with self._cache_lock:"},{"line_number":1888,"context_line":"            self._connector_cache.clear_subsystem(subsystem)"},{"line_number":1889,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"706fdefe_6d85d786","line":1889,"updated":"2026-07-16 07:49:21.000000000","message":"pep8: W391 blank line at end of file","commit_id":"7751c76004e71ffa92b487433f9cd30e6bb3b8a0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"deeff99e6dd337009ea44e157efc57433c5411ac","unresolved":false,"context_lines":[{"line_number":1922,"context_line":""},{"line_number":1923,"context_line":"def create_default_request_auditor(conf):"},{"line_number":1924,"context_line":"    return RequestAuditor()"},{"line_number":1925,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"6cd7431d_4aedd90c","line":1925,"updated":"2026-07-24 02:56:04.000000000","message":"pep8: W391 blank line at end of file","commit_id":"a7dd2241c9c17ac31b8c84a92137b812b8f23861"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":33,"context_line":"from cinder import utils as cinder_utils"},{"line_number":34,"context_line":"from cinder.volume import volume_types"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"VERSION \u003d \u00272.7.2\u0027"},{"line_number":37,"context_line":"CI_WIKI_NAME \u003d \u0027Hitachi_CI\u0027"},{"line_number":38,"context_line":"PARAM_PREFIX \u003d \u0027hitachi\u0027"},{"line_number":39,"context_line":"VENDOR_NAME \u003d \u0027Hitachi\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"8f4d30ab_acce1874","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":17},"updated":"2026-09-24 05:44:49.000000000","message":"Not introduced here, but the version history in hbsd_nvmeof.py claims 3.0.0 while VERSION is still 2.7.2 (it has not moved since 2.7.2 despite the 2.7.3 to 2.8.4 history lines). Either bump VERSION to 3.0.0 in this change or drop the 3.0.0 line from the docstring.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from cinder import utils as cinder_utils"},{"line_number":34,"context_line":"from cinder.volume import volume_types"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"VERSION \u003d \u00272.7.2\u0027"},{"line_number":37,"context_line":"CI_WIKI_NAME \u003d \u0027Hitachi_CI\u0027"},{"line_number":38,"context_line":"PARAM_PREFIX \u003d \u0027hitachi\u0027"},{"line_number":39,"context_line":"VENDOR_NAME \u003d \u0027Hitachi\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"4abc2d66_bf72a70d","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":17},"in_reply_to":"8f4d30ab_acce1874","updated":"2026-09-26 09:37:28.000000000","message":"I have been avoiding adding versioning until the end of the cycle to avoid merge headaches, but you\u0027re correct that I updated the driver files for it, so I\u0027ll update it here as well.\n\nThis note also made me remember I forgot to update the actual version in the source and snuck it in for Hibiscus in the nick of time, so thanks for that!","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":1931,"context_line":"        subsystem_info \u003d self._lookup(nqn)"},{"line_number":1932,"context_line":""},{"line_number":1933,"context_line":"        if subsystem_info is None:"},{"line_number":1934,"context_line":"            LOG.debug(\u0027Group not found in cache for NQN %(port)s. \u0027"},{"line_number":1935,"context_line":"                      \u0027Performing search.\u0027,"},{"line_number":1936,"context_line":"                      {\u0027nqn\u0027: nqn})"},{"line_number":1937,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"363b486b_b07aacee","line":1934,"range":{"start_line":1934,"start_character":0,"end_line":1934,"end_character":67},"updated":"2026-09-24 05:44:49.000000000","message":"The format string uses ``%(port)s`` but the dict only has ``nqn``, so this debug line raises a logging formatting error instead of rendering. Should be ``%(nqn)s``.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":1931,"context_line":"        subsystem_info \u003d self._lookup(nqn)"},{"line_number":1932,"context_line":""},{"line_number":1933,"context_line":"        if subsystem_info is None:"},{"line_number":1934,"context_line":"            LOG.debug(\u0027Group not found in cache for NQN %(port)s. \u0027"},{"line_number":1935,"context_line":"                      \u0027Performing search.\u0027,"},{"line_number":1936,"context_line":"                      {\u0027nqn\u0027: nqn})"},{"line_number":1937,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"1677881f_bbc1b7dd","line":1934,"range":{"start_line":1934,"start_character":0,"end_line":1934,"end_character":67},"in_reply_to":"363b486b_b07aacee","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"}],"doc/source/configuration/block-storage/drivers/hitachi-vsp-driver.rst":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","unresolved":true,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* Global-Active Device"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"* Universal Replicator"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* Shadow Image"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Supported operations"},{"line_number":91,"context_line":"~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":22,"id":"ad636896_5ac5b416","line":88,"range":{"start_line":86,"start_character":0,"end_line":88,"end_character":14},"updated":"2026-09-24 05:44:49.000000000","message":"The added Universal Replicator / Shadow Image licences, the removed TrueCopy licence under the replication section, and the removed \"volume having snapshots cannot be extended\" note are all unrelated to NVMe-TCP. Fine to keep if they are correct, but please mention them in the commit message so reviewers know they are intentional and not rebase fallout.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"* Global-Active Device"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"* Universal Replicator"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* Shadow Image"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Supported operations"},{"line_number":91,"context_line":"~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":22,"id":"0db3d6a0_0120aafc","line":88,"range":{"start_line":86,"start_character":0,"end_line":88,"end_character":14},"in_reply_to":"ad636896_5ac5b416","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a3c1dd84b8d7ca3787182be3f3bda2da31ff398e","unresolved":true,"context_lines":[{"line_number":232,"context_line":"    Replication is not currently supported in the NVMe-TCP driver."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"2. ``Multiattach``"},{"line_number":235,"context_line":"    Cross-host multiattach is not currently supported in the NVMe-TCP driver."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"3. ``Host Mode Options``"},{"line_number":238,"context_line":"    HMO configuration differs from normal iSCSI and FC ports. It is"}],"source_content_type":"text/x-rst","patch_set":26,"id":"7251c2ac_cd86cb9c","line":235,"range":{"start_line":235,"start_character":4,"end_line":235,"end_character":16},"updated":"2026-09-26 13:35:31.000000000","message":"you say cross-host, but the capability is disabling this for everything, including intra-host - hbds_nvmeof.py:213","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"b115637ba7eaed65f73771f8662784b960c3e915","unresolved":false,"context_lines":[{"line_number":232,"context_line":"    Replication is not currently supported in the NVMe-TCP driver."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"2. ``Multiattach``"},{"line_number":235,"context_line":"    Cross-host multiattach is not currently supported in the NVMe-TCP driver."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"3. ``Host Mode Options``"},{"line_number":238,"context_line":"    HMO configuration differs from normal iSCSI and FC ports. It is"}],"source_content_type":"text/x-rst","patch_set":26,"id":"4be4d6b9_18e4e476","line":235,"range":{"start_line":235,"start_character":4,"end_line":235,"end_character":16},"in_reply_to":"7251c2ac_cd86cb9c","updated":"2026-09-29 08:00:09.000000000","message":"Thanks.  I have re-enabled multiattach since single-host does work.\n\nI will rely on the release notes/documentation for cross-host.","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"}],"releasenotes/notes/hitachi-nvmeof-tcp-0a53f006981cfc1b.yaml":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"cc916b0ca53c6ef44473e98a17a49996e01041af","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":"    Add support for NVMe-TCP in the HBSD driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The initial NVMe-TCP release does not support"},{"line_number":7,"context_line":"    replication."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"f104c78d_6adc5bdd","line":4,"range":{"start_line":4,"start_character":0,"end_line":4,"end_character":48},"updated":"2026-09-24 05:44:49.000000000","message":"Please name the new driver class (cinder.volume.drivers.hitachi.hbsd_nvmeof.HBSDNVMEOFTCPDriver) so operators can find it from the release note, and add a trailing newline to the file.","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"875e78f28ef2d6177c362e173ce9310a5fd2e4c7","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":"    Add support for NVMe-TCP in the HBSD driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The initial NVMe-TCP release does not support"},{"line_number":7,"context_line":"    replication."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"c142b315_caac4e74","line":4,"range":{"start_line":4,"start_character":0,"end_line":4,"end_character":48},"in_reply_to":"f104c78d_6adc5bdd","updated":"2026-09-26 09:37:28.000000000","message":"Acknowledged","commit_id":"3f01c3c784303506f0770f30851371a4d5b16714"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"a3c1dd84b8d7ca3787182be3f3bda2da31ff398e","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Add support for NVMe-TCP in the HBSD driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The driver class for NVMe-TCP is"},{"line_number":7,"context_line":"    _cinder.volume.drivers.hitachi.hbsd_nvmeof.HBSDNVMEOFTCPDriver_"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    The initial NVMe-TCP release does not support"},{"line_number":10,"context_line":"    replication or cross-host multiattach."}],"source_content_type":"text/x-yaml","patch_set":26,"id":"4d713039_4883a414","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":11},"updated":"2026-09-26 13:35:31.000000000","message":"nit: use double backticks - underscores are not correct","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"b115637ba7eaed65f73771f8662784b960c3e915","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Add support for NVMe-TCP in the HBSD driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The driver class for NVMe-TCP is"},{"line_number":7,"context_line":"    _cinder.volume.drivers.hitachi.hbsd_nvmeof.HBSDNVMEOFTCPDriver_"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    The initial NVMe-TCP release does not support"},{"line_number":10,"context_line":"    replication or cross-host multiattach."}],"source_content_type":"text/x-yaml","patch_set":26,"id":"1dd97afb_a5909e31","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":11},"in_reply_to":"4d713039_4883a414","updated":"2026-09-29 08:00:09.000000000","message":"Acknowledged","commit_id":"5ffe3577817409df306cd4f0a6d1976493149495"}]}
