)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"e9c45ab77c788966ec1520699f4e89fa1f2d3356","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e0f6e77a_bf5dc66f","updated":"2026-08-26 05:13:26.000000000","message":"Added reviewers","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"5e42b01c047447cdfcb02683bff589cbde094098","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0d5cb00e_b5a2d5d3","updated":"2026-08-18 06:05:08.000000000","message":"Patch ready for review","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"80a15639029cce18e116765ab035d11269dc4df6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a21f8432_93b5bedf","updated":"2026-09-13 12:22:01.000000000","message":"@jayaanand.borra@netapp.com addressed feedback and updated patch with latest changes.","commit_id":"10c494b932aeac484e62d376187decd85717ac85"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"1d408b29f5d162b5aeba71c7a6a1b662f6c9f95c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e4c08364_8d4624bb","updated":"2026-09-23 04:05:25.000000000","message":"Can core reviewers please review this patch and provide feedback.","commit_id":"10c494b932aeac484e62d376187decd85717ac85"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4154694d_bf7f5f00","updated":"2026-09-13 12:29:46.000000000","message":"Can reviewers please take a look at the latest patch.","commit_id":"10c494b932aeac484e62d376187decd85717ac85"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"bbf7d482a72176a106ded8c70ed5d85ac5e58990","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fc4e95b6_e8690ddc","updated":"2026-10-05 11:36:27.000000000","message":"I also request core reviewers to take a look. If we get early feedback we can address it quickly and plan for merge as soon as Indri opens for merges.","commit_id":"10c494b932aeac484e62d376187decd85717ac85"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"c1cb52fdaa9bfd54f2b79237838ab9b86d7fb698","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0c63711d_d340007b","updated":"2026-10-27 05:58:43.000000000","message":"Request core reviewers to helps us with feedback and move this patch forward for merge.","commit_id":"10c494b932aeac484e62d376187decd85717ac85"}],"cinder/tests/unit/volume/drivers/hpe/test_alletramp.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d2658890eee6c3e91f0d4577868cdbe5c3c59714","unresolved":true,"context_lines":[{"line_number":644,"context_line":"                    self.service,"},{"line_number":645,"context_line":"                    \u0027_get_rcg_role_and_policies\u0027,"},{"line_number":646,"context_line":"                    return_value\u003d{\u0027has_active_active_policy\u0027: True},"},{"line_number":647,"context_line":"                    create\u003dTrue) as mock_get_details:"},{"line_number":648,"context_line":"            self.assertTrue(self.service._is_rcg_active_active(\u0027rcg-test\u0027))"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            mock_get_rcg.assert_called_once_with(\u0027rcg-test\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7231916d_17692988","line":647,"updated":"2026-09-02 05:07:11.000000000","message":"create\u003dTrue on _get_rcg_role_and_policies is a red flag: the production method does not exist, so this test cannot fail.\n\nPlease delete create\u003dTrue and add tests that:\n\nParse real V1 targets[].policies.activeActive (True and False) with no fake helper.\nTime out when V3 RCG is visible but never becomes AA if you keep that wait (today this would hang attach).\nAssert _wait_for_host_in_v3 is not called when the host is already admitted.\nCover create_vlun when the volume is not in an RCG.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[{"line_number":644,"context_line":"                    self.service,"},{"line_number":645,"context_line":"                    \u0027_get_rcg_role_and_policies\u0027,"},{"line_number":646,"context_line":"                    return_value\u003d{\u0027has_active_active_policy\u0027: True},"},{"line_number":647,"context_line":"                    create\u003dTrue) as mock_get_details:"},{"line_number":648,"context_line":"            self.assertTrue(self.service._is_rcg_active_active(\u0027rcg-test\u0027))"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            mock_get_rcg.assert_called_once_with(\u0027rcg-test\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"582d72c0_1108b0d9","line":647,"in_reply_to":"7231916d_17692988","updated":"2026-09-13 12:29:46.000000000","message":"create\u003dTrue is not present in active test_alletramp.py. Tests now cover V1 activeActive\u003dTrue, activeActive\u003dFalse, reuse of supplied V1 info, V3 visibility timeout, already-admitted host skipping _wait_for_host_in_v3(), and create_vlun() when volume is not in an RCG.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"}],"cinder/volume/drivers/hpe/alletramp_service.py":[{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d2658890eee6c3e91f0d4577868cdbe5c3c59714","unresolved":true,"context_lines":[{"line_number":4198,"context_line":""},{"line_number":4199,"context_line":"            LOG.info(\"Checking if RCG %(rcg)s is active-active.\","},{"line_number":4200,"context_line":"                     {\u0027rcg\u0027: rcg_name})"},{"line_number":4201,"context_line":"            rcg_details \u003d self._get_rcg_role_and_policies(rcg_info)"},{"line_number":4202,"context_line":""},{"line_number":4203,"context_line":"            if rcg_details.get(\u0027has_active_active_policy\u0027, False):"},{"line_number":4204,"context_line":"                LOG.info("}],"source_content_type":"text/x-python","patch_set":1,"id":"59d5f9b6_4e050626","line":4201,"updated":"2026-09-02 05:07:11.000000000","message":"_get_rcg_role_and_policies() is not defined on AlletraMPService and is not in hpe-storage-flowkit-py v1/v3 RemoteCopyGroupWorkflow. The unit tests only pass because they use mock.patch(..., create\u003dTrue).\n\nexcept Exception below will wrap AttributeError as HPEStorageException, so initialize_connection fails for every volume that is in an RCG — including non-AA replication, which this patch claims to leave alone.\n\nPlease implement the check in this module (or stop calling a method that does not exist). The V1 shape is already written by _configure_sync_replication_group()","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[{"line_number":4198,"context_line":""},{"line_number":4199,"context_line":"            LOG.info(\"Checking if RCG %(rcg)s is active-active.\","},{"line_number":4200,"context_line":"                     {\u0027rcg\u0027: rcg_name})"},{"line_number":4201,"context_line":"            rcg_details \u003d self._get_rcg_role_and_policies(rcg_info)"},{"line_number":4202,"context_line":""},{"line_number":4203,"context_line":"            if rcg_details.get(\u0027has_active_active_policy\u0027, False):"},{"line_number":4204,"context_line":"                LOG.info("}],"source_content_type":"text/x-python","patch_set":1,"id":"7ecb2df0_35a978ea","line":4201,"in_reply_to":"59d5f9b6_4e050626","updated":"2026-09-13 12:29:46.000000000","message":"_get_rcg_role_and_policies() now exists in production service code. _is_rcg_active_active() also directly parses V1 targets[].policies.activeActive, so active-active detection no longer depends on a nonexistent flowkit method.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d2658890eee6c3e91f0d4577868cdbe5c3c59714","unresolved":true,"context_lines":[{"line_number":4401,"context_line":"                self.session_mgr_v3.ensure_session()"},{"line_number":4402,"context_line":"                rcg_info \u003d self.rcg_v3_wf.get_rcg_info(rcg_name)"},{"line_number":4403,"context_line":"                if rcg_info:"},{"line_number":4404,"context_line":"                    rcg_options \u003d rcg_info.get(\u0027options\u0027) or \u0027\u0027"},{"line_number":4405,"context_line":"                    has_active_active \u003d \u0027active_active\u0027 in rcg_options"},{"line_number":4406,"context_line":""},{"line_number":4407,"context_line":"                    if has_active_active:"}],"source_content_type":"text/x-python","patch_set":1,"id":"de4c0afe_699c3e27","line":4404,"updated":"2026-09-02 05:07:11.000000000","message":"Waiting on \u0027active_active\u0027 in (rcg_info.get(\u0027options\u0027) or \u0027\u0027) does not match how this driver or flowkit describe V3 RCG info.\n\nParent _is_rcg_active_active() used targetStatus[].options. Flowkit get_rcg_info() documents uid / policies / targets. The new unit test invents {\u0027options\u0027: \u0027active_active\u0027}.\n\nIf V3 never returns a top-level options string, ActivePP attach sleeps 50s under 3par-{volume.id} and then fails — a regression versus parent, which only waited for the RCG to exist.\n\nPlease wait for V3 visibility (parent behavior), and take the AA decision from V1 policies.activeActive. Quote a real V3 payload if you still need a V3 policy check.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[{"line_number":4401,"context_line":"                self.session_mgr_v3.ensure_session()"},{"line_number":4402,"context_line":"                rcg_info \u003d self.rcg_v3_wf.get_rcg_info(rcg_name)"},{"line_number":4403,"context_line":"                if rcg_info:"},{"line_number":4404,"context_line":"                    rcg_options \u003d rcg_info.get(\u0027options\u0027) or \u0027\u0027"},{"line_number":4405,"context_line":"                    has_active_active \u003d \u0027active_active\u0027 in rcg_options"},{"line_number":4406,"context_line":""},{"line_number":4407,"context_line":"                    if has_active_active:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bbe1bd56_b62be680","line":4404,"in_reply_to":"de4c0afe_699c3e27","updated":"2026-09-13 12:29:46.000000000","message":"_wait_and_get_rcg_info_from_v3() waits for V3 RCG visibility only. _is_rcg_active_active() decides AA from V1 targets[].policies.activeActive.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d2658890eee6c3e91f0d4577868cdbe5c3c59714","unresolved":true,"context_lines":[{"line_number":4430,"context_line":"                LOG.exception(\"Error checking RCG %(rcg)s in V3 API on \""},{"line_number":4431,"context_line":"                              \"attempt %(attempt)s: %(ex)s.\","},{"line_number":4432,"context_line":"                              {\u0027rcg\u0027: rcg_name, \u0027attempt\u0027: attempt, \u0027ex\u0027: ex})"},{"line_number":4433,"context_line":"                raise flowkit_exceptions.HPEStorageException(ex)"},{"line_number":4434,"context_line":""},{"line_number":4435,"context_line":"            if attempt \u003c max_retries:"},{"line_number":4436,"context_line":"                time.sleep(retry_interval)"}],"source_content_type":"text/x-python","patch_set":1,"id":"c59bd302_f261a2a3","line":4433,"updated":"2026-09-02 05:07:11.000000000","message":"This except Exception: raise aborts the retry loop on the first error. Transient V3 404/timeout will never retry, which is the opposite of what the docstring claims.\n\nAlso, time.sleep runs under the volume coordination lock (up to 50s here + 15s in _wait_for_host_in_v3). This file already imports oslo_service.loopingcall. Please retry only HTTPNotFound / empty body, log DEBUG on intermediate attempts, and do not hold 3par-{volume.id} across the full poll if it can be avoided.\n\nIf admit_rcopy_host needs mutual exclusion, lock on RCG+host, not volume.id. Two volumes in the same RCG attaching in parallel use different volume locks today.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[{"line_number":4430,"context_line":"                LOG.exception(\"Error checking RCG %(rcg)s in V3 API on \""},{"line_number":4431,"context_line":"                              \"attempt %(attempt)s: %(ex)s.\","},{"line_number":4432,"context_line":"                              {\u0027rcg\u0027: rcg_name, \u0027attempt\u0027: attempt, \u0027ex\u0027: ex})"},{"line_number":4433,"context_line":"                raise flowkit_exceptions.HPEStorageException(ex)"},{"line_number":4434,"context_line":""},{"line_number":4435,"context_line":"            if attempt \u003c max_retries:"},{"line_number":4436,"context_line":"                time.sleep(retry_interval)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dce9ada5_611e2f06","line":4433,"in_reply_to":"c59bd302_f261a2a3","updated":"2026-09-13 12:29:46.000000000","message":"V3 RCG wait retries HTTPNotFound and empty/None body. Admission is now outside 3par-{volume.id} for create_vlun() and protected by RCG+host lock.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d2658890eee6c3e91f0d4577868cdbe5c3c59714","unresolved":true,"context_lines":[{"line_number":4481,"context_line":"            LOG.info(\"Waiting for host %(host)s to be visible in V3 API \""},{"line_number":4482,"context_line":"                     \"before admitting to RCG %(rcg)s.\","},{"line_number":4483,"context_line":"                     {\u0027host\u0027: hostname, \u0027rcg\u0027: rcg_name})"},{"line_number":4484,"context_line":"            self._wait_for_host_in_v3(hostname)"},{"line_number":4485,"context_line":""},{"line_number":4486,"context_line":"            LOG.info(\"Volume is part of active-active RCG %(rcg)s. \""},{"line_number":4487,"context_line":"                     \"Checking if host %(host)s is admitted with proximity.\","}],"source_content_type":"text/x-python","patch_set":1,"id":"f9187693_b162742e","line":4484,"updated":"2026-09-02 05:07:11.000000000","message":"_wait_for_host_in_v3() was moved before _is_host_admitted_to_rcg(). Parent only waited for the host when admission was actually required.\n\nRe-attach of a host that is already in the RCG now always polls V3 (up to 15s) while holding @coordination.synchronized(\u00273par-{volume.id}\u0027). For Peer Persistence, create_vlun runs twice (primary + secondary), so this cost is doubled.\n\nPlease restore: check admitted first; wait for the host only if you are about to call admit_rcopy_host","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[{"line_number":4481,"context_line":"            LOG.info(\"Waiting for host %(host)s to be visible in V3 API \""},{"line_number":4482,"context_line":"                     \"before admitting to RCG %(rcg)s.\","},{"line_number":4483,"context_line":"                     {\u0027host\u0027: hostname, \u0027rcg\u0027: rcg_name})"},{"line_number":4484,"context_line":"            self._wait_for_host_in_v3(hostname)"},{"line_number":4485,"context_line":""},{"line_number":4486,"context_line":"            LOG.info(\"Volume is part of active-active RCG %(rcg)s. \""},{"line_number":4487,"context_line":"                     \"Checking if host %(host)s is admitted with proximity.\","}],"source_content_type":"text/x-python","patch_set":1,"id":"78ebac3b_c87ba8ed","line":4484,"in_reply_to":"f9187693_b162742e","updated":"2026-09-13 12:29:46.000000000","message":"_ensure_host_admitted_to_active_active_rcg() checks _is_host_admitted_to_rcg() first. _admit_host_to_rcg_if_needed() rechecks under the RCG+host lock and only then calls _wait_for_host_in_v3().","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"d2658890eee6c3e91f0d4577868cdbe5c3c59714","unresolved":true,"context_lines":[{"line_number":4526,"context_line":""},{"line_number":4527,"context_line":"        # For active-active RCG volumes, ensure host is admitted with"},{"line_number":4528,"context_line":"        # proximity before creating VLUN."},{"line_number":4529,"context_line":"        if self._is_volume_in_remote_copy_group(volume):"},{"line_number":4530,"context_line":"            LOG.info(\"Volume %(vol)s is part of a remote copy group. \""},{"line_number":4531,"context_line":"                     \"Checking if RCG is active-active before creating \""},{"line_number":4532,"context_line":"                     \"VLUN.\", {\u0027vol\u0027: volume_name})"}],"source_content_type":"text/x-python","patch_set":1,"id":"5b3c6e79_f3a1b444","line":4529,"updated":"2026-09-02 05:07:11.000000000","message":"_is_volume_in_remote_copy_group() already calls super().get_remote_copy_group(). _is_rcg_active_active() immediately calls it again. That is two WSAPI GETs per VLUN create, with a race if the RCG disappears between them.\n\nPlease fetch once and reuse. Also: group-replicated volumes use _get_alletramp_rcg_name_of_group(), but this path always uses _get_alletramp_rcg_name(volume). Group ActivePP attach can skip admission.\n\nNVMe never enters create_vlun() (initialize_nvme_connection_backend). iSCSI hostseesvlun\u003dFalse uses self._client.create_vlun at line 3766, not self.create_vlun. If the pain is “host proximity before export”, those paths are still uncovered. Please say so in the commit/reno or hook them.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"},{"author":{"_account_id":38274,"name":"Jyotsna Lothe","display_name":"Jyotsna Lothe","email":"jyotsna.lothe@hpe.com","username":"jlothe"},"change_message_id":"579ac8552ebbb161a86dd4ca7d907a10e418c086","unresolved":false,"context_lines":[{"line_number":4526,"context_line":""},{"line_number":4527,"context_line":"        # For active-active RCG volumes, ensure host is admitted with"},{"line_number":4528,"context_line":"        # proximity before creating VLUN."},{"line_number":4529,"context_line":"        if self._is_volume_in_remote_copy_group(volume):"},{"line_number":4530,"context_line":"            LOG.info(\"Volume %(vol)s is part of a remote copy group. \""},{"line_number":4531,"context_line":"                     \"Checking if RCG is active-active before creating \""},{"line_number":4532,"context_line":"                     \"VLUN.\", {\u0027vol\u0027: volume_name})"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ad90f40_4498e5dd","line":4529,"in_reply_to":"5b3c6e79_f3a1b444","updated":"2026-09-13 12:29:46.000000000","message":"The FC/iSCSI create_vlun() path fetches once via _get_volume_remote_copy_group_info() and reuses rcg_info. Group RCG name is handled there. However, the NVMe path still does if self._is_volume_in_remote_copy_group(volume): rcg_name \u003d self._get_alletramp_rcg_name(volume), so group-replicated NVMe can still use the volume RCG name instead of the group RCG name. That part is still a gap.","commit_id":"db02be0124f4ea2c086ac843508f8cf7fe12b767"}]}
