)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"d8f9868a2b747f657f56cbcb66f1baea919d1ac6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"13f2b26d_625ffd15","updated":"2026-09-24 17:50:54.000000000","message":"recheck","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"2d080615f8dab8e4b8e7a5adba2467721544c304","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"22daa2b0_d1df6239","updated":"2026-09-24 21:10:13.000000000","message":"recheck","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"dccede23b8f11e33ea9faffa282fc1c408a0325e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3d7162f7_774a1c8a","updated":"2026-09-24 22:59:55.000000000","message":"run Everpure CI","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"3499a1eafdf4658a87b6eb76fbd6542dbcb6d261","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cdcde81a_b3e08d35","updated":"2026-09-24 23:09:37.000000000","message":"run Everpure CI","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"247592987931a757bb636a9fefd9f5fd7bb576a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e32bc6ce_3219e8b3","updated":"2026-09-24 22:19:15.000000000","message":"run Everpure CI","commit_id":"803127499dce05b7a261056f9241ef48210be688"}],"cinder/volume/drivers/pure.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"ee3c0d08c2a5bd540d832d033053a0ef0877328c","unresolved":true,"context_lines":[{"line_number":430,"context_line":"        connected later without a cinder-volume restart, and migrate_volume"},{"line_number":431,"context_line":"        re-checks the array connection before every transfer anyway."},{"line_number":432,"context_line":"        \"\"\""},{"line_number":433,"context_line":"        if (version.parse(peer.version) \u003c"},{"line_number":434,"context_line":"                version.parse(MIN_ASSISTED_MIGRATION_PURITY)):"},{"line_number":435,"context_line":"            LOG.warning(\"Assisted migration peer %(name)s runs Purity \""},{"line_number":436,"context_line":"                        \"%(ver)s; %(min)s or later is required for volume \""}],"source_content_type":"text/x-python","patch_set":1,"id":"14cfdcb1_f78f6079","line":433,"updated":"2026-09-27 17:05:09.000000000","message":"The docstring says problems are logged rather than raised. version.parse(peer.version) is not guarded. With the packaging.version this module imports, \u0027\u0027, \u0027abc\u0027, and \u00276.1.0-custom\u0027 raise InvalidVersion, and None raises TypeError. Either one leaves _validate_assisted_peer() and fails do_setup() for the backend. A normal Purity string such as 6.10.6 parses, and 6.0.9 correctly takes the warning path. Catch InvalidVersion and TypeError, log the warning below, and continue.\n\nThe next sentence in this docstring, and the warning text, say migrate_volume re-checks the link and falls back to the generic path. This patch does not change migrate_volume. The base implementation still returns (False, None).","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"88917cf475309fcc65c566d6a4c7cf1e251abed4","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        connected later without a cinder-volume restart, and migrate_volume"},{"line_number":431,"context_line":"        re-checks the array connection before every transfer anyway."},{"line_number":432,"context_line":"        \"\"\""},{"line_number":433,"context_line":"        if (version.parse(peer.version) \u003c"},{"line_number":434,"context_line":"                version.parse(MIN_ASSISTED_MIGRATION_PURITY)):"},{"line_number":435,"context_line":"            LOG.warning(\"Assisted migration peer %(name)s runs Purity \""},{"line_number":436,"context_line":"                        \"%(ver)s; %(min)s or later is required for volume \""}],"source_content_type":"text/x-python","patch_set":1,"id":"8ac423d3_beb87926","line":433,"in_reply_to":"14cfdcb1_f78f6079","updated":"2026-09-28 09:59:18.000000000","message":"Done. The parse now lives in _peer_purity_supports_send(), which\nreturns False on InvalidVersion or TypeError, so the peer is warned\nabout and kept, and do_setup() completes. migrate_volume() uses the\nsame helper, so an unparseable version declines the assisted path\nrather than raising there either. The docstring now says the driver\nre-checks version and connection when it uses the peer, which is true\nof this change on its own. Tests cover \u0027\u0027, \u0027abc\u0027, \u00276.1.0-custom\u0027 and\nNone.","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"ee3c0d08c2a5bd540d832d033053a0ef0877328c","unresolved":true,"context_lines":[{"line_number":458,"context_line":"        for conn in res.items:"},{"line_number":459,"context_line":"            remote \u003d getattr(conn, \"remote\", None)"},{"line_number":460,"context_line":"            remote_id \u003d getattr(remote, \"id\", None) if remote else None"},{"line_number":461,"context_line":"            if remote_id !\u003d peer.array_id and conn.name !\u003d peer.array_name:"},{"line_number":462,"context_line":"                continue"},{"line_number":463,"context_line":"            if (conn.status \u003d\u003d \"connected\" and"},{"line_number":464,"context_line":"                    conn.type !\u003d \"fleet-management\"):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b48be528_fe86bdc6","line":461,"updated":"2026-09-27 17:05:09.000000000","message":"The docstring says the remote array id is used when REST reports it, and the connection name only otherwise. This condition skips the connection only when both differ, so a match on either one is enough:\n\nif remote_id !\u003d peer.array_id and conn.name !\u003d peer.array_name:\n    continue\n_assisted_peer() uses GET_ARRAY_SECONDARY: name pure_target2, id secondary_array_id. A connected sync-replication link named pure_target2 whose remote.id is some other array therefore returns True. The ddt rows never combine this peer\u0027s name with a different remote id. pure_target3 plus third_array_id is False only because both differ.\n\nMatch remote.id when it is not None, and use conn.name only when it is None. Please add that row with expected\u003dFalse.","commit_id":"803127499dce05b7a261056f9241ef48210be688"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"88917cf475309fcc65c566d6a4c7cf1e251abed4","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        for conn in res.items:"},{"line_number":459,"context_line":"            remote \u003d getattr(conn, \"remote\", None)"},{"line_number":460,"context_line":"            remote_id \u003d getattr(remote, \"id\", None) if remote else None"},{"line_number":461,"context_line":"            if remote_id !\u003d peer.array_id and conn.name !\u003d peer.array_name:"},{"line_number":462,"context_line":"                continue"},{"line_number":463,"context_line":"            if (conn.status \u003d\u003d \"connected\" and"},{"line_number":464,"context_line":"                    conn.type !\u003d \"fleet-management\"):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e8f9465_148bae08","line":461,"in_reply_to":"b48be528_fe86bdc6","updated":"2026-09-28 09:59:18.000000000","message":"Done. remote.id is authoritative whenever it is present; the name is\nonly consulted when the REST version reports no remote id. Added the\nrow you describe (the peer\u0027s name on a connection whose remote id is\nanother array) with expected\u003dFalse.","commit_id":"803127499dce05b7a261056f9241ef48210be688"}]}
