)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"643ada0605cf3ba35a68ab10d1baa9af3e868fe9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"61272339_0da16e63","updated":"2026-11-06 16:53:21.000000000","message":"Provided minor comments.","commit_id":"93570cc9fd8f03a64eb5e96db29406543d81d7fe"}],"cinder/tests/unit/volume/drivers/test_infinidat.py":[{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"643ada0605cf3ba35a68ab10d1baa9af3e868fe9","unresolved":true,"context_lines":[{"line_number":117,"context_line":"    pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class FakeNQN(str):"},{"line_number":121,"context_line":"    \"\"\"A distinct port type for testing NVMe initiator handling.\"\"\""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def __new__(cls, value):"}],"source_content_type":"text/x-python","patch_set":2,"id":"a3651b9c_aae35fe5","line":120,"updated":"2026-11-06 16:53:21.000000000","message":"fidelity gap, must have a non-str wrapper test case. it\u0027s a str subclass; the real infi.dtypes.nqn.NQN is not (plain object, str() only via __repr__, custom __eq__ with coercion).","commit_id":"93570cc9fd8f03a64eb5e96db29406543d81d7fe"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"643ada0605cf3ba35a68ab10d1baa9af3e868fe9","unresolved":true,"context_lines":[{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"    @ddt.data(None, {}, {\u0027nqn\u0027: None}, {\u0027nqn\u0027: \u0027\u0027}, {\u0027nqn\u0027: \u0027 \u0027},"},{"line_number":1547,"context_line":"              {\u0027nqn\u0027: 123}, {\u0027nqn\u0027: \u0027invalid\u0027}, test_connector)"},{"line_number":1548,"context_line":"    def test_validate_connector_invalid(self, connector):"},{"line_number":1549,"context_line":"        self.assertRaises(exception.InvalidConnectorException,"},{"line_number":1550,"context_line":"                          self.driver.validate_connector, connector)"},{"line_number":1551,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5775e422_34709f52","line":1548,"updated":"2026-11-06 16:53:21.000000000","message":"Missing padded-NQN case — test_validate_connector_invalid covers \u0027 \u0027 but not \u0027nqn.2014-08.org.x:y \u0027","commit_id":"93570cc9fd8f03a64eb5e96db29406543d81d7fe"}],"cinder/volume/drivers/infinidat.py":[{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"643ada0605cf3ba35a68ab10d1baa9af3e868fe9","unresolved":true,"context_lines":[{"line_number":238,"context_line":"        value \u003d connector.get(\u0027nqn\u0027) if connector else None"},{"line_number":239,"context_line":"        if isinstance(value, str) and value.strip():"},{"line_number":240,"context_line":"            try:"},{"line_number":241,"context_line":"                return nqn.NQN(value)"},{"line_number":242,"context_line":"            except ValueError:"},{"line_number":243,"context_line":"                pass"},{"line_number":244,"context_line":"        raise exception.InvalidConnectorException("}],"source_content_type":"text/x-python","patch_set":2,"id":"4f5a913e_4f2a087a","line":241,"updated":"2026-11-06 16:53:21.000000000","message":"value.strip() is used only as a truthiness guard; the unstripped value is passed to NQN(), please use the strip before returning to avoid bad host nqn","commit_id":"93570cc9fd8f03a64eb5e96db29406543d81d7fe"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"643ada0605cf3ba35a68ab10d1baa9af3e868fe9","unresolved":true,"context_lines":[{"line_number":582,"context_line":"            else:"},{"line_number":583,"context_line":"                ports \u003d host.get_ports(from_cache\u003dFalse)"},{"line_number":584,"context_line":"                if not ports:"},{"line_number":585,"context_line":"                    # Repair a host left without its initiator registration."},{"line_number":586,"context_line":"                    host.add_port(initiator)"},{"line_number":587,"context_line":"                elif not any(isinstance(port, nqn.NQN) and port \u003d\u003d initiator"},{"line_number":588,"context_line":"                             for port in ports):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7c8140ec_e7ab763b","line":585,"updated":"2026-11-06 16:53:21.000000000","message":"the repair path doesn\u0027t call _set_host_metadata(host), so a repaired host permanently lacks the system\u003dopenstack / hostname / created_by metadata.One line: call _set_host_metadata after the repair add_port.","commit_id":"93570cc9fd8f03a64eb5e96db29406543d81d7fe"}]}
