)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"59a5f05163d353c31739664de8d5432457fec35f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5d7d9da8_13732690","updated":"2025-07-12 21:44:30.000000000","message":"In addition to resolving the existing unit test failures, the patch needs to include:\n- Unit tests for the new replication code\n- A release note\n- Updated documentation (namely the driver support matrix [1]).\n\n[1] https://opendev.org/openstack/cinder/src/branch/master/doc/source/reference/support-matrix.ini#L524","commit_id":"e872dece7ff9f9ea00657af5f7adb5abf8dd8e40"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"85f13f37aec578d3c0b6c5a41a6f3a53335f3f6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"24006b4c_de7171a0","updated":"2025-07-03 15:17:19.000000000","message":"recheck - get fresh logs","commit_id":"e872dece7ff9f9ea00657af5f7adb5abf8dd8e40"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f53457e80f482c7f90fcad653c2ecc76f0a34ba4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"303c61ea_c38353ec","updated":"2025-08-11 18:16:28.000000000","message":"The code, unit tests and documentation generally look quite good. I asked a couple of questions but the issues are minor. Obviously we still need to see Inifindat\u0027s CI results.\n\nOne additional concern is the XL size of the patch is partially due to a lot of changes that are unrelated to replication. The changes appear to be due to minor refactoring, and even include switching from double to singly quoted strings: \"text\" changed to \u0027text\u0027. It would be easier to review if split into two patches: one being the code cleanup (presumably with no functional changes) followed by the replication code.","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"1c89fb6b7f01a9400f92a465c7a92438df2eb797","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a0a06119_804be74d","in_reply_to":"0385f568_85e0052e","updated":"2025-08-13 18:51:45.000000000","message":"Hello Alan,\n\nThank you very much for the review!\n\nFixed in patch set #4\n\nThank you!","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"cbfed454b0475fa8bfbfeb5094bc4cd6f7bf4672","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0385f568_85e0052e","in_reply_to":"303c61ea_c38353ec","updated":"2025-08-13 15:12:05.000000000","message":"Hello Alan,\n\nThank you very much for the review!\n\n\u003eIt would be easier to review if split into two patches\n\nSure, please let me update the patch.\n\nThank you!","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"7bfd182b_9e2c5327","updated":"2025-08-28 13:04:04.000000000","message":"I\u0027ve left a few comments inline, major one being attaching two volumes (source + replica) so testing is required (if not done yet) for important operations like live migration of VM, volume migration/retype etc.\nSecond major concern is not handling the failures after we suspend the replicas, in which case, they will never resume.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"8b8440f8ee0c32b2d964f4082cd2559c038a2b11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dce357a5_37b4dc85","updated":"2025-08-14 14:37:18.000000000","message":"recheck \n\nspurious cinder-tempest-plugin-lvm-lio-barbican failure\n\ncode changes lgtm!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"fce0977b91e9c8267d56bc8cbdff4aaf17ad43cc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dad6c0b9_81687d10","updated":"2025-08-20 06:23:00.000000000","message":"recheck - repeat cinder-tempest-plugin-lvm-lio-barbican test","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"90e8b0301711aa5db4a15c8d9f0b12dccbdbdda7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2b031537_c9ba553e","updated":"2025-08-19 11:25:30.000000000","message":"recheck - repeat failed cinder-tempest-plugin-lvm-lio-barbican test","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"0a8d5f068aadbf0b116ea08b5c5a3491599737b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a03b31ed_25f615f0","updated":"2025-08-20 08:58:41.000000000","message":"recheck - repeat tempest-slow-py3 test","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":37923,"name":"anthony gamboa","display_name":"Anthony Gamboa","email":"anthony.gamboa@hitachivantara.com","username":"anthonygamboa","status":"Hitachi Vantara Software Developer"},"change_message_id":"24206629737a4b04bb1844c1b645e6e9f381cb95","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7285041b_55b291df","updated":"2025-10-30 18:45:19.000000000","message":"reviewed code and updates to comments and resolved/updated","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":37923,"name":"anthony gamboa","display_name":"Anthony Gamboa","email":"anthony.gamboa@hitachivantara.com","username":"anthonygamboa","status":"Hitachi Vantara Software Developer"},"change_message_id":"17564014c33af2395cba7756fdd658cf02a52a4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9df295e1_a9bd0558","in_reply_to":"7285041b_55b291df","updated":"2025-10-30 19:25:54.000000000","message":"once the comments are address it will good to me","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"}],"cinder/tests/unit/volume/drivers/test_infinidat.py":[{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f53457e80f482c7f90fcad653c2ecc76f0a34ba4","unresolved":true,"context_lines":[{"line_number":90,"context_line":"                         group_id\u003dfake.GROUP_ID, multiattach\u003dTrue,"},{"line_number":91,"context_line":"                         volume_attachment\u003dNone, group\u003dNone)"},{"line_number":92,"context_line":"test_volume3.is_replicated.return_value \u003d False"},{"line_number":93,"context_line":"test_volume4 \u003d mock.Mock(id\u003dfake.VOLUME3_ID, name_id\u003dfake.VOLUME3_ID, size\u003d1,"},{"line_number":94,"context_line":"                         volume_type_id\u003dfake.VOLUME_TYPE_ID,"},{"line_number":95,"context_line":"                         group_id\u003dfake.GROUP_ID, multiattach\u003dTrue,"},{"line_number":96,"context_line":"                         volume_attachment\u003dNone)"}],"source_content_type":"text/x-python","patch_set":2,"id":"0b998579_bd59d808","line":93,"range":{"start_line":93,"start_character":33,"end_line":93,"end_character":43},"updated":"2025-08-11 18:16:28.000000000","message":"Shouldn\u0027t this be VOLUME4_ID?","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"cbfed454b0475fa8bfbfeb5094bc4cd6f7bf4672","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                         group_id\u003dfake.GROUP_ID, multiattach\u003dTrue,"},{"line_number":91,"context_line":"                         volume_attachment\u003dNone, group\u003dNone)"},{"line_number":92,"context_line":"test_volume3.is_replicated.return_value \u003d False"},{"line_number":93,"context_line":"test_volume4 \u003d mock.Mock(id\u003dfake.VOLUME3_ID, name_id\u003dfake.VOLUME3_ID, size\u003d1,"},{"line_number":94,"context_line":"                         volume_type_id\u003dfake.VOLUME_TYPE_ID,"},{"line_number":95,"context_line":"                         group_id\u003dfake.GROUP_ID, multiattach\u003dTrue,"},{"line_number":96,"context_line":"                         volume_attachment\u003dNone)"}],"source_content_type":"text/x-python","patch_set":2,"id":"e00d6874_eca92bef","line":93,"range":{"start_line":93,"start_character":33,"end_line":93,"end_character":43},"in_reply_to":"0b998579_bd59d808","updated":"2025-08-13 15:12:05.000000000","message":"Hello Alan,\n\nThank you very much for the review!\n\nFixed in patch set #3\n\nThank you!","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":1345,"context_line":"        update \u003d self.driver.migrate_volume(None, test_volume, host)"},{"line_number":1346,"context_line":"        self.assertEqual(expected, update)"},{"line_number":1347,"context_line":""},{"line_number":1348,"context_line":"    def test___init_vendor_properties(self):"},{"line_number":1349,"context_line":"        result, vendor \u003d self.driver._init_vendor_properties()"},{"line_number":1350,"context_line":"        self.assertEqual(vendor, TEST_VENDIR_NAME)"},{"line_number":1351,"context_line":"        self.assertIsInstance(result, dict)"}],"source_content_type":"text/x-python","patch_set":5,"id":"e2f2033b_82adff93","line":1348,"updated":"2025-09-26 19:01:55.000000000","message":"Why 3 underscores?","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"        update \u003d self.driver.migrate_volume(None, test_volume, host)"},{"line_number":1346,"context_line":"        self.assertEqual(expected, update)"},{"line_number":1347,"context_line":""},{"line_number":1348,"context_line":"    def test___init_vendor_properties(self):"},{"line_number":1349,"context_line":"        result, vendor \u003d self.driver._init_vendor_properties()"},{"line_number":1350,"context_line":"        self.assertEqual(vendor, TEST_VENDIR_NAME)"},{"line_number":1351,"context_line":"        self.assertIsInstance(result, dict)"}],"source_content_type":"text/x-python","patch_set":5,"id":"0de2b716_807b2c3d","line":1348,"in_reply_to":"e2f2033b_82adff93","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\nFixed in patch set #6\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"}],"cinder/volume/drivers/infinidat.py":[{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f53457e80f482c7f90fcad653c2ecc76f0a34ba4","unresolved":true,"context_lines":[{"line_number":168,"context_line":"                         \u0027valid replication types: %(valid_values)s\u0027)"},{"line_number":169,"context_line":"                       % {\u0027replication_type\u0027: replication_type,"},{"line_number":170,"context_line":"                          \u0027valid_values\u0027: \u0027 , \u0027.join(VALID_REPLICATION_TYPES)})"},{"line_number":171,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"},{"line_number":172,"context_line":"        uniform_access \u003d strutils.bool_from_string(device.get(\u0027uniform_access\u0027,"},{"line_number":173,"context_line":"                                                              True))"},{"line_number":174,"context_line":"        alua_optimized \u003d strutils.bool_from_string(device.get(\u0027alua_optimized\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1e2114ad_b9ad1edc","line":171,"updated":"2025-08-11 18:16:28.000000000","message":"Would InvalidConfigurationValue be a more appropriate exception?","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"cbfed454b0475fa8bfbfeb5094bc4cd6f7bf4672","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                         \u0027valid replication types: %(valid_values)s\u0027)"},{"line_number":169,"context_line":"                       % {\u0027replication_type\u0027: replication_type,"},{"line_number":170,"context_line":"                          \u0027valid_values\u0027: \u0027 , \u0027.join(VALID_REPLICATION_TYPES)})"},{"line_number":171,"context_line":"            raise exception.VolumeDriverException(message\u003dmessage)"},{"line_number":172,"context_line":"        uniform_access \u003d strutils.bool_from_string(device.get(\u0027uniform_access\u0027,"},{"line_number":173,"context_line":"                                                              True))"},{"line_number":174,"context_line":"        alua_optimized \u003d strutils.bool_from_string(device.get(\u0027alua_optimized\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"97e97770_213fcee2","line":171,"in_reply_to":"1e2114ad_b9ad1edc","updated":"2025-08-13 15:12:05.000000000","message":"Hello Alan,\n\nThank you very much for the review!\n\nFixed in patch set #3\n\nThank you!","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"f53457e80f482c7f90fcad653c2ecc76f0a34ba4","unresolved":true,"context_lines":[{"line_number":760,"context_line":"    @infinisdk_to_cinder_exceptions"},{"line_number":761,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":762,"context_line":"        \"\"\"Unmap an InfiniBox volume from the host\"\"\""},{"line_number":763,"context_line":"        if self._is_volume_multiattached(volume, connector):"},{"line_number":764,"context_line":"            return True"},{"line_number":765,"context_line":"        infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":766,"context_line":"        self._terminate_connection(infinidat_volume, connector,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3c2f27de_c718b58a","line":763,"updated":"2025-08-11 18:16:28.000000000","message":"I recently looked at another cinder driver with similar code, and feel obliged to point out a potential race condition. Without a lock, simultaneous calls to terminate connections to a multiattach volume on the same host might leave the host still attached. The lock at L724 is too late in the process.","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"cbfed454b0475fa8bfbfeb5094bc4cd6f7bf4672","unresolved":false,"context_lines":[{"line_number":760,"context_line":"    @infinisdk_to_cinder_exceptions"},{"line_number":761,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":762,"context_line":"        \"\"\"Unmap an InfiniBox volume from the host\"\"\""},{"line_number":763,"context_line":"        if self._is_volume_multiattached(volume, connector):"},{"line_number":764,"context_line":"            return True"},{"line_number":765,"context_line":"        infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":766,"context_line":"        self._terminate_connection(infinidat_volume, connector,"}],"source_content_type":"text/x-python","patch_set":2,"id":"0792a2ab_ed574169","line":763,"in_reply_to":"3c2f27de_c718b58a","updated":"2025-08-13 15:12:05.000000000","message":"Hello Alan,\n\nThank you very much for the review!\n\nPlease let me open a bug and submit a patch, to fix that.\n\nThank you!","commit_id":"4624b33f6ad71a686c0152142bde9a080dcd011f"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":259,"context_line":"            \u0027backend_id\u0027: DEFAULT_BACKEND_ID,"},{"line_number":260,"context_line":"            \u0027san_ip\u0027: self.configuration.san_ip"},{"line_number":261,"context_line":"        }"},{"line_number":262,"context_line":"        backend \u003d Backend(device, self.configuration)"},{"line_number":263,"context_line":"        self.backends[DEFAULT_BACKEND_ID] \u003d backend"},{"line_number":264,"context_line":"        devices \u003d self.configuration.safe_get(\u0027replication_device\u0027)"},{"line_number":265,"context_line":"        if not devices:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5c3457ec_f9131ba6","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":15},"updated":"2025-08-28 13:04:04.000000000","message":"nit: this \"backend\" term seems overused and could easily cause confusion about what we are referring to.\n1. \"backend\" is a property at L#253 returning the active backend\n2. \"backend\" is a variable defined at L#262, L#270, L#278\n\nEven though all places return the Backend object, the backend_id might differ and we could end up using the wrong backend vs self.backend during this setup.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":259,"context_line":"            \u0027backend_id\u0027: DEFAULT_BACKEND_ID,"},{"line_number":260,"context_line":"            \u0027san_ip\u0027: self.configuration.san_ip"},{"line_number":261,"context_line":"        }"},{"line_number":262,"context_line":"        backend \u003d Backend(device, self.configuration)"},{"line_number":263,"context_line":"        self.backends[DEFAULT_BACKEND_ID] \u003d backend"},{"line_number":264,"context_line":"        devices \u003d self.configuration.safe_get(\u0027replication_device\u0027)"},{"line_number":265,"context_line":"        if not devices:"}],"source_content_type":"text/x-python","patch_set":4,"id":"a5624388_8f1b48e3","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":15},"in_reply_to":"5c3457ec_f9131ba6","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nThroughout the code we use the variable \"backend\" when referring to the Backend object. And the \"self.backend\" always points to the global active Backend object, and the \"backend\" always points to the local Backend object.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            \u0027backend_id\u0027: DEFAULT_BACKEND_ID,"},{"line_number":260,"context_line":"            \u0027san_ip\u0027: self.configuration.san_ip"},{"line_number":261,"context_line":"        }"},{"line_number":262,"context_line":"        backend \u003d Backend(device, self.configuration)"},{"line_number":263,"context_line":"        self.backends[DEFAULT_BACKEND_ID] \u003d backend"},{"line_number":264,"context_line":"        devices \u003d self.configuration.safe_get(\u0027replication_device\u0027)"},{"line_number":265,"context_line":"        if not devices:"}],"source_content_type":"text/x-python","patch_set":4,"id":"d72abeb0_d28f2ace","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":15},"in_reply_to":"a5624388_8f1b48e3","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":483,"context_line":"        }"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def _get_or_create_qos_policy(self, qos_specs):"},{"line_number":486,"context_line":"        name \u003d qos_specs[\u0027id\u0027]"},{"line_number":487,"context_line":"        qos_policy \u003d self.backend.system.qos_policies.safe_get(name\u003dname)"},{"line_number":488,"context_line":"        if qos_policy is None:"},{"line_number":489,"context_line":"            qos_policy \u003d self.backend.system.qos_policies.create("}],"source_content_type":"text/x-python","patch_set":4,"id":"b5f4f643_77854d92","line":486,"range":{"start_line":486,"start_character":8,"end_line":486,"end_character":12},"updated":"2025-08-28 13:04:04.000000000","message":"nit: using \u0027name\u0027 as a variable to refer to QoS spec \u0027id\u0027 is not a good identifier","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":37923,"name":"anthony gamboa","display_name":"Anthony Gamboa","email":"anthony.gamboa@hitachivantara.com","username":"anthonygamboa","status":"Hitachi Vantara Software Developer"},"change_message_id":"24206629737a4b04bb1844c1b645e6e9f381cb95","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        }"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def _get_or_create_qos_policy(self, qos_specs):"},{"line_number":486,"context_line":"        name \u003d qos_specs[\u0027id\u0027]"},{"line_number":487,"context_line":"        qos_policy \u003d self.backend.system.qos_policies.safe_get(name\u003dname)"},{"line_number":488,"context_line":"        if qos_policy is None:"},{"line_number":489,"context_line":"            qos_policy \u003d self.backend.system.qos_policies.create("}],"source_content_type":"text/x-python","patch_set":4,"id":"cab52ed6_4c3d4fd9","line":486,"range":{"start_line":486,"start_character":8,"end_line":486,"end_character":12},"in_reply_to":"6e03675e_92bcb43e","updated":"2025-10-30 18:45:19.000000000","message":"Reviewed and confirmed better name","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":483,"context_line":"        }"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def _get_or_create_qos_policy(self, qos_specs):"},{"line_number":486,"context_line":"        name \u003d qos_specs[\u0027id\u0027]"},{"line_number":487,"context_line":"        qos_policy \u003d self.backend.system.qos_policies.safe_get(name\u003dname)"},{"line_number":488,"context_line":"        if qos_policy is None:"},{"line_number":489,"context_line":"            qos_policy \u003d self.backend.system.qos_policies.create("}],"source_content_type":"text/x-python","patch_set":4,"id":"6e03675e_92bcb43e","line":486,"range":{"start_line":486,"start_character":8,"end_line":486,"end_character":12},"in_reply_to":"b5f4f643_77854d92","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":690,"context_line":"            remote_volume \u003d remote_system.volumes.safe_get(name\u003dname)"},{"line_number":691,"context_line":"            if remote_volume:"},{"line_number":692,"context_line":"                optimized \u003d backend.alua_optimized"},{"line_number":693,"context_line":"                remote_info \u003d self._initialize_connection(remote_volume,"},{"line_number":694,"context_line":"                                                          connector,"},{"line_number":695,"context_line":"                                                          remote_system,"},{"line_number":696,"context_line":"                                                          optimized)"},{"line_number":697,"context_line":"                LOG.debug(\u0027Remote system %s [serial %s] connection info: %s\u0027,"},{"line_number":698,"context_line":"                          remote_system.get_name(),"},{"line_number":699,"context_line":"                          remote_system.get_serial(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"36a7831b_202af04b","line":696,"range":{"start_line":693,"start_character":16,"end_line":696,"end_character":68},"updated":"2025-08-28 13:04:04.000000000","message":"This part is really confusing/worrying to me.\nSo here we are attaching both the original volume and replica to the compute host. \n\n1. Are the two devices going to be presented with the same LUN number or different?\n2. If same, it will be part of the same multipath device so who will prevent the libvirt guest from writing into the replica volume instead of the original volume?\nIf different LUN numbers then I\u0027m not sure how this is even supposed to work\n3. In a DR scenario, once the first cluster is down, and after we perform the failover, how will the libvirt guest switch over the I/O path to the secondary cluster?\n4. Same question in case of failback, how will the I/O paths switch over to primary cluster?\n5. Have we tested this with live migration of a VM? for a replicated volume, we will need to keep the two volumes attached to both the source and destination compute host. Also any failure in this scenario is really hard to recover from.\n6. Do we support volume migration/retype with replicated volumes? If yes then have we tested that workflow? once the data copy is done, we ask nova to swap the old and new volume which, in this case, will require swapping 2 volumes.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":38048,"name":"Ishraq Ahmed","email":"iahmed@infinidat.com"},"change_message_id":"a275222103cccce636afdf4f163cd8cf02fa9b0e","unresolved":true,"context_lines":[{"line_number":690,"context_line":"            remote_volume \u003d remote_system.volumes.safe_get(name\u003dname)"},{"line_number":691,"context_line":"            if remote_volume:"},{"line_number":692,"context_line":"                optimized \u003d backend.alua_optimized"},{"line_number":693,"context_line":"                remote_info \u003d self._initialize_connection(remote_volume,"},{"line_number":694,"context_line":"                                                          connector,"},{"line_number":695,"context_line":"                                                          remote_system,"},{"line_number":696,"context_line":"                                                          optimized)"},{"line_number":697,"context_line":"                LOG.debug(\u0027Remote system %s [serial %s] connection info: %s\u0027,"},{"line_number":698,"context_line":"                          remote_system.get_name(),"},{"line_number":699,"context_line":"                          remote_system.get_serial(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"dada2117_54601f94","line":696,"range":{"start_line":693,"start_character":16,"end_line":696,"end_character":68},"in_reply_to":"36a7831b_202af04b","updated":"2025-09-11 21:30:44.000000000","message":"1,2: The compute host will have one multipath device with paths coming from both the original and the replica volumes. To a host, it looks like one volume. This is the Active-Active concept of Infinidat storage arrays. A host can write to both sides simultaneously and the arrays will synchronize the active-active volumes in real-time.\n3,4. There is nothing to switch over. The paths from both sides are already in use. In a DR scenario, when one side is down, half of the paths disappear, but the multipathing subsystem continues to have access to the volume over the surviving paths.\n5. Yes, we have tested Live migration of a VM between compute hosts and it works well. \n6. Yes, we have tested the volume retype. Performing a \u0027retype\u0027 from a non-replicated to a replicated volume works as expected. We also found that performing a retype from a replicated to a \u0027non-replicated\u0027 volume is not allowed by Nova.\n\n@rajatdhasmana@gmail.com Please advise if further clarification is needed here.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            remote_volume \u003d remote_system.volumes.safe_get(name\u003dname)"},{"line_number":691,"context_line":"            if remote_volume:"},{"line_number":692,"context_line":"                optimized \u003d backend.alua_optimized"},{"line_number":693,"context_line":"                remote_info \u003d self._initialize_connection(remote_volume,"},{"line_number":694,"context_line":"                                                          connector,"},{"line_number":695,"context_line":"                                                          remote_system,"},{"line_number":696,"context_line":"                                                          optimized)"},{"line_number":697,"context_line":"                LOG.debug(\u0027Remote system %s [serial %s] connection info: %s\u0027,"},{"line_number":698,"context_line":"                          remote_system.get_name(),"},{"line_number":699,"context_line":"                          remote_system.get_serial(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"16478f76_4210baef","line":696,"range":{"start_line":693,"start_character":16,"end_line":696,"end_character":68},"in_reply_to":"dada2117_54601f94","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":877,"context_line":"                LOG.debug(\u0027Suspend replica %s before extend volume %s\u0027,"},{"line_number":878,"context_line":"                          replica, volume.name_id)"},{"line_number":879,"context_line":"                replica.suspend()"},{"line_number":880,"context_line":"        size_delta \u003d new_size * capacity.GiB - infinidat_volume.get_size()"},{"line_number":881,"context_line":"        infinidat_volume.resize(size_delta)"},{"line_number":882,"context_line":"        if volume.is_replicated():"},{"line_number":883,"context_line":"            replicas \u003d infinidat_volume.get_replicas()"},{"line_number":884,"context_line":"            for replica in replicas:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bc4e2c59_7eddc4c3","line":881,"range":{"start_line":880,"start_character":8,"end_line":881,"end_character":43},"updated":"2025-08-28 13:04:04.000000000","message":"what happens if we fail extending here? All the replicas will be in suspended state.\nWe should handle this scenario with exception handling to make sure we are always resuming the replicas in case of unexpected failures","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":877,"context_line":"                LOG.debug(\u0027Suspend replica %s before extend volume %s\u0027,"},{"line_number":878,"context_line":"                          replica, volume.name_id)"},{"line_number":879,"context_line":"                replica.suspend()"},{"line_number":880,"context_line":"        size_delta \u003d new_size * capacity.GiB - infinidat_volume.get_size()"},{"line_number":881,"context_line":"        infinidat_volume.resize(size_delta)"},{"line_number":882,"context_line":"        if volume.is_replicated():"},{"line_number":883,"context_line":"            replicas \u003d infinidat_volume.get_replicas()"},{"line_number":884,"context_line":"            for replica in replicas:"}],"source_content_type":"text/x-python","patch_set":4,"id":"2b29968f_ed4bd530","line":881,"range":{"start_line":880,"start_character":8,"end_line":881,"end_character":43},"in_reply_to":"2c1e6fdc_9485aa12","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":877,"context_line":"                LOG.debug(\u0027Suspend replica %s before extend volume %s\u0027,"},{"line_number":878,"context_line":"                          replica, volume.name_id)"},{"line_number":879,"context_line":"                replica.suspend()"},{"line_number":880,"context_line":"        size_delta \u003d new_size * capacity.GiB - infinidat_volume.get_size()"},{"line_number":881,"context_line":"        infinidat_volume.resize(size_delta)"},{"line_number":882,"context_line":"        if volume.is_replicated():"},{"line_number":883,"context_line":"            replicas \u003d infinidat_volume.get_replicas()"},{"line_number":884,"context_line":"            for replica in replicas:"}],"source_content_type":"text/x-python","patch_set":4,"id":"f320bdf9_f7dcce5a","line":881,"range":{"start_line":880,"start_character":8,"end_line":881,"end_character":43},"in_reply_to":"bc4e2c59_7eddc4c3","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":37923,"name":"anthony gamboa","display_name":"Anthony Gamboa","email":"anthony.gamboa@hitachivantara.com","username":"anthonygamboa","status":"Hitachi Vantara Software Developer"},"change_message_id":"24206629737a4b04bb1844c1b645e6e9f381cb95","unresolved":true,"context_lines":[{"line_number":877,"context_line":"                LOG.debug(\u0027Suspend replica %s before extend volume %s\u0027,"},{"line_number":878,"context_line":"                          replica, volume.name_id)"},{"line_number":879,"context_line":"                replica.suspend()"},{"line_number":880,"context_line":"        size_delta \u003d new_size * capacity.GiB - infinidat_volume.get_size()"},{"line_number":881,"context_line":"        infinidat_volume.resize(size_delta)"},{"line_number":882,"context_line":"        if volume.is_replicated():"},{"line_number":883,"context_line":"            replicas \u003d infinidat_volume.get_replicas()"},{"line_number":884,"context_line":"            for replica in replicas:"}],"source_content_type":"text/x-python","patch_set":4,"id":"2c1e6fdc_9485aa12","line":881,"range":{"start_line":880,"start_character":8,"end_line":881,"end_character":43},"in_reply_to":"f320bdf9_f7dcce5a","updated":"2025-10-30 18:45:19.000000000","message":"I think this could be improved with additional exception cases. Unless there\u0027s only one type of exception or something. Either way, they should be logged.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"            return"},{"line_number":1002,"context_line":"        snapshot.safe_delete()"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _create_copy_from_volume(self, volume, src_vref):"},{"line_number":1005,"context_line":"        \"\"\"Create a generic clone from a volume."},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"        Old versions of InfiniBox do not support detached clones,"}],"source_content_type":"text/x-python","patch_set":4,"id":"65e4ddaf_67b752e0","line":1004,"range":{"start_line":1004,"start_character":8,"end_line":1004,"end_character":32},"updated":"2025-08-28 13:04:04.000000000","message":"I might be missing some content here but,\n\n1. This method isn\u0027t called from any of the new code being implemented here.\n2. We mention that \"Old version of InfiniBox do not support detached clones\" but i don\u0027t see any version check in which we need to do the \"dd\" operation to copy from snapshot.\n3. How is this part of the replication feature?","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":37923,"name":"anthony gamboa","display_name":"Anthony Gamboa","email":"anthony.gamboa@hitachivantara.com","username":"anthonygamboa","status":"Hitachi Vantara Software Developer"},"change_message_id":"24206629737a4b04bb1844c1b645e6e9f381cb95","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            return"},{"line_number":1002,"context_line":"        snapshot.safe_delete()"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _create_copy_from_volume(self, volume, src_vref):"},{"line_number":1005,"context_line":"        \"\"\"Create a generic clone from a volume."},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"        Old versions of InfiniBox do not support detached clones,"}],"source_content_type":"text/x-python","patch_set":4,"id":"e1f736d8_ba554833","line":1004,"range":{"start_line":1004,"start_character":8,"end_line":1004,"end_character":32},"in_reply_to":"35d45b2f_814af749","updated":"2025-10-30 18:45:19.000000000","message":"LGTM","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"            return"},{"line_number":1002,"context_line":"        snapshot.safe_delete()"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _create_copy_from_volume(self, volume, src_vref):"},{"line_number":1005,"context_line":"        \"\"\"Create a generic clone from a volume."},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"        Old versions of InfiniBox do not support detached clones,"}],"source_content_type":"text/x-python","patch_set":4,"id":"35d45b2f_814af749","line":1004,"range":{"start_line":1004,"start_character":8,"end_line":1004,"end_character":32},"in_reply_to":"65e4ddaf_67b752e0","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":1166,"context_line":"                          group_name)"},{"line_number":1167,"context_line":"                replica.suspend()"},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"        for volume in add_volumes:"},{"line_number":1170,"context_line":"            infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":1171,"context_line":"            volume_name \u003d infinidat_volume.get_name()"},{"line_number":1172,"context_line":"            if group.is_replicated:"},{"line_number":1173,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1174,"context_line":"                if replicas:"},{"line_number":1175,"context_line":"                    LOG.debug(\u0027Adding volume %s to already replicated \u0027"},{"line_number":1176,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1177,"context_line":"                              volume_name, group_name)"},{"line_number":1178,"context_line":"                    infinidat_group.add_member(infinidat_volume,"},{"line_number":1179,"context_line":"                                               remote_entity_name\u003dvolume_name)"},{"line_number":1180,"context_line":"                else:"},{"line_number":1181,"context_line":"                    LOG.debug(\u0027Adding volume %s to not yet replicated \u0027"},{"line_number":1182,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1183,"context_line":"                              volume_name, group_name)"},{"line_number":1184,"context_line":"                    infinidat_group.add_member(infinidat_volume)"},{"line_number":1185,"context_line":"                replication_status \u003d fields.ReplicationStatus.ENABLED"},{"line_number":1186,"context_line":"                volume_update \u003d {"},{"line_number":1187,"context_line":"                    \u0027id\u0027: volume.id,"},{"line_number":1188,"context_line":"                    \u0027replication_status\u0027: replication_status"},{"line_number":1189,"context_line":"                }"},{"line_number":1190,"context_line":"                add_volumes_update.append(volume_update)"},{"line_number":1191,"context_line":"            else:"},{"line_number":1192,"context_line":"                LOG.debug(\u0027Adding volume %s to local consistency group %s\u0027,"},{"line_number":1193,"context_line":"                          volume_name, group_name)"},{"line_number":1194,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"        if add_volumes and group.is_replicated:"},{"line_number":1197,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1198,"context_line":"            if not replicas:"},{"line_number":1199,"context_line":"                self._create_group_replica(group)"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":"        if remove_volumes and not add_volumes and group.is_replicated:"},{"line_number":1202,"context_line":"            group_members_count \u003d infinidat_group.get_members_count()"},{"line_number":1203,"context_line":"            if group_members_count \u003d\u003d len(remove_volumes):"},{"line_number":1204,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1205,"context_line":"                for replica in replicas:"},{"line_number":1206,"context_line":"                    remote_group \u003d replica.get_remote_entity(safe\u003dTrue)"},{"line_number":1207,"context_line":"                    LOG.debug(\u0027Delete replica %s\u0027, replica)"},{"line_number":1208,"context_line":"                    replica.delete(retain_staging_area\u003dFalse)"},{"line_number":1209,"context_line":"                    if remote_group:"},{"line_number":1210,"context_line":"                        LOG.debug(\u0027Delete consistency group %s in system \u0027"},{"line_number":1211,"context_line":"                                  \u0027%s with serial %s\u0027,"},{"line_number":1212,"context_line":"                                  group_name, remote_system.get_name(),"},{"line_number":1213,"context_line":"                                  remote_system.get_serial())"},{"line_number":1214,"context_line":"                        remote_group.delete(delete_members\u003dTrue)"},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"        for volume in remove_volumes:"},{"line_number":1217,"context_line":"            infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":1218,"context_line":"            volume_name \u003d infinidat_volume.get_name()"},{"line_number":1219,"context_line":"            if group.is_replicated:"},{"line_number":1220,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1221,"context_line":"                if replicas:"},{"line_number":1222,"context_line":"                    LOG.debug(\u0027Removing volume %s from already replicated \u0027"},{"line_number":1223,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1224,"context_line":"                              volume_name, group_name)"},{"line_number":1225,"context_line":"                    infinidat_group.remove_member(infinidat_volume,"},{"line_number":1226,"context_line":"                                                  retain_staging_area\u003dFalse)"},{"line_number":1227,"context_line":"                    remote_volume \u003d remote_system.volumes.safe_get("},{"line_number":1228,"context_line":"                        name\u003dvolume_name)"},{"line_number":1229,"context_line":"                    if remote_volume:"},{"line_number":1230,"context_line":"                        LOG.debug(\u0027Removing volume %s in remote system %s \u0027"},{"line_number":1231,"context_line":"                                  \u0027with serial %s\u0027,"},{"line_number":1232,"context_line":"                                  volume_name, remote_system.get_name(),"},{"line_number":1233,"context_line":"                                  remote_system.get_serial())"},{"line_number":1234,"context_line":"                        remote_volume.delete()"},{"line_number":1235,"context_line":"                else:"},{"line_number":1236,"context_line":"                    LOG.debug(\u0027Removing volume %s from not yet replicated \u0027"},{"line_number":1237,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1238,"context_line":"                              volume_name, group_name)"},{"line_number":1239,"context_line":"                    infinidat_group.remove_member(infinidat_volume)"},{"line_number":1240,"context_line":"                replication_status \u003d fields.ReplicationStatus.DISABLED"},{"line_number":1241,"context_line":"                volume_update \u003d {"},{"line_number":1242,"context_line":"                    \u0027id\u0027: volume.id,"},{"line_number":1243,"context_line":"                    \u0027replication_status\u0027: replication_status"},{"line_number":1244,"context_line":"                }"},{"line_number":1245,"context_line":"                add_volumes_update.append(volume_update)"},{"line_number":1246,"context_line":"            else:"},{"line_number":1247,"context_line":"                LOG.debug(\u0027Removing volume %s from local consistency group %s\u0027,"},{"line_number":1248,"context_line":"                          volume_name, group_name)"},{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"}],"source_content_type":"text/x-python","patch_set":4,"id":"6068ca56_b5c1b73f","line":1249,"range":{"start_line":1169,"start_character":0,"end_line":1249,"end_character":63},"updated":"2025-08-28 13:04:04.000000000","message":"we are suspending the group replicas before this code and resume it after, there is a pretty high probability of error occurring based on the functionality we are adding in between, any exception in this code block should be handled and replicas resumed if any non-fatal error occurs.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                          group_name)"},{"line_number":1167,"context_line":"                replica.suspend()"},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"        for volume in add_volumes:"},{"line_number":1170,"context_line":"            infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":1171,"context_line":"            volume_name \u003d infinidat_volume.get_name()"},{"line_number":1172,"context_line":"            if group.is_replicated:"},{"line_number":1173,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1174,"context_line":"                if replicas:"},{"line_number":1175,"context_line":"                    LOG.debug(\u0027Adding volume %s to already replicated \u0027"},{"line_number":1176,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1177,"context_line":"                              volume_name, group_name)"},{"line_number":1178,"context_line":"                    infinidat_group.add_member(infinidat_volume,"},{"line_number":1179,"context_line":"                                               remote_entity_name\u003dvolume_name)"},{"line_number":1180,"context_line":"                else:"},{"line_number":1181,"context_line":"                    LOG.debug(\u0027Adding volume %s to not yet replicated \u0027"},{"line_number":1182,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1183,"context_line":"                              volume_name, group_name)"},{"line_number":1184,"context_line":"                    infinidat_group.add_member(infinidat_volume)"},{"line_number":1185,"context_line":"                replication_status \u003d fields.ReplicationStatus.ENABLED"},{"line_number":1186,"context_line":"                volume_update \u003d {"},{"line_number":1187,"context_line":"                    \u0027id\u0027: volume.id,"},{"line_number":1188,"context_line":"                    \u0027replication_status\u0027: replication_status"},{"line_number":1189,"context_line":"                }"},{"line_number":1190,"context_line":"                add_volumes_update.append(volume_update)"},{"line_number":1191,"context_line":"            else:"},{"line_number":1192,"context_line":"                LOG.debug(\u0027Adding volume %s to local consistency group %s\u0027,"},{"line_number":1193,"context_line":"                          volume_name, group_name)"},{"line_number":1194,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"        if add_volumes and group.is_replicated:"},{"line_number":1197,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1198,"context_line":"            if not replicas:"},{"line_number":1199,"context_line":"                self._create_group_replica(group)"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":"        if remove_volumes and not add_volumes and group.is_replicated:"},{"line_number":1202,"context_line":"            group_members_count \u003d infinidat_group.get_members_count()"},{"line_number":1203,"context_line":"            if group_members_count \u003d\u003d len(remove_volumes):"},{"line_number":1204,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1205,"context_line":"                for replica in replicas:"},{"line_number":1206,"context_line":"                    remote_group \u003d replica.get_remote_entity(safe\u003dTrue)"},{"line_number":1207,"context_line":"                    LOG.debug(\u0027Delete replica %s\u0027, replica)"},{"line_number":1208,"context_line":"                    replica.delete(retain_staging_area\u003dFalse)"},{"line_number":1209,"context_line":"                    if remote_group:"},{"line_number":1210,"context_line":"                        LOG.debug(\u0027Delete consistency group %s in system \u0027"},{"line_number":1211,"context_line":"                                  \u0027%s with serial %s\u0027,"},{"line_number":1212,"context_line":"                                  group_name, remote_system.get_name(),"},{"line_number":1213,"context_line":"                                  remote_system.get_serial())"},{"line_number":1214,"context_line":"                        remote_group.delete(delete_members\u003dTrue)"},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"        for volume in remove_volumes:"},{"line_number":1217,"context_line":"            infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":1218,"context_line":"            volume_name \u003d infinidat_volume.get_name()"},{"line_number":1219,"context_line":"            if group.is_replicated:"},{"line_number":1220,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1221,"context_line":"                if replicas:"},{"line_number":1222,"context_line":"                    LOG.debug(\u0027Removing volume %s from already replicated \u0027"},{"line_number":1223,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1224,"context_line":"                              volume_name, group_name)"},{"line_number":1225,"context_line":"                    infinidat_group.remove_member(infinidat_volume,"},{"line_number":1226,"context_line":"                                                  retain_staging_area\u003dFalse)"},{"line_number":1227,"context_line":"                    remote_volume \u003d remote_system.volumes.safe_get("},{"line_number":1228,"context_line":"                        name\u003dvolume_name)"},{"line_number":1229,"context_line":"                    if remote_volume:"},{"line_number":1230,"context_line":"                        LOG.debug(\u0027Removing volume %s in remote system %s \u0027"},{"line_number":1231,"context_line":"                                  \u0027with serial %s\u0027,"},{"line_number":1232,"context_line":"                                  volume_name, remote_system.get_name(),"},{"line_number":1233,"context_line":"                                  remote_system.get_serial())"},{"line_number":1234,"context_line":"                        remote_volume.delete()"},{"line_number":1235,"context_line":"                else:"},{"line_number":1236,"context_line":"                    LOG.debug(\u0027Removing volume %s from not yet replicated \u0027"},{"line_number":1237,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1238,"context_line":"                              volume_name, group_name)"},{"line_number":1239,"context_line":"                    infinidat_group.remove_member(infinidat_volume)"},{"line_number":1240,"context_line":"                replication_status \u003d fields.ReplicationStatus.DISABLED"},{"line_number":1241,"context_line":"                volume_update \u003d {"},{"line_number":1242,"context_line":"                    \u0027id\u0027: volume.id,"},{"line_number":1243,"context_line":"                    \u0027replication_status\u0027: replication_status"},{"line_number":1244,"context_line":"                }"},{"line_number":1245,"context_line":"                add_volumes_update.append(volume_update)"},{"line_number":1246,"context_line":"            else:"},{"line_number":1247,"context_line":"                LOG.debug(\u0027Removing volume %s from local consistency group %s\u0027,"},{"line_number":1248,"context_line":"                          volume_name, group_name)"},{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7d1c3b5a_ce743619","line":1249,"range":{"start_line":1169,"start_character":0,"end_line":1249,"end_character":63},"in_reply_to":"4b6e7c98_2787e1c6","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":1166,"context_line":"                          group_name)"},{"line_number":1167,"context_line":"                replica.suspend()"},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"        for volume in add_volumes:"},{"line_number":1170,"context_line":"            infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":1171,"context_line":"            volume_name \u003d infinidat_volume.get_name()"},{"line_number":1172,"context_line":"            if group.is_replicated:"},{"line_number":1173,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1174,"context_line":"                if replicas:"},{"line_number":1175,"context_line":"                    LOG.debug(\u0027Adding volume %s to already replicated \u0027"},{"line_number":1176,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1177,"context_line":"                              volume_name, group_name)"},{"line_number":1178,"context_line":"                    infinidat_group.add_member(infinidat_volume,"},{"line_number":1179,"context_line":"                                               remote_entity_name\u003dvolume_name)"},{"line_number":1180,"context_line":"                else:"},{"line_number":1181,"context_line":"                    LOG.debug(\u0027Adding volume %s to not yet replicated \u0027"},{"line_number":1182,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1183,"context_line":"                              volume_name, group_name)"},{"line_number":1184,"context_line":"                    infinidat_group.add_member(infinidat_volume)"},{"line_number":1185,"context_line":"                replication_status \u003d fields.ReplicationStatus.ENABLED"},{"line_number":1186,"context_line":"                volume_update \u003d {"},{"line_number":1187,"context_line":"                    \u0027id\u0027: volume.id,"},{"line_number":1188,"context_line":"                    \u0027replication_status\u0027: replication_status"},{"line_number":1189,"context_line":"                }"},{"line_number":1190,"context_line":"                add_volumes_update.append(volume_update)"},{"line_number":1191,"context_line":"            else:"},{"line_number":1192,"context_line":"                LOG.debug(\u0027Adding volume %s to local consistency group %s\u0027,"},{"line_number":1193,"context_line":"                          volume_name, group_name)"},{"line_number":1194,"context_line":"                infinidat_group.add_member(infinidat_volume)"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"        if add_volumes and group.is_replicated:"},{"line_number":1197,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1198,"context_line":"            if not replicas:"},{"line_number":1199,"context_line":"                self._create_group_replica(group)"},{"line_number":1200,"context_line":""},{"line_number":1201,"context_line":"        if remove_volumes and not add_volumes and group.is_replicated:"},{"line_number":1202,"context_line":"            group_members_count \u003d infinidat_group.get_members_count()"},{"line_number":1203,"context_line":"            if group_members_count \u003d\u003d len(remove_volumes):"},{"line_number":1204,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1205,"context_line":"                for replica in replicas:"},{"line_number":1206,"context_line":"                    remote_group \u003d replica.get_remote_entity(safe\u003dTrue)"},{"line_number":1207,"context_line":"                    LOG.debug(\u0027Delete replica %s\u0027, replica)"},{"line_number":1208,"context_line":"                    replica.delete(retain_staging_area\u003dFalse)"},{"line_number":1209,"context_line":"                    if remote_group:"},{"line_number":1210,"context_line":"                        LOG.debug(\u0027Delete consistency group %s in system \u0027"},{"line_number":1211,"context_line":"                                  \u0027%s with serial %s\u0027,"},{"line_number":1212,"context_line":"                                  group_name, remote_system.get_name(),"},{"line_number":1213,"context_line":"                                  remote_system.get_serial())"},{"line_number":1214,"context_line":"                        remote_group.delete(delete_members\u003dTrue)"},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"        for volume in remove_volumes:"},{"line_number":1217,"context_line":"            infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":1218,"context_line":"            volume_name \u003d infinidat_volume.get_name()"},{"line_number":1219,"context_line":"            if group.is_replicated:"},{"line_number":1220,"context_line":"                replicas \u003d infinidat_group.get_replicas()"},{"line_number":1221,"context_line":"                if replicas:"},{"line_number":1222,"context_line":"                    LOG.debug(\u0027Removing volume %s from already replicated \u0027"},{"line_number":1223,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1224,"context_line":"                              volume_name, group_name)"},{"line_number":1225,"context_line":"                    infinidat_group.remove_member(infinidat_volume,"},{"line_number":1226,"context_line":"                                                  retain_staging_area\u003dFalse)"},{"line_number":1227,"context_line":"                    remote_volume \u003d remote_system.volumes.safe_get("},{"line_number":1228,"context_line":"                        name\u003dvolume_name)"},{"line_number":1229,"context_line":"                    if remote_volume:"},{"line_number":1230,"context_line":"                        LOG.debug(\u0027Removing volume %s in remote system %s \u0027"},{"line_number":1231,"context_line":"                                  \u0027with serial %s\u0027,"},{"line_number":1232,"context_line":"                                  volume_name, remote_system.get_name(),"},{"line_number":1233,"context_line":"                                  remote_system.get_serial())"},{"line_number":1234,"context_line":"                        remote_volume.delete()"},{"line_number":1235,"context_line":"                else:"},{"line_number":1236,"context_line":"                    LOG.debug(\u0027Removing volume %s from not yet replicated \u0027"},{"line_number":1237,"context_line":"                              \u0027consistency group %s\u0027,"},{"line_number":1238,"context_line":"                              volume_name, group_name)"},{"line_number":1239,"context_line":"                    infinidat_group.remove_member(infinidat_volume)"},{"line_number":1240,"context_line":"                replication_status \u003d fields.ReplicationStatus.DISABLED"},{"line_number":1241,"context_line":"                volume_update \u003d {"},{"line_number":1242,"context_line":"                    \u0027id\u0027: volume.id,"},{"line_number":1243,"context_line":"                    \u0027replication_status\u0027: replication_status"},{"line_number":1244,"context_line":"                }"},{"line_number":1245,"context_line":"                add_volumes_update.append(volume_update)"},{"line_number":1246,"context_line":"            else:"},{"line_number":1247,"context_line":"                LOG.debug(\u0027Removing volume %s from local consistency group %s\u0027,"},{"line_number":1248,"context_line":"                          volume_name, group_name)"},{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"}],"source_content_type":"text/x-python","patch_set":4,"id":"4b6e7c98_2787e1c6","line":1249,"range":{"start_line":1169,"start_character":0,"end_line":1249,"end_character":63},"in_reply_to":"6068ca56_b5c1b73f","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1253,"context_line":"            for replica in replicas:"},{"line_number":1254,"context_line":"                LOG.debug(\u0027Resuming replica %s after adding %d and removing \u0027"},{"line_number":1255,"context_line":"                          \u0027%d members to or from consistency group %s\u0027,"},{"line_number":1256,"context_line":"                          replica, len(add_volumes), len(remove_volumes),"},{"line_number":1257,"context_line":"                          group_name)"},{"line_number":1258,"context_line":"                replica.resume()"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        return group_model_update, add_volumes_update, remove_volumes_update"},{"line_number":1261,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"2ab83dba_ef08d3c5","line":1258,"range":{"start_line":1252,"start_character":12,"end_line":1258,"end_character":32},"updated":"2025-08-28 13:04:04.000000000","message":"We already have methods to enable/disable replication so can we avoid this code duplication?","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1253,"context_line":"            for replica in replicas:"},{"line_number":1254,"context_line":"                LOG.debug(\u0027Resuming replica %s after adding %d and removing \u0027"},{"line_number":1255,"context_line":"                          \u0027%d members to or from consistency group %s\u0027,"},{"line_number":1256,"context_line":"                          replica, len(add_volumes), len(remove_volumes),"},{"line_number":1257,"context_line":"                          group_name)"},{"line_number":1258,"context_line":"                replica.resume()"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        return group_model_update, add_volumes_update, remove_volumes_update"},{"line_number":1261,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9dc1978c_188910c1","line":1258,"range":{"start_line":1252,"start_character":12,"end_line":1258,"end_character":32},"in_reply_to":"2ab83dba_ef08d3c5","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1253,"context_line":"            for replica in replicas:"},{"line_number":1254,"context_line":"                LOG.debug(\u0027Resuming replica %s after adding %d and removing \u0027"},{"line_number":1255,"context_line":"                          \u0027%d members to or from consistency group %s\u0027,"},{"line_number":1256,"context_line":"                          replica, len(add_volumes), len(remove_volumes),"},{"line_number":1257,"context_line":"                          group_name)"},{"line_number":1258,"context_line":"                replica.resume()"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        return group_model_update, add_volumes_update, remove_volumes_update"},{"line_number":1261,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"f8592cf4_72e6b1fb","line":1258,"range":{"start_line":1252,"start_character":12,"end_line":1258,"end_character":32},"in_reply_to":"88c38e7a_27a183ca","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":37923,"name":"anthony gamboa","display_name":"Anthony Gamboa","email":"anthony.gamboa@hitachivantara.com","username":"anthonygamboa","status":"Hitachi Vantara Software Developer"},"change_message_id":"24206629737a4b04bb1844c1b645e6e9f381cb95","unresolved":true,"context_lines":[{"line_number":1249,"context_line":"                infinidat_group.remove_member(infinidat_volume)"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1252,"context_line":"            replicas \u003d infinidat_group.get_replicas()"},{"line_number":1253,"context_line":"            for replica in replicas:"},{"line_number":1254,"context_line":"                LOG.debug(\u0027Resuming replica %s after adding %d and removing \u0027"},{"line_number":1255,"context_line":"                          \u0027%d members to or from consistency group %s\u0027,"},{"line_number":1256,"context_line":"                          replica, len(add_volumes), len(remove_volumes),"},{"line_number":1257,"context_line":"                          group_name)"},{"line_number":1258,"context_line":"                replica.resume()"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        return group_model_update, add_volumes_update, remove_volumes_update"},{"line_number":1261,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"88c38e7a_27a183ca","line":1258,"range":{"start_line":1252,"start_character":12,"end_line":1258,"end_character":32},"in_reply_to":"9dc1978c_188910c1","updated":"2025-10-30 18:45:19.000000000","message":"LGTM","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":520,"context_line":"            infinidat_host \u003d self._get_or_create_host(port, system, optimized)"},{"line_number":521,"context_line":"            mapping \u003d self._get_or_create_mapping(infinidat_host,"},{"line_number":522,"context_line":"                                                  infinidat_volume)"},{"line_number":523,"context_line":"            lun \u003d mapping.get_lun()"},{"line_number":524,"context_line":"        # Create initiator-target mapping."},{"line_number":525,"context_line":"        target_wwpns \u003d list(self._get_online_fc_ports())"},{"line_number":526,"context_line":"        target_wwpns, init_target_map \u003d self._build_initiator_target_map("}],"source_content_type":"text/x-python","patch_set":5,"id":"d5b91876_43547cd6","line":523,"updated":"2025-09-26 19:01:55.000000000","message":"Overrided for each iteration. Is it intended behavior?","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":520,"context_line":"            infinidat_host \u003d self._get_or_create_host(port, system, optimized)"},{"line_number":521,"context_line":"            mapping \u003d self._get_or_create_mapping(infinidat_host,"},{"line_number":522,"context_line":"                                                  infinidat_volume)"},{"line_number":523,"context_line":"            lun \u003d mapping.get_lun()"},{"line_number":524,"context_line":"        # Create initiator-target mapping."},{"line_number":525,"context_line":"        target_wwpns \u003d list(self._get_online_fc_ports())"},{"line_number":526,"context_line":"        target_wwpns, init_target_map \u003d self._build_initiator_target_map("}],"source_content_type":"text/x-python","patch_set":5,"id":"3c4f11af_332af05c","line":523,"in_reply_to":"d5b91876_43547cd6","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\n\u003e Overrided for each iteration. Is it intended behavior?\nYes, we need to create a host entry and a lun mapping for each port, presented on the client side. And we use a common loop over all ports and each mapping will have the same LUN number - this is expected behaviour.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":525,"context_line":"        target_wwpns \u003d list(self._get_online_fc_ports())"},{"line_number":526,"context_line":"        target_wwpns, init_target_map \u003d self._build_initiator_target_map("},{"line_number":527,"context_line":"            connector, target_wwpns)"},{"line_number":528,"context_line":"        target_luns \u003d [lun] * len(target_wwpns)"},{"line_number":529,"context_line":"        conn_info \u003d dict(driver_volume_type\u003d\u0027fibre_channel\u0027,"},{"line_number":530,"context_line":"                         data\u003ddict(target_discovered\u003dTrue,"},{"line_number":531,"context_line":"                                   target_wwn\u003dtarget_wwpns,"}],"source_content_type":"text/x-python","patch_set":5,"id":"658b917c_072b861c","line":528,"updated":"2025-09-26 19:01:55.000000000","message":"Can it be that port is emty list and lun gets unbound variable? Could it be different per host?\nCause now you initialize lun from the latest ports iteration","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        target_wwpns \u003d list(self._get_online_fc_ports())"},{"line_number":526,"context_line":"        target_wwpns, init_target_map \u003d self._build_initiator_target_map("},{"line_number":527,"context_line":"            connector, target_wwpns)"},{"line_number":528,"context_line":"        target_luns \u003d [lun] * len(target_wwpns)"},{"line_number":529,"context_line":"        conn_info \u003d dict(driver_volume_type\u003d\u0027fibre_channel\u0027,"},{"line_number":530,"context_line":"                         data\u003ddict(target_discovered\u003dTrue,"},{"line_number":531,"context_line":"                                   target_wwn\u003dtarget_wwpns,"}],"source_content_type":"text/x-python","patch_set":5,"id":"acc59a74_26ca675a","line":528,"in_reply_to":"658b917c_072b861c","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\n\u003e Can it be that port is emty list and lun gets unbound variable?\n\u003e Could it be different per host?\n\u003e Cause now you initialize lun from the latest ports iteration\n\nNo, the port list cannot be empty, because an Infinidat storage host always have FC hardware ports (by hardware design).\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":655,"context_line":"        \"\"\"Use a temporary snapshot for performing non-disruptive backups.\"\"\""},{"line_number":656,"context_line":"        return True"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    @coordination.synchronized(\u0027infinidat-{self.backend.san_ip}-lock\u0027)"},{"line_number":659,"context_line":"    def _initialize_connection(self, infinidat_volume, connector, system,"},{"line_number":660,"context_line":"                               optimized\u003dTrue):"},{"line_number":661,"context_line":"        if self.protocol \u003d\u003d constants.FC:"}],"source_content_type":"text/x-python","patch_set":5,"id":"99851651_b384163e","line":658,"updated":"2025-09-26 19:01:55.000000000","message":"I understand that you changed lock to handle backend.san_ip instead of management_address which seems to be logical replacement in environment where multiple backends are allowed. But in general isn\u0027t it very strict? \nIs there the end goal is to detect if volume is attached multiple times and prevent collision while termiation?\n\nFor this scenario lock by volume id is enough becase volume id is unique.","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        \"\"\"Use a temporary snapshot for performing non-disruptive backups.\"\"\""},{"line_number":656,"context_line":"        return True"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    @coordination.synchronized(\u0027infinidat-{self.backend.san_ip}-lock\u0027)"},{"line_number":659,"context_line":"    def _initialize_connection(self, infinidat_volume, connector, system,"},{"line_number":660,"context_line":"                               optimized\u003dTrue):"},{"line_number":661,"context_line":"        if self.protocol \u003d\u003d constants.FC:"}],"source_content_type":"text/x-python","patch_set":5,"id":"22eaea10_cf2c7549","line":658,"in_reply_to":"99851651_b384163e","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nThe reason is to prevent collision when we check/create/delete hosts/lun mapping entries when we attach/detach different volumes in parallel to/from the same client host. We tested many corner cases and found that lock by backend.san_ip is a best and safe solution.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":811,"context_line":"            max_osr \u003d self.configuration.max_over_subscription_ratio"},{"line_number":812,"context_line":"            thin \u003d self.configuration.san_thin_provision"},{"line_number":813,"context_line":"            backends \u003d list(self.backends.keys())"},{"line_number":814,"context_line":"            backends.remove(DEFAULT_BACKEND_ID)"},{"line_number":815,"context_line":"            replication_enabled \u003d len(backends) \u003e 0"},{"line_number":816,"context_line":"            replication_targets \u003d list(backends)"},{"line_number":817,"context_line":"            self._volume_stats \u003d dict(volume_backend_name\u003dself.backend_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"2e70bcce_32b1fe7a","line":814,"updated":"2025-09-26 19:01:55.000000000","message":"backends \u003d [k for k in self.backends.keys() if k !\u003d DEFAULT_BACKEND_ID] \n\nThis is more effective and concise ^","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":811,"context_line":"            max_osr \u003d self.configuration.max_over_subscription_ratio"},{"line_number":812,"context_line":"            thin \u003d self.configuration.san_thin_provision"},{"line_number":813,"context_line":"            backends \u003d list(self.backends.keys())"},{"line_number":814,"context_line":"            backends.remove(DEFAULT_BACKEND_ID)"},{"line_number":815,"context_line":"            replication_enabled \u003d len(backends) \u003e 0"},{"line_number":816,"context_line":"            replication_targets \u003d list(backends)"},{"line_number":817,"context_line":"            self._volume_stats \u003d dict(volume_backend_name\u003dself.backend_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"0df79af5_1c398566","line":814,"in_reply_to":"2e70bcce_32b1fe7a","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nFixed in patch set #6.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":882,"context_line":"            infinidat_volume.resize(size_delta)"},{"line_number":883,"context_line":"        finally:"},{"line_number":884,"context_line":"            if volume.is_replicated():"},{"line_number":885,"context_line":"                replicas \u003d infinidat_volume.get_replicas()"},{"line_number":886,"context_line":"                for replica in replicas:"},{"line_number":887,"context_line":"                    LOG.debug(\u0027Resume replica %s after extend volume %s\u0027,"},{"line_number":888,"context_line":"                              replica, volume.name_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"726faf03_95a1b9d6","line":885,"updated":"2025-09-26 19:01:55.000000000","message":"why do you take replicas twice, on line 875 and here?\nIs it possible that repica can be deleted or created new one during extend op?\n\nIn such case what if you execute replica.resume() on this \"not suspended\" replica? Is it safe op?","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":882,"context_line":"            infinidat_volume.resize(size_delta)"},{"line_number":883,"context_line":"        finally:"},{"line_number":884,"context_line":"            if volume.is_replicated():"},{"line_number":885,"context_line":"                replicas \u003d infinidat_volume.get_replicas()"},{"line_number":886,"context_line":"                for replica in replicas:"},{"line_number":887,"context_line":"                    LOG.debug(\u0027Resume replica %s after extend volume %s\u0027,"},{"line_number":888,"context_line":"                              replica, volume.name_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1561c6fd_88d6cfa0","line":885,"in_reply_to":"726faf03_95a1b9d6","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nThe `get_replicas` make sense only for a replicated volume.\nSo we call the `get_replicas` only if `volume.is_replicated()`.\n\nThe `replica.resume()` is safe for not suspended replica - the InfiniSDK contains a logic to check and prevent an error if the replica is active.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":1178,"context_line":"        if group.is_replicated:"},{"line_number":1179,"context_line":"            specs \u003d self._get_group_specs(group)"},{"line_number":1180,"context_line":"            backend \u003d self._get_backend(group, specs)"},{"line_number":1181,"context_line":"            remote_system \u003d backend.system"},{"line_number":1182,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1183,"context_line":"            self.disable_replication(None, group, volumes)"},{"line_number":1184,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"76dbd209_447f035d","line":1181,"updated":"2025-09-26 19:01:55.000000000","message":"Not used","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":1178,"context_line":"        if group.is_replicated:"},{"line_number":1179,"context_line":"            specs \u003d self._get_group_specs(group)"},{"line_number":1180,"context_line":"            backend \u003d self._get_backend(group, specs)"},{"line_number":1181,"context_line":"            remote_system \u003d backend.system"},{"line_number":1182,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1183,"context_line":"            self.disable_replication(None, group, volumes)"},{"line_number":1184,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"72d25746_34733f6a","line":1181,"in_reply_to":"76dbd209_447f035d","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nThe `remote_system` used at the line 1202:\n```\n1202                             LOG.debug(\u0027Delete consistency group %s in remote \u0027\n1203                                       \u0027system %s with serial number %s\u0027,\n1204                                       group_name, remote_system.get_name(),\n1205                                       remote_system.get_serial())\n```\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":1179,"context_line":"            specs \u003d self._get_group_specs(group)"},{"line_number":1180,"context_line":"            backend \u003d self._get_backend(group, specs)"},{"line_number":1181,"context_line":"            remote_system \u003d backend.system"},{"line_number":1182,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1183,"context_line":"            self.disable_replication(None, group, volumes)"},{"line_number":1184,"context_line":"        try:"},{"line_number":1185,"context_line":"            add_volumes_update \u003d self._add_group_members(group, add_volumes)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ce14947b_a3cc893e","line":1182,"updated":"2025-09-26 19:01:55.000000000","message":"(add_volumes or remove_volumes) \u003c- this is represented by \"volumes\" variable in your code so can be simplified.","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"            specs \u003d self._get_group_specs(group)"},{"line_number":1180,"context_line":"            backend \u003d self._get_backend(group, specs)"},{"line_number":1181,"context_line":"            remote_system \u003d backend.system"},{"line_number":1182,"context_line":"        if group.is_replicated and (add_volumes or remove_volumes):"},{"line_number":1183,"context_line":"            self.disable_replication(None, group, volumes)"},{"line_number":1184,"context_line":"        try:"},{"line_number":1185,"context_line":"            add_volumes_update \u003d self._add_group_members(group, add_volumes)"}],"source_content_type":"text/x-python","patch_set":5,"id":"22405447_13799db7","line":1182,"in_reply_to":"ce14947b_a3cc893e","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nFixed in patch set #6.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":1843,"context_line":"        if group and volume_utils.is_group_a_cg_snapshot_type(group):"},{"line_number":1844,"context_line":"            _, updates, _ \u003d self._update_group(group, add_volumes\u003d[volume])"},{"line_number":1845,"context_line":"            if updates:"},{"line_number":1846,"context_line":"                update \u003d updates[0]"},{"line_number":1847,"context_line":"        elif volume.is_replicated():"},{"line_number":1848,"context_line":"            update \u003d self._create_volume_replica(volume)"},{"line_number":1849,"context_line":"        infinidat_volume \u003d self._get_infinidat_volume(volume)"}],"source_content_type":"text/x-python","patch_set":5,"id":"d57e57e3_2c4bc622","line":1846,"updated":"2025-09-26 19:01:55.000000000","message":"Could you add short comment what doesnt it mean updates[0]","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":1843,"context_line":"        if group and volume_utils.is_group_a_cg_snapshot_type(group):"},{"line_number":1844,"context_line":"            _, updates, _ \u003d self._update_group(group, add_volumes\u003d[volume])"},{"line_number":1845,"context_line":"            if updates:"},{"line_number":1846,"context_line":"                update \u003d updates[0]"},{"line_number":1847,"context_line":"        elif volume.is_replicated():"},{"line_number":1848,"context_line":"            update \u003d self._create_volume_replica(volume)"},{"line_number":1849,"context_line":"        infinidat_volume \u003d self._get_infinidat_volume(volume)"}],"source_content_type":"text/x-python","patch_set":5,"id":"e4180922_810b351d","line":1846,"in_reply_to":"d57e57e3_2c4bc622","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nFixed in the patch set #6.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"7d7e000ecd5004f11e470e97ae57024c3acb6c75","unresolved":true,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def failover_host(self, context, volumes, secondary_id\u003dNone, groups\u003dNone):"},{"line_number":1929,"context_line":"        vids \u003d [volume.id for volume in volumes]"},{"line_number":1930,"context_line":"        gids \u003d [group.id for group in groups]"},{"line_number":1931,"context_line":""},{"line_number":1932,"context_line":"        groups_model_update \u003d []"},{"line_number":1933,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"6c40e086_9e654666","line":1930,"updated":"2026-02-20 15:27:16.000000000","message":"The Cinder base signature uses groups\u003dNone as default. Any call that omits groups (including Cinder\u0027s own manager code for non-group backends) will hit TypeError: \u0027NoneType\u0027 object is not iterable immediately.","commit_id":"b3d3d4ab56e96e2180fe2fe8167d0fa8449a6b63"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"7d7e000ecd5004f11e470e97ae57024c3acb6c75","unresolved":true,"context_lines":[{"line_number":1950,"context_line":"            raise exception.InvalidReplicationTarget(reason\u003dreason)"},{"line_number":1951,"context_line":""},{"line_number":1952,"context_line":"        self.active_backend_id \u003d secondary_id"},{"line_number":1953,"context_line":"        self.do_setup(context)"},{"line_number":1954,"context_line":"        self._volume_stats \u003d None"},{"line_number":1955,"context_line":""},{"line_number":1956,"context_line":"        for group in groups:"}],"source_content_type":"text/x-python","patch_set":6,"id":"eec6ee7d_753252cb","line":1953,"updated":"2026-02-20 15:27:16.000000000","message":"do_setup is calling _do_replication_setup()--\u003e creates a new Backend(primary_device, ..) for DEFAULT_BACKEND_ID first — which calls setup_system_object(san_ip, ...) → infinisdk.InfiniBox().login() on the primary system. If the primary is down (the reason for failing over), this raises an InfiniSDKException, causing failover to fail","commit_id":"b3d3d4ab56e96e2180fe2fe8167d0fa8449a6b63"}],"doc/source/configuration/block-storage/drivers/infinidat-volume-driver.rst":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"  .. code-block:: console"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"     $ openstack volume type create volume_type"},{"line_number":277,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-b"},{"line_number":278,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"     $ openstack volume group type create volume_group_type"},{"line_number":281,"context_line":"     $ openstack volume group type set --property consistent_group_snapshot_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_group_type"},{"line_number":282,"context_line":"     $ openstack volume group type set --property consistent_group_replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_group_type"}],"source_content_type":"text/x-rst","patch_set":4,"id":"5a3872a3_13197a1f","line":279,"range":{"start_line":276,"start_character":5,"end_line":279,"end_character":0},"updated":"2025-08-28 13:04:04.000000000","message":"nit: we can combine all 3 in a single command by providing the --property arg in volume type create command","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"  .. code-block:: console"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"     $ openstack volume type create volume_type"},{"line_number":277,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-b"},{"line_number":278,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"     $ openstack volume group type create volume_group_type"},{"line_number":281,"context_line":"     $ openstack volume group type set --property consistent_group_snapshot_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_group_type"},{"line_number":282,"context_line":"     $ openstack volume group type set --property consistent_group_replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_group_type"}],"source_content_type":"text/x-rst","patch_set":4,"id":"68912f51_48e92dc9","line":279,"range":{"start_line":276,"start_character":5,"end_line":279,"end_character":0},"in_reply_to":"5a3872a3_13197a1f","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"  .. code-block:: console"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"     $ openstack volume type create volume_type"},{"line_number":277,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-b"},{"line_number":278,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"     $ openstack volume group type create volume_group_type"},{"line_number":281,"context_line":"     $ openstack volume group type set --property consistent_group_snapshot_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_group_type"},{"line_number":282,"context_line":"     $ openstack volume group type set --property consistent_group_replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_group_type"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fe4b555e_bc7993f0","line":279,"range":{"start_line":276,"start_character":5,"end_line":279,"end_character":0},"in_reply_to":"68912f51_48e92dc9","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":301,"context_line":"  .. code-block:: console"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"     $ openstack volume group failover --backend infinidat-pool-b volume_group"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"After modifying the ``cinder.conf`` file, restart the ``cinder-volume``"},{"line_number":306,"context_line":"service."},{"line_number":307,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"047082be_fb4e7f4c","line":304,"updated":"2025-08-28 13:04:04.000000000","message":"there is no mention of failover-host command for failing over a backend with volumes not part of group","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":301,"context_line":"  .. code-block:: console"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"     $ openstack volume group failover --backend infinidat-pool-b volume_group"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"After modifying the ``cinder.conf`` file, restart the ``cinder-volume``"},{"line_number":306,"context_line":"service."},{"line_number":307,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"5272bf15_85a4a338","line":304,"in_reply_to":"047082be_fb4e7f4c","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":301,"context_line":"  .. code-block:: console"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"     $ openstack volume group failover --backend infinidat-pool-b volume_group"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"After modifying the ``cinder.conf`` file, restart the ``cinder-volume``"},{"line_number":306,"context_line":"service."},{"line_number":307,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ae2b32ee_226b5632","line":304,"in_reply_to":"5272bf15_85a4a338","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":260,"context_line":"  .. code-block:: console"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"     $ openstack volume type create volume_type"},{"line_number":263,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-a"},{"line_number":264,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":265,"context_line":"     $ openstack volume type set --property infinidat:replication_backend\u003dinfinidat-pool-b"},{"line_number":266,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"851565c0_75901afd","line":263,"updated":"2025-09-26 19:01:55.000000000","message":"is it correct cli usage? I thinks  you missed \"volume_type\" as the last parameter which should represent volume type name","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":260,"context_line":"  .. code-block:: console"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"     $ openstack volume type create volume_type"},{"line_number":263,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-a"},{"line_number":264,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":265,"context_line":"     $ openstack volume type set --property infinidat:replication_backend\u003dinfinidat-pool-b"},{"line_number":266,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"65e7f8f0_80ba829b","line":263,"in_reply_to":"851565c0_75901afd","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nFixed in patch set #6.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":36962,"name":"Volodymyr Boiko","display_name":"Volodymyr","email":"volodymyr.boiko@vastdata.com","username":"fnn45"},"change_message_id":"1a13b5802de037c5fb08d14976c99068579a3380","unresolved":true,"context_lines":[{"line_number":262,"context_line":"     $ openstack volume type create volume_type"},{"line_number":263,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-a"},{"line_number":264,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":265,"context_line":"     $ openstack volume type set --property infinidat:replication_backend\u003dinfinidat-pool-b"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"  For better control over replication granularity, the administrator can"},{"line_number":268,"context_line":"  use volume grouping. This enables volume group replication and failover"}],"source_content_type":"text/x-rst","patch_set":5,"id":"273809e0_d5c3eed6","line":265,"updated":"2025-09-26 19:01:55.000000000","message":"the same as above","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"d36aa55b2bf591af0ec557a6e34b26fd69233fd5","unresolved":false,"context_lines":[{"line_number":262,"context_line":"     $ openstack volume type create volume_type"},{"line_number":263,"context_line":"     $ openstack volume type set --property volume_backend_name\u003dinfinidat-pool-a"},{"line_number":264,"context_line":"     $ openstack volume type set --property replication_enabled\u003d\u0027\u003cis\u003e True\u0027 volume_type"},{"line_number":265,"context_line":"     $ openstack volume type set --property infinidat:replication_backend\u003dinfinidat-pool-b"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"  For better control over replication granularity, the administrator can"},{"line_number":268,"context_line":"  use volume grouping. This enables volume group replication and failover"}],"source_content_type":"text/x-rst","patch_set":5,"id":"e971d20e_bc96d8e5","line":265,"in_reply_to":"273809e0_d5c3eed6","updated":"2025-11-05 18:23:02.000000000","message":"Hello Volodymyr,\n\nThank you very much for the review!\n\nFixed in patch set #6.\n\nThank you!","commit_id":"2df85fc0555b69e192c63597b8790e45cfec42f3"}],"doc/source/reference/support-matrix.ini":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":604,"context_line":"driver.huawei_18000\u003dcomplete"},{"line_number":605,"context_line":"driver.huawei_dorado\u003dcomplete"},{"line_number":606,"context_line":"driver.huawei_fusionstorage\u003dmissing"},{"line_number":607,"context_line":"driver.infinidat\u003dcomplete"},{"line_number":608,"context_line":"driver.ibm_ds8k\u003dcomplete"},{"line_number":609,"context_line":"driver.ibm_flashsystem\u003dmissing"},{"line_number":610,"context_line":"driver.ibm_gpfs\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":4,"id":"f48c155c_24871ad0","line":607,"range":{"start_line":607,"start_character":0,"end_line":607,"end_character":25},"updated":"2025-08-28 13:04:04.000000000","message":"there should have been a separate patch for this feature","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":604,"context_line":"driver.huawei_18000\u003dcomplete"},{"line_number":605,"context_line":"driver.huawei_dorado\u003dcomplete"},{"line_number":606,"context_line":"driver.huawei_fusionstorage\u003dmissing"},{"line_number":607,"context_line":"driver.infinidat\u003dcomplete"},{"line_number":608,"context_line":"driver.ibm_ds8k\u003dcomplete"},{"line_number":609,"context_line":"driver.ibm_flashsystem\u003dmissing"},{"line_number":610,"context_line":"driver.ibm_gpfs\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":4,"id":"a2cf342d_535f0dd3","line":607,"range":{"start_line":607,"start_character":0,"end_line":607,"end_character":25},"in_reply_to":"f1fbf0d3_9deb6463","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":604,"context_line":"driver.huawei_18000\u003dcomplete"},{"line_number":605,"context_line":"driver.huawei_dorado\u003dcomplete"},{"line_number":606,"context_line":"driver.huawei_fusionstorage\u003dmissing"},{"line_number":607,"context_line":"driver.infinidat\u003dcomplete"},{"line_number":608,"context_line":"driver.ibm_ds8k\u003dcomplete"},{"line_number":609,"context_line":"driver.ibm_flashsystem\u003dmissing"},{"line_number":610,"context_line":"driver.ibm_gpfs\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":4,"id":"f1fbf0d3_9deb6463","line":607,"range":{"start_line":607,"start_character":0,"end_line":607,"end_character":25},"in_reply_to":"f48c155c_24871ad0","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"}],"releasenotes/notes/bp-infinidat-add-replication-a2d92ac6de0add9a.yaml":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for replication in the Infinidat Cinder driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The implementation supports active-active synchronous replication"},{"line_number":7,"context_line":"    for both individual volumes and volume groups. This allows users to"},{"line_number":8,"context_line":"    create replicated volumes or groups with zero Recovery Point"},{"line_number":9,"context_line":"    Objective (RPO) and Recovery Time Objective (RTO), leveraging"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"c4a86184_f875436b","line":6,"range":{"start_line":6,"start_character":32,"end_line":6,"end_character":45},"updated":"2025-08-28 13:04:04.000000000","message":"we mention active-active here but neither the infinidat driver supports active-active configuration[1] nor does it implement the failover method[2] called in case when active-active is turned on.\n\n[1] https://docs.openstack.org/cinder/latest/reference/support-matrix.html#operation_active_active_ha\n[2] https://github.com/openstack/cinder/blob/89709ef589b74506885c72e42cad57eb8dedfb56/cinder/volume/manager.py#L4516-L4518","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for replication in the Infinidat Cinder driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The implementation supports active-active synchronous replication"},{"line_number":7,"context_line":"    for both individual volumes and volume groups. This allows users to"},{"line_number":8,"context_line":"    create replicated volumes or groups with zero Recovery Point"},{"line_number":9,"context_line":"    Objective (RPO) and Recovery Time Objective (RTO), leveraging"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"22a5fae8_0119ce5d","line":6,"range":{"start_line":6,"start_character":32,"end_line":6,"end_character":45},"in_reply_to":"be35aa8e_1ee2813a","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for replication in the Infinidat Cinder driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The implementation supports active-active synchronous replication"},{"line_number":7,"context_line":"    for both individual volumes and volume groups. This allows users to"},{"line_number":8,"context_line":"    create replicated volumes or groups with zero Recovery Point"},{"line_number":9,"context_line":"    Objective (RPO) and Recovery Time Objective (RTO), leveraging"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"be35aa8e_1ee2813a","line":6,"range":{"start_line":6,"start_character":32,"end_line":6,"end_character":45},"in_reply_to":"c4a86184_f875436b","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nActive-active in the commit message refers to the Infinidat storage-side replication API. It is not related to the active-active OpenStack configuration.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The implementation supports active-active synchronous replication"},{"line_number":7,"context_line":"    for both individual volumes and volume groups. This allows users to"},{"line_number":8,"context_line":"    create replicated volumes or groups with zero Recovery Point"},{"line_number":9,"context_line":"    Objective (RPO) and Recovery Time Objective (RTO), leveraging"},{"line_number":10,"context_line":"    Infinidat\u0027s native high-availability features."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    Replication is enabled via volume types and group types by setting"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3aeb26a4_ec26f12d","line":9,"range":{"start_line":8,"start_character":45,"end_line":9,"end_character":53},"updated":"2025-08-28 13:04:04.000000000","message":"the failover/failback mechanisms in cinder are manually triggered so does the data path from libvirt guest to replica volume automatically switches from primary to secondary cluster when the primary cluster is down.","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The implementation supports active-active synchronous replication"},{"line_number":7,"context_line":"    for both individual volumes and volume groups. This allows users to"},{"line_number":8,"context_line":"    create replicated volumes or groups with zero Recovery Point"},{"line_number":9,"context_line":"    Objective (RPO) and Recovery Time Objective (RTO), leveraging"},{"line_number":10,"context_line":"    Infinidat\u0027s native high-availability features."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    Replication is enabled via volume types and group types by setting"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"64f42b25_95646acb","line":9,"range":{"start_line":8,"start_character":45,"end_line":9,"end_character":53},"in_reply_to":"3aeb26a4_ec26f12d","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The implementation supports active-active synchronous replication"},{"line_number":7,"context_line":"    for both individual volumes and volume groups. This allows users to"},{"line_number":8,"context_line":"    create replicated volumes or groups with zero Recovery Point"},{"line_number":9,"context_line":"    Objective (RPO) and Recovery Time Objective (RTO), leveraging"},{"line_number":10,"context_line":"    Infinidat\u0027s native high-availability features."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    Replication is enabled via volume types and group types by setting"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"f8a732af_0dd27275","line":9,"range":{"start_line":8,"start_character":45,"end_line":9,"end_character":53},"in_reply_to":"64f42b25_95646acb","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":12,"context_line":"    Replication is enabled via volume types and group types by setting"},{"line_number":13,"context_line":"    the following extra specs:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - ``replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for volume types"},{"line_number":16,"context_line":"    - ``consistent_group_replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for group types"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    Additionally, the backend-specific extra spec"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"1d371ec5_66dfc442","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":30},"updated":"2025-08-28 13:04:04.000000000","message":"remove the escape character as it\u0027s being added in the final output leading to operators doing wrong configurations\n\nhttps://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_38e/openstack/38efd023601c4f9488c13ac636c557e4/docs/unreleased.html","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":12,"context_line":"    Replication is enabled via volume types and group types by setting"},{"line_number":13,"context_line":"    the following extra specs:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - ``replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for volume types"},{"line_number":16,"context_line":"    - ``consistent_group_replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for group types"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    Additionally, the backend-specific extra spec"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"a1356209_b90c0d04","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":30},"in_reply_to":"1d371ec5_66dfc442","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    Replication is enabled via volume types and group types by setting"},{"line_number":13,"context_line":"    the following extra specs:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - ``replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for volume types"},{"line_number":16,"context_line":"    - ``consistent_group_replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for group types"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    Additionally, the backend-specific extra spec"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"759e9e12_de02ef9d","line":15,"range":{"start_line":15,"start_character":29,"end_line":15,"end_character":30},"in_reply_to":"a1356209_b90c0d04","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"86c710210efe0e1cb9980227d1d331635ee56474","unresolved":true,"context_lines":[{"line_number":13,"context_line":"    the following extra specs:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - ``replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for volume types"},{"line_number":16,"context_line":"    - ``consistent_group_replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for group types"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    Additionally, the backend-specific extra spec"},{"line_number":19,"context_line":"    ``infinidat:replication_backend`` must be set to the name of the"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"c4472f90_831d3554","line":16,"range":{"start_line":16,"start_character":46,"end_line":16,"end_character":47},"updated":"2025-08-28 13:04:04.000000000","message":"same","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"15f12185b0fbbc3243fdd9d378ccb5b4116c555e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    the following extra specs:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - ``replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for volume types"},{"line_number":16,"context_line":"    - ``consistent_group_replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for group types"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    Additionally, the backend-specific extra spec"},{"line_number":19,"context_line":"    ``infinidat:replication_backend`` must be set to the name of the"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"a9acc2b1_ef47647d","line":16,"range":{"start_line":16,"start_character":46,"end_line":16,"end_character":47},"in_reply_to":"2b248bda_ab9a0df9","updated":"2025-11-06 10:24:08.000000000","message":"Acknowledged","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"},{"author":{"_account_id":35075,"name":"Alexander Deiter","email":"adeiter@infinidat.com","username":"adeiter"},"change_message_id":"8a37018cb711cbe1ad643c35887eed469ee862e4","unresolved":true,"context_lines":[{"line_number":13,"context_line":"    the following extra specs:"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - ``replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for volume types"},{"line_number":16,"context_line":"    - ``consistent_group_replication_enabled\u003d\u0027\\\u003cis\u003e True\u0027`` for group types"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    Additionally, the backend-specific extra spec"},{"line_number":19,"context_line":"    ``infinidat:replication_backend`` must be set to the name of the"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"2b248bda_ab9a0df9","line":16,"range":{"start_line":16,"start_character":46,"end_line":16,"end_character":47},"in_reply_to":"c4472f90_831d3554","updated":"2025-09-22 14:41:14.000000000","message":"Hello Rajat,\n\nThank you very much for the review!\n\nFixed in the patch set #5.\n\nThank you!","commit_id":"0b6ea7c117d7598754a03f57be278a39deca404b"}]}
