)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34815,"name":"Aneesh Pachilangottil","email":"aneesh.p@fungible.com","username":"aneeeshp1"},"change_message_id":"304da7dfef042ccf1cd4175bc6c2cd2314ae951c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"fc9d2a42_ee1eead7","updated":"2022-06-09 02:54:00.000000000","message":"Got an error when I tried to test this change in a devstack environment. Details are there in the comment.","commit_id":"1ca3609afa98130755d27c21bdef3cb0949908ce"},{"author":{"_account_id":34815,"name":"Aneesh Pachilangottil","email":"aneesh.p@fungible.com","username":"aneeeshp1"},"change_message_id":"162903a6318ba447f4894d14e38f1e3f65061d07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4867a8ed_2893a4be","updated":"2022-06-14 02:07:22.000000000","message":"Tested in devstack environment. Tested use_multipath\u003dTrue and use_multipath\u003dFalse path. Attach volume and detach volume worked as expected. Nvme controllers were disconnected during volume detach (verified by running dmesg).","commit_id":"e20e29a40140821cf2a79bdfefe9fdc5066c2960"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6ce729b287ac7d5bbf0e882378e07ba5e769d618","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e28c1cf7_b2544acc","in_reply_to":"4867a8ed_2893a4be","updated":"2022-06-14 10:32:12.000000000","message":"Thank you for testing it!","commit_id":"e20e29a40140821cf2a79bdfefe9fdc5066c2960"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"467bb61baacf29d0f1f18d728ed4ce05f4a53f29","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"91ec71b3_a17029b5","updated":"2022-07-26 04:35:54.000000000","message":"@Rajat: I think the release note is on https://review.opendev.org/c/openstack/os-brick/+/836063 , which closes this bug.\n\nCode and tests look fine to me, but I\u0027m not convinced I understand this enough to +2.","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"be38f9513e6272621b61404889e834296a559386","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"e7207b77_b40ee52d","updated":"2022-07-25 13:29:50.000000000","message":"Not sure if we need a releasenote here, else LGTM.","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"2c8207391a7b5c42473570e804e328ee70238f43","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"f12d9667_e319db11","in_reply_to":"91ec71b3_a17029b5","updated":"2022-07-26 07:58:12.000000000","message":"Ack, thanks","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"380c612f491d4ef6f67da92791b73edc3672b2dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"96a932e6_573ab42f","in_reply_to":"e7207b77_b40ee52d","updated":"2022-07-26 14:26:46.000000000","message":"No release note here, because it\u0027s just a partial fix for bug #1961102.  The next patch completes the fix on the os-brick side, so it has the release note.","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"db1a635b50d3f88e09ad4dc5df2b664be04a56d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"a3fec83f_3cd7c452","updated":"2022-07-26 18:53:17.000000000","message":"LGTM!","commit_id":"05a4c05c14506df40be93f8d949a4fef4b746deb"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"167aa7bc486231fa3cbda7e58346c150ad11f3d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"e9a13d59_e2abeac3","updated":"2022-07-26 18:12:30.000000000","message":"Revisions LGTM.","commit_id":"05a4c05c14506df40be93f8d949a4fef4b746deb"}],"os_brick/initiator/connectors/nvmeof.py":[{"author":{"_account_id":34815,"name":"Aneesh Pachilangottil","email":"aneesh.p@fungible.com","username":"aneeeshp1"},"change_message_id":"304da7dfef042ccf1cd4175bc6c2cd2314ae951c","unresolved":true,"context_lines":[{"line_number":813,"context_line":"    # #######  Connect Volume methods ########"},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"    @utils.trace"},{"line_number":816,"context_line":"    @utils.connect_volume_prepare_result"},{"line_number":817,"context_line":"    @synchronized(\u0027connect_volume\u0027, external\u003dTrue)"},{"line_number":818,"context_line":"    @NVMeOFConnProps.from_dictionary_parameter"},{"line_number":819,"context_line":"    def connect_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"1fe0ed8c_99cc82a8","line":816,"updated":"2022-06-09 02:54:00.000000000","message":"Tried to test this change in a devstack environment. Getting this error in the nova compute log.\n\n\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova   File \"/opt/stack/nova/nova/virt/libvirt/driver.py\", line 58, in \u003cmodule\u003e\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova     from os_brick.initiator import connector\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova   File \"/usr/local/lib/python3.8/dist-packages/os_brick/initiator/connector.py\", line 193, in \u003cmodule\u003e\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova     _set_aliases()\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova   File \"/usr/local/lib/python3.8/dist-packages/os_brick/initiator/connector.py\", line 190, in _set_aliases\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova     globals()[_name] \u003d importutils.import_class(item)\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova   File \"/usr/local/lib/python3.8/dist-packages/oslo_utils/importutils.py\", line 30, in import_class\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova     __import__(mod_str)\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova   File \"/usr/local/lib/python3.8/dist-packages/os_brick/initiator/connectors/nvmeof.py\", line 660, in \u003cmodule\u003e\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova     class NVMeOFConnector(base.BaseLinuxConnector):\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova   File \"/usr/local/lib/python3.8/dist-packages/os_brick/initiator/connectors/nvmeof.py\", line 816, in NVMeOFConnector\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova     @utils.connect_volume_prepare_result\nJun 09 02:22:02 localadmin nova-compute[408740]: ERROR nova AttributeError: module \u0027os_brick.utils\u0027 has no attribute \u0027connect_volume_prepare_result\u0027","commit_id":"1ca3609afa98130755d27c21bdef3cb0949908ce"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"af29ce4f100916d6a27e06c3120e64eef32d6d78","unresolved":false,"context_lines":[{"line_number":813,"context_line":"    # #######  Connect Volume methods ########"},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"    @utils.trace"},{"line_number":816,"context_line":"    @utils.connect_volume_prepare_result"},{"line_number":817,"context_line":"    @synchronized(\u0027connect_volume\u0027, external\u003dTrue)"},{"line_number":818,"context_line":"    @NVMeOFConnProps.from_dictionary_parameter"},{"line_number":819,"context_line":"    def connect_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"a16a909e_e165407d","line":816,"in_reply_to":"1fe0ed8c_99cc82a8","updated":"2022-06-10 14:14:43.000000000","message":"It seems like you may have applied only this specific patch to os-brick and not the whole series, since that method was added in a prior patch on the 26th of May (https://review.opendev.org/c/openstack/os-brick/+/836391/10/os_brick/utils.py#266)\n\nYou should be able to have devstack to apply it automatically by adding to your local.conf file:\n\nOS_BRICK_REPO\u003dhttps://review.openstack.org/p/openstack/os-brick\nOS_BRICK_BRANCH\u003drefs/changes/62/836062/6\nLIBS_FROM_GIT\u003dos-brick","commit_id":"1ca3609afa98130755d27c21bdef3cb0949908ce"},{"author":{"_account_id":34815,"name":"Aneesh Pachilangottil","email":"aneesh.p@fungible.com","username":"aneeeshp1"},"change_message_id":"162903a6318ba447f4894d14e38f1e3f65061d07","unresolved":false,"context_lines":[{"line_number":813,"context_line":"    # #######  Connect Volume methods ########"},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"    @utils.trace"},{"line_number":816,"context_line":"    @utils.connect_volume_prepare_result"},{"line_number":817,"context_line":"    @synchronized(\u0027connect_volume\u0027, external\u003dTrue)"},{"line_number":818,"context_line":"    @NVMeOFConnProps.from_dictionary_parameter"},{"line_number":819,"context_line":"    def connect_volume("}],"source_content_type":"text/x-python","patch_set":6,"id":"b7fd2d57_45b0f2d3","line":816,"in_reply_to":"a16a909e_e165407d","updated":"2022-06-14 02:07:22.000000000","message":"Thank you for the suggestion. That helped.","commit_id":"1ca3609afa98130755d27c21bdef3cb0949908ce"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"467bb61baacf29d0f1f18d728ed4ce05f4a53f29","unresolved":true,"context_lines":[{"line_number":209,"context_line":"    def get_all_namespaces_ctrl_paths(self) -\u003e List[str]:"},{"line_number":210,"context_line":"        \"\"\"Return all nvme sysfs control paths for this portal."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        The basename of the patch can be single volume or a channel to an ANA"},{"line_number":213,"context_line":"        volume."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        For example for the nvme1 controller we could return:"}],"source_content_type":"text/x-python","patch_set":11,"id":"e0a0fe27_042d5ed0","line":212,"range":{"start_line":212,"start_character":28,"end_line":212,"end_character":33},"updated":"2022-07-26 04:35:54.000000000","message":"path","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"380c612f491d4ef6f67da92791b73edc3672b2dc","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def get_all_namespaces_ctrl_paths(self) -\u003e List[str]:"},{"line_number":210,"context_line":"        \"\"\"Return all nvme sysfs control paths for this portal."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        The basename of the patch can be single volume or a channel to an ANA"},{"line_number":213,"context_line":"        volume."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        For example for the nvme1 controller we could return:"}],"source_content_type":"text/x-python","patch_set":11,"id":"003f41a2_e41fddd2","line":212,"range":{"start_line":212,"start_character":28,"end_line":212,"end_character":33},"in_reply_to":"e0a0fe27_042d5ed0","updated":"2022-07-26 14:26:46.000000000","message":"Done","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"}],"os_brick/tests/initiator/connectors/test_nvmeof.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"be38f9513e6272621b61404889e834296a559386","unresolved":true,"context_lines":[{"line_number":291,"context_line":"                \u0027/sys/class/nvme-fabrics/ctl/nvme0/nvme0n2\u0027], False))"},{"line_number":292,"context_line":"    @ddt.unpack"},{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"c309c7e8_518fd8ae","line":294,"range":{"start_line":294,"start_character":29,"end_line":294,"end_character":32},"updated":"2022-07-25 13:29:50.000000000","message":"nit: test__can_disconnect_no_or_1_namespaces","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"2c8207391a7b5c42473570e804e328ee70238f43","unresolved":true,"context_lines":[{"line_number":291,"context_line":"                \u0027/sys/class/nvme-fabrics/ctl/nvme0/nvme0n2\u0027], False))"},{"line_number":292,"context_line":"    @ddt.unpack"},{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"a6ae6d22_406010d8","line":294,"range":{"start_line":294,"start_character":29,"end_line":294,"end_character":32},"in_reply_to":"53966119_3b2f20ca","updated":"2022-07-26 07:58:12.000000000","message":"This sounds better","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"380c612f491d4ef6f67da92791b73edc3672b2dc","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                \u0027/sys/class/nvme-fabrics/ctl/nvme0/nvme0n2\u0027], False))"},{"line_number":292,"context_line":"    @ddt.unpack"},{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"9c4e5e7d_6a1bca34","line":294,"range":{"start_line":294,"start_character":29,"end_line":294,"end_character":32},"in_reply_to":"a6ae6d22_406010d8","updated":"2022-07-26 14:26:46.000000000","message":"Done","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"467bb61baacf29d0f1f18d728ed4ce05f4a53f29","unresolved":true,"context_lines":[{"line_number":291,"context_line":"                \u0027/sys/class/nvme-fabrics/ctl/nvme0/nvme0n2\u0027], False))"},{"line_number":292,"context_line":"    @ddt.unpack"},{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"53966119_3b2f20ca","line":294,"range":{"start_line":294,"start_character":29,"end_line":294,"end_character":32},"in_reply_to":"c309c7e8_518fd8ae","updated":"2022-07-26 04:35:54.000000000","message":"maybe better would be \"test__can_disconnect_not_1_namespace\" ?","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"be38f9513e6272621b61404889e834296a559386","unresolved":true,"context_lines":[{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"},{"line_number":298,"context_line":"        mock_paths.return_value \u003d ctrl_paths"},{"line_number":299,"context_line":"        res \u003d self.portal.can_disconnect()"}],"source_content_type":"text/x-python","patch_set":11,"id":"710d20ee_112391d1","line":296,"range":{"start_line":296,"start_character":43,"end_line":296,"end_character":48},"updated":"2022-07-25 13:29:50.000000000","message":"nit: when we have no namespace or 1 namespace in subsystem","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"2c8207391a7b5c42473570e804e328ee70238f43","unresolved":true,"context_lines":[{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"},{"line_number":298,"context_line":"        mock_paths.return_value \u003d ctrl_paths"},{"line_number":299,"context_line":"        res \u003d self.portal.can_disconnect()"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff3caf02_3afd82d9","line":296,"range":{"start_line":296,"start_character":43,"end_line":296,"end_character":48},"in_reply_to":"3d7597d5_f6a110ce","updated":"2022-07-26 07:58:12.000000000","message":"Ah yes, i thought this was the case when we had 0/1 namespace, looking again we have 0 or more than 1 namespaces so not what i thought.\nThe current description seems good then.","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"467bb61baacf29d0f1f18d728ed4ce05f4a53f29","unresolved":true,"context_lines":[{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"},{"line_number":298,"context_line":"        mock_paths.return_value \u003d ctrl_paths"},{"line_number":299,"context_line":"        res \u003d self.portal.can_disconnect()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3d7597d5_f6a110ce","line":296,"range":{"start_line":296,"start_character":43,"end_line":296,"end_character":48},"in_reply_to":"710d20ee_112391d1","updated":"2022-07-26 04:35:54.000000000","message":"I think what\u0027s happening here is that the easy case is when a controller has one namespace, then you just disconnect it; but if controller has two namespaces, you can\u0027t disconnect it because you may break a connection to something in use, and if it\u0027s got no namespaces, you can just go ahead and disconnect it.","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"380c612f491d4ef6f67da92791b73edc3672b2dc","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    @mock.patch.object(nvmeof.Portal, \u0027get_all_namespaces_ctrl_paths\u0027)"},{"line_number":294,"context_line":"    def test__can_disconnect_no_1_namespaces("},{"line_number":295,"context_line":"            self, ctrl_paths, expected, mock_paths):"},{"line_number":296,"context_line":"        \"\"\"Check if can disconnect when we don\u0027t have 1 namespace in subsys.\"\"\""},{"line_number":297,"context_line":"        self.portal.controller \u003d \u0027nvme0\u0027"},{"line_number":298,"context_line":"        mock_paths.return_value \u003d ctrl_paths"},{"line_number":299,"context_line":"        res \u003d self.portal.can_disconnect()"}],"source_content_type":"text/x-python","patch_set":11,"id":"a1a7cf05_65f7d432","line":296,"range":{"start_line":296,"start_character":43,"end_line":296,"end_character":48},"in_reply_to":"ff3caf02_3afd82d9","updated":"2022-07-26 14:26:46.000000000","message":"Yes, Brian is right, that was the intention:\n\n0 \u003d\u003e Disconnect\n2 or more \u003d\u003e Leave","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"be38f9513e6272621b61404889e834296a559386","unresolved":true,"context_lines":[{"line_number":1974,"context_line":"        mock_set_portals.assert_has_calls((mock.call(), mock.call()))"},{"line_number":1975,"context_line":"        self.assertEqual(4, mock_disconnect.call_count)"},{"line_number":1976,"context_line":"        mock_disconnect.assert_has_calls(("},{"line_number":1977,"context_line":"            mock.call(conn_props.targets[0].portals[0]),"},{"line_number":1978,"context_line":"            mock.call(conn_props.targets[0].portals[1]),"},{"line_number":1979,"context_line":"            mock.call(conn_props.targets[1].portals[0]),"},{"line_number":1980,"context_line":"            mock.call(conn_props.targets[1].portals[1])"},{"line_number":1981,"context_line":"        ))"},{"line_number":1982,"context_line":"        self.assertFalse(bool(exc))"},{"line_number":1983,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"d41a5655_3a15d68d","line":1980,"range":{"start_line":1977,"start_character":12,"end_line":1980,"end_character":55},"updated":"2022-07-25 13:29:50.000000000","message":"Current one looks good, just an alternative way to save LOC\n\ntuple([mock.call(conn_props.targets[i].portals[j] for i in range(2) for j in range(2)])","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"380c612f491d4ef6f67da92791b73edc3672b2dc","unresolved":false,"context_lines":[{"line_number":1974,"context_line":"        mock_set_portals.assert_has_calls((mock.call(), mock.call()))"},{"line_number":1975,"context_line":"        self.assertEqual(4, mock_disconnect.call_count)"},{"line_number":1976,"context_line":"        mock_disconnect.assert_has_calls(("},{"line_number":1977,"context_line":"            mock.call(conn_props.targets[0].portals[0]),"},{"line_number":1978,"context_line":"            mock.call(conn_props.targets[0].portals[1]),"},{"line_number":1979,"context_line":"            mock.call(conn_props.targets[1].portals[0]),"},{"line_number":1980,"context_line":"            mock.call(conn_props.targets[1].portals[1])"},{"line_number":1981,"context_line":"        ))"},{"line_number":1982,"context_line":"        self.assertFalse(bool(exc))"},{"line_number":1983,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"61957355_0830f927","line":1980,"range":{"start_line":1977,"start_character":12,"end_line":1980,"end_character":55},"in_reply_to":"d41a5655_3a15d68d","updated":"2022-07-26 14:26:46.000000000","message":"For code I would go with that, but for tests I find that writing it like this makes it easier to read for me.","commit_id":"fdd023665f236aaf4e4c494a3db5faec59dad334"}]}
