)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"66a358904af122d841b469454768ed3d0734965b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Detach is broken for multi-attached fs-based volumes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fixed an issue with detaching multi-attached fs-based volumes."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ia91b63c0676f42ad8a7a0d16e6870bafc2ee7675"},{"line_number":12,"context_line":"Closes-Bug: 1888022"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bf51134e_3a5d8be9","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":62},"updated":"2020-07-21 11:58:28.000000000","message":"Can you expand on this, highlighting that it\u0027s due to the _HostMountStateManager tracking mounts through calls to _connect_volume and _disconnect_volume?","commit_id":"02281ac4153597fe633ba6a0b490925a513f70d3"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"0fb492602c6c50b2bc0197bcb7ebc50a15ae5f3c","unresolved":false,"context_lines":[{"line_number":9121,"context_line":"        mock_encryptor.attach_volume.assert_called_once_with("},{"line_number":9122,"context_line":"            self.context, **encryption)"},{"line_number":9123,"context_line":""},{"line_number":9124,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9125,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9126,"context_line":"    def test_should_disconnect_target_multi_attach_mounted_filesystem_driver("},{"line_number":9127,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9128,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_73a9047a","line":9125,"range":{"start_line":9124,"start_character":0,"end_line":9125,"end_character":45},"updated":"2020-07-27 21:25:50.000000000","message":"You don\u0027t need to mock these for this test.","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"40b98ba302fe2145e7c8037dd126144769d965e0","unresolved":false,"context_lines":[{"line_number":9121,"context_line":"        mock_encryptor.attach_volume.assert_called_once_with("},{"line_number":9122,"context_line":"            self.context, **encryption)"},{"line_number":9123,"context_line":""},{"line_number":9124,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9125,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9126,"context_line":"    def test_should_disconnect_target_multi_attach_mounted_filesystem_driver("},{"line_number":9127,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9128,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_39948b8b","line":9125,"range":{"start_line":9124,"start_character":0,"end_line":9125,"end_character":45},"in_reply_to":"9f560f44_73a9047a","updated":"2020-07-27 22:18:35.000000000","message":"Done","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"0fb492602c6c50b2bc0197bcb7ebc50a15ae5f3c","unresolved":false,"context_lines":[{"line_number":9129,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9130,"context_line":"            spec\u003dfs_drivers.LibvirtMountedFileSystemVolumeDriver)"},{"line_number":9131,"context_line":"        multiattach \u003d True"},{"line_number":9132,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9133,"context_line":"        attachments \u003d ("},{"line_number":9134,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9135,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9136,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027}),"},{"line_number":9137,"context_line":"             (\u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9138,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9139,"context_line":"               \u0027attachment_id\u0027: u\u0027d6128a7b-19c8-4a3e-8036-011396df95ac\u0027})])"},{"line_number":9140,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9141,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9142,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9143,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9144,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9145,"context_line":"            \u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9146,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9147,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9148,"context_line":"            self.context,"},{"line_number":9149,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9150,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9151,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9152,"context_line":"        self.assertTrue(result)"},{"line_number":9153,"context_line":""},{"line_number":9154,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9155,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_f3b6b4d9","line":9152,"range":{"start_line":9132,"start_character":8,"end_line":9152,"end_character":31},"updated":"2020-07-27 21:25:50.000000000","message":"You can replace all of this with:\n\n    self.assertTrue(drvr._should_disconnect_target(\n        self.context, None, True, volume_driver, None))","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"40b98ba302fe2145e7c8037dd126144769d965e0","unresolved":false,"context_lines":[{"line_number":9129,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9130,"context_line":"            spec\u003dfs_drivers.LibvirtMountedFileSystemVolumeDriver)"},{"line_number":9131,"context_line":"        multiattach \u003d True"},{"line_number":9132,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9133,"context_line":"        attachments \u003d ("},{"line_number":9134,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9135,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9136,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027}),"},{"line_number":9137,"context_line":"             (\u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9138,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9139,"context_line":"               \u0027attachment_id\u0027: u\u0027d6128a7b-19c8-4a3e-8036-011396df95ac\u0027})])"},{"line_number":9140,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9141,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9142,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9143,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9144,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9145,"context_line":"            \u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9146,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9147,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9148,"context_line":"            self.context,"},{"line_number":9149,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9150,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9151,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9152,"context_line":"        self.assertTrue(result)"},{"line_number":9153,"context_line":""},{"line_number":9154,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9155,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_9991579d","line":9152,"range":{"start_line":9132,"start_character":8,"end_line":9152,"end_character":31},"in_reply_to":"9f560f44_f3b6b4d9","updated":"2020-07-27 22:18:35.000000000","message":"Done","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"0fb492602c6c50b2bc0197bcb7ebc50a15ae5f3c","unresolved":false,"context_lines":[{"line_number":9151,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9152,"context_line":"        self.assertTrue(result)"},{"line_number":9153,"context_line":""},{"line_number":9154,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9155,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9156,"context_line":"    def test_should_disconnect_target_single_attach_mounted_filesystem_driver("},{"line_number":9157,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9158,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_73c2a435","line":9155,"range":{"start_line":9154,"start_character":0,"end_line":9155,"end_character":45},"updated":"2020-07-27 21:25:50.000000000","message":"You don\u0027t need to mock these out.","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"40b98ba302fe2145e7c8037dd126144769d965e0","unresolved":false,"context_lines":[{"line_number":9151,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9152,"context_line":"        self.assertTrue(result)"},{"line_number":9153,"context_line":""},{"line_number":9154,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9155,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9156,"context_line":"    def test_should_disconnect_target_single_attach_mounted_filesystem_driver("},{"line_number":9157,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9158,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_798e0379","line":9155,"range":{"start_line":9154,"start_character":0,"end_line":9155,"end_character":45},"in_reply_to":"9f560f44_73c2a435","updated":"2020-07-27 22:18:35.000000000","message":"Done","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"0fb492602c6c50b2bc0197bcb7ebc50a15ae5f3c","unresolved":false,"context_lines":[{"line_number":9159,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9160,"context_line":"            spec\u003dfs_drivers.LibvirtMountedFileSystemVolumeDriver)"},{"line_number":9161,"context_line":"        multiattach \u003d False"},{"line_number":9162,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9163,"context_line":"        attachments \u003d ("},{"line_number":9164,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9165,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9166,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027})])"},{"line_number":9167,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9168,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9169,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9170,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9171,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9172,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9173,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9174,"context_line":"            self.context,"},{"line_number":9175,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9176,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9177,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9178,"context_line":"        self.assertTrue(result)"},{"line_number":9179,"context_line":""},{"line_number":9180,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9181,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_93c5b83f","line":9178,"range":{"start_line":9162,"start_character":0,"end_line":9178,"end_character":31},"updated":"2020-07-27 21:25:50.000000000","message":"You can replace all of this with:\n\n    self.assertTrue(drvr._should_disconnect_target(\n        self.context, None, False, volume_driver, None))","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"40b98ba302fe2145e7c8037dd126144769d965e0","unresolved":false,"context_lines":[{"line_number":9159,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9160,"context_line":"            spec\u003dfs_drivers.LibvirtMountedFileSystemVolumeDriver)"},{"line_number":9161,"context_line":"        multiattach \u003d False"},{"line_number":9162,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9163,"context_line":"        attachments \u003d ("},{"line_number":9164,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9165,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9166,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027})])"},{"line_number":9167,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9168,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9169,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9170,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9171,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9172,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9173,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9174,"context_line":"            self.context,"},{"line_number":9175,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9176,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9177,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9178,"context_line":"        self.assertTrue(result)"},{"line_number":9179,"context_line":""},{"line_number":9180,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9181,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_b9ed3b27","line":9178,"range":{"start_line":9162,"start_character":0,"end_line":9178,"end_character":31},"in_reply_to":"9f560f44_93c5b83f","updated":"2020-07-27 22:18:35.000000000","message":"Done","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"0fb492602c6c50b2bc0197bcb7ebc50a15ae5f3c","unresolved":false,"context_lines":[{"line_number":9177,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9178,"context_line":"        self.assertTrue(result)"},{"line_number":9179,"context_line":""},{"line_number":9180,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9181,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9182,"context_line":"    def test_should_disconnect_target_multi_attach_volume_driver("},{"line_number":9183,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9184,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":9185,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9186,"context_line":"            spec\u003dvolume_drivers.LibvirtVolumeDriver)"},{"line_number":9187,"context_line":"        multiattach \u003d True"},{"line_number":9188,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9189,"context_line":"        attachments \u003d ("},{"line_number":9190,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9191,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9192,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027}),"},{"line_number":9193,"context_line":"             (\u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9194,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9195,"context_line":"               \u0027attachment_id\u0027: u\u0027d6128a7b-19c8-4a3e-8036-011396df95ac\u0027})])"},{"line_number":9196,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9197,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9198,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9199,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9200,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9201,"context_line":"            \u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9202,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9203,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9204,"context_line":"            self.context,"},{"line_number":9205,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9206,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9207,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9208,"context_line":"        self.assertFalse(result)"},{"line_number":9209,"context_line":""},{"line_number":9210,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9211,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_b63b8a9a","line":9208,"range":{"start_line":9180,"start_character":0,"end_line":9208,"end_character":32},"updated":"2020-07-27 21:25:50.000000000","message":"This is duplicating test_disconnect_multiattach_multi_connection right?","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"40b98ba302fe2145e7c8037dd126144769d965e0","unresolved":false,"context_lines":[{"line_number":9177,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9178,"context_line":"        self.assertTrue(result)"},{"line_number":9179,"context_line":""},{"line_number":9180,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9181,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9182,"context_line":"    def test_should_disconnect_target_multi_attach_volume_driver("},{"line_number":9183,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9184,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":9185,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9186,"context_line":"            spec\u003dvolume_drivers.LibvirtVolumeDriver)"},{"line_number":9187,"context_line":"        multiattach \u003d True"},{"line_number":9188,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9189,"context_line":"        attachments \u003d ("},{"line_number":9190,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9191,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9192,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027}),"},{"line_number":9193,"context_line":"             (\u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9194,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9195,"context_line":"               \u0027attachment_id\u0027: u\u0027d6128a7b-19c8-4a3e-8036-011396df95ac\u0027})])"},{"line_number":9196,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9197,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9198,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9199,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9200,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9201,"context_line":"            \u002700803490-f768-4049-aa7d-151f54e6311e\u0027,"},{"line_number":9202,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9203,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9204,"context_line":"            self.context,"},{"line_number":9205,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9206,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9207,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9208,"context_line":"        self.assertFalse(result)"},{"line_number":9209,"context_line":""},{"line_number":9210,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9211,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_59dcdf73","line":9208,"range":{"start_line":9180,"start_character":0,"end_line":9208,"end_character":32},"in_reply_to":"9f560f44_b63b8a9a","updated":"2020-07-27 22:18:35.000000000","message":"Done","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"0fb492602c6c50b2bc0197bcb7ebc50a15ae5f3c","unresolved":false,"context_lines":[{"line_number":9207,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9208,"context_line":"        self.assertFalse(result)"},{"line_number":9209,"context_line":""},{"line_number":9210,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9211,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9212,"context_line":"    def test_should_disconnect_target_single_attach_volume_driver("},{"line_number":9213,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9214,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":9215,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9216,"context_line":"            spec\u003dvolume_drivers.LibvirtVolumeDriver)"},{"line_number":9217,"context_line":"        multiattach \u003d False"},{"line_number":9218,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9219,"context_line":"        attachments \u003d ("},{"line_number":9220,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9221,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9222,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027})])"},{"line_number":9223,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9224,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9225,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9226,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9227,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9228,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9229,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9230,"context_line":"            self.context,"},{"line_number":9231,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9232,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9233,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9234,"context_line":"        self.assertTrue(result)"},{"line_number":9235,"context_line":""},{"line_number":9236,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver, \u0027_get_volume_encryption\u0027)"},{"line_number":9237,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver, \u0027_get_volume_encryptor\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_f6450219","line":9234,"range":{"start_line":9210,"start_character":0,"end_line":9234,"end_character":31},"updated":"2020-07-27 21:25:50.000000000","message":"This is duplicating test_disconnect_multiattach_single_connection as well?","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"40b98ba302fe2145e7c8037dd126144769d965e0","unresolved":false,"context_lines":[{"line_number":9207,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9208,"context_line":"        self.assertFalse(result)"},{"line_number":9209,"context_line":""},{"line_number":9210,"context_line":"    @mock.patch(\u0027nova.objects.InstanceList.get_uuids_by_host\u0027)"},{"line_number":9211,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":9212,"context_line":"    def test_should_disconnect_target_single_attach_volume_driver("},{"line_number":9213,"context_line":"            self, mock_volume_get, mock_get_instances):"},{"line_number":9214,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":9215,"context_line":"        volume_driver \u003d mock.MagicMock("},{"line_number":9216,"context_line":"            spec\u003dvolume_drivers.LibvirtVolumeDriver)"},{"line_number":9217,"context_line":"        multiattach \u003d False"},{"line_number":9218,"context_line":"        volume_id \u003d \u0027d30559cf-f092-4693-8589-0d0a1e7d9b1f\u0027"},{"line_number":9219,"context_line":"        attachments \u003d ("},{"line_number":9220,"context_line":"            [(\u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027,"},{"line_number":9221,"context_line":"              {\u0027mountpoint\u0027: u\u0027/dev/vdb\u0027,"},{"line_number":9222,"context_line":"               \u0027attachment_id\u0027: u\u00279402c249-99df-4f72-89e7-fd611493ee5d\u0027})])"},{"line_number":9223,"context_line":"        mock_volume_get.return_value \u003d ("},{"line_number":9224,"context_line":"            {\u0027attachments\u0027: OrderedDict(attachments),"},{"line_number":9225,"context_line":"             \u0027multiattach\u0027: multiattach,"},{"line_number":9226,"context_line":"             \u0027id\u0027: volume_id})"},{"line_number":9227,"context_line":"        mock_get_instances.return_value \u003d (["},{"line_number":9228,"context_line":"            \u002770ab645f-6ffc-406a-b3d2-5007a0c01b82\u0027])"},{"line_number":9229,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":9230,"context_line":"            self.context,"},{"line_number":9231,"context_line":"            host\u003d\u0027fake-host-1\u0027)"},{"line_number":9232,"context_line":"        result \u003d drvr._should_disconnect_target("},{"line_number":9233,"context_line":"            self.context, instance, multiattach, volume_driver, volume_id)"},{"line_number":9234,"context_line":"        self.assertTrue(result)"},{"line_number":9235,"context_line":""},{"line_number":9236,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver, \u0027_get_volume_encryption\u0027)"},{"line_number":9237,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver, \u0027_get_volume_encryptor\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_b93b7b9a","line":9234,"range":{"start_line":9210,"start_character":0,"end_line":9234,"end_character":31},"in_reply_to":"9f560f44_f6450219","updated":"2020-07-27 22:18:35.000000000","message":"Hello Lee,\n\nThank you for the review - all comments have been fixed in patchset 7.","commit_id":"e14bcfbd7728ebe4df7e8bd04b7e374826fdb5a9"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"66a358904af122d841b469454768ed3d0734965b","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"                           encryption\u003dNone):"},{"line_number":1654,"context_line":"        self._detach_encryptor(context, connection_info, encryption\u003dencryption)"},{"line_number":1655,"context_line":"        driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1656,"context_line":"        if (isinstance(driver, fs.LibvirtMountedFileSystemVolumeDriver) or"},{"line_number":1657,"context_line":"                self._should_disconnect_target(context, connection_info,"},{"line_number":1658,"context_line":"                                               instance)):"},{"line_number":1659,"context_line":"            driver.disconnect_volume(connection_info, instance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_7af383e8","line":1656,"range":{"start_line":1656,"start_character":8,"end_line":1656,"end_character":71},"updated":"2020-07-21 11:58:28.000000000","message":"We could just move this to the top of _should_disconnect_target with a detailed note highlighting that we always need to call disconnect_volume for volume drivers using _HostMountStateManager.","commit_id":"02281ac4153597fe633ba6a0b490925a513f70d3"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"ed92f41421972b280b21c4b70fb3dfece78fa331","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"                           encryption\u003dNone):"},{"line_number":1654,"context_line":"        self._detach_encryptor(context, connection_info, encryption\u003dencryption)"},{"line_number":1655,"context_line":"        driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1656,"context_line":"        if (isinstance(driver, fs.LibvirtMountedFileSystemVolumeDriver) or"},{"line_number":1657,"context_line":"                self._should_disconnect_target(context, connection_info,"},{"line_number":1658,"context_line":"                                               instance)):"},{"line_number":1659,"context_line":"            driver.disconnect_volume(connection_info, instance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_e0587a58","line":1656,"range":{"start_line":1656,"start_character":8,"end_line":1656,"end_character":71},"in_reply_to":"bf51134e_7af383e8","updated":"2020-07-21 23:03:28.000000000","message":"Hello Lee,\n\nThank you for the review! Please review patch set 3","commit_id":"02281ac4153597fe633ba6a0b490925a513f70d3"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"5e2d31f402f4cba08d90c213c0ad036a470585d3","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"        # attachments once, and that it is not unmounted until it is no longer"},{"line_number":1633,"context_line":"        # in use by any attachments. So we can skip the multiattach check for"},{"line_number":1634,"context_line":"        # volume drivers that based on LibvirtMountedFileSystemVolumeDriver."},{"line_number":1635,"context_line":"        volume_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1636,"context_line":"        if isinstance(volume_driver, fs.LibvirtMountedFileSystemVolumeDriver):"},{"line_number":1637,"context_line":"            return True"},{"line_number":1638,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_e3106752","line":1635,"range":{"start_line":1635,"start_character":8,"end_line":1635,"end_character":64},"updated":"2020-07-23 00:02:36.000000000","message":"As below, can we have this passed into _should_disconnect_target?","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"23a65fa1b00c97966013147f3b513dfd497e6fff","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"        # attachments once, and that it is not unmounted until it is no longer"},{"line_number":1633,"context_line":"        # in use by any attachments. So we can skip the multiattach check for"},{"line_number":1634,"context_line":"        # volume drivers that based on LibvirtMountedFileSystemVolumeDriver."},{"line_number":1635,"context_line":"        volume_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1636,"context_line":"        if isinstance(volume_driver, fs.LibvirtMountedFileSystemVolumeDriver):"},{"line_number":1637,"context_line":"            return True"},{"line_number":1638,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_2b6975bd","line":1635,"range":{"start_line":1635,"start_character":8,"end_line":1635,"end_character":64},"in_reply_to":"bf51134e_e3106752","updated":"2020-07-24 14:45:22.000000000","message":"Hello Lee,\n\nThank you for the comment - this fixed for in patchset 6.","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"5e2d31f402f4cba08d90c213c0ad036a470585d3","unresolved":false,"context_lines":[{"line_number":1633,"context_line":"        # in use by any attachments. So we can skip the multiattach check for"},{"line_number":1634,"context_line":"        # volume drivers that based on LibvirtMountedFileSystemVolumeDriver."},{"line_number":1635,"context_line":"        volume_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1636,"context_line":"        if isinstance(volume_driver, fs.LibvirtMountedFileSystemVolumeDriver):"},{"line_number":1637,"context_line":"            return True"},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"        connection_count \u003d 0"},{"line_number":1640,"context_line":"        volume_id \u003d driver_block_device.get_volume_id(connection_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_03447b46","line":1637,"range":{"start_line":1636,"start_character":8,"end_line":1637,"end_character":23},"updated":"2020-07-23 00:02:36.000000000","message":"I\u0027m okay with this, we could just look at connection_info for the transport type but I agree that it\u0027s better to ensure that the volume driver actually uses _HostMountStateManager by doing this.","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"5e2d31f402f4cba08d90c213c0ad036a470585d3","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"                           encryption\u003dNone):"},{"line_number":1664,"context_line":"        self._detach_encryptor(context, connection_info, encryption\u003dencryption)"},{"line_number":1665,"context_line":"        if self._should_disconnect_target(context, connection_info, instance):"},{"line_number":1666,"context_line":"            vol_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1667,"context_line":"            vol_driver.disconnect_volume(connection_info, instance)"},{"line_number":1668,"context_line":"        else:"},{"line_number":1669,"context_line":"            volume_id \u003d driver_block_device.get_volume_id(connection_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_830a4b1d","line":1666,"range":{"start_line":1666,"start_character":12,"end_line":1666,"end_character":65},"updated":"2020-07-23 00:02:36.000000000","message":"Can you always fetch this above and pass vol_driver into _should_disconnect_target as an arg to avoid the double lookup?","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"23a65fa1b00c97966013147f3b513dfd497e6fff","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"                           encryption\u003dNone):"},{"line_number":1664,"context_line":"        self._detach_encryptor(context, connection_info, encryption\u003dencryption)"},{"line_number":1665,"context_line":"        if self._should_disconnect_target(context, connection_info, instance):"},{"line_number":1666,"context_line":"            vol_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1667,"context_line":"            vol_driver.disconnect_volume(connection_info, instance)"},{"line_number":1668,"context_line":"        else:"},{"line_number":1669,"context_line":"            volume_id \u003d driver_block_device.get_volume_id(connection_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_0b6631ee","line":1666,"range":{"start_line":1666,"start_character":12,"end_line":1666,"end_character":65},"in_reply_to":"bf51134e_830a4b1d","updated":"2020-07-24 14:45:22.000000000","message":"Hello Lee,\n\nThank you for the comment - this fixed for in patchset 6.","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"5e2d31f402f4cba08d90c213c0ad036a470585d3","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"            vol_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1667,"context_line":"            vol_driver.disconnect_volume(connection_info, instance)"},{"line_number":1668,"context_line":"        else:"},{"line_number":1669,"context_line":"            volume_id \u003d driver_block_device.get_volume_id(connection_info)"},{"line_number":1670,"context_line":"            LOG.info(\u0027Detected multiple connections on this host for \u0027"},{"line_number":1671,"context_line":"                     \u0027volume: %(volume)s, skipping target disconnect.\u0027,"},{"line_number":1672,"context_line":"                     {\u0027volume\u0027: volume_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_83236ba7","line":1669,"range":{"start_line":1669,"start_character":12,"end_line":1669,"end_character":74},"updated":"2020-07-23 00:02:36.000000000","message":"We could also fetch this once above and use it to fetch and provide the volume to _should_disconnect_target.","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"23a65fa1b00c97966013147f3b513dfd497e6fff","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"            vol_driver \u003d self._get_volume_driver(connection_info)"},{"line_number":1667,"context_line":"            vol_driver.disconnect_volume(connection_info, instance)"},{"line_number":1668,"context_line":"        else:"},{"line_number":1669,"context_line":"            volume_id \u003d driver_block_device.get_volume_id(connection_info)"},{"line_number":1670,"context_line":"            LOG.info(\u0027Detected multiple connections on this host for \u0027"},{"line_number":1671,"context_line":"                     \u0027volume: %(volume)s, skipping target disconnect.\u0027,"},{"line_number":1672,"context_line":"                     {\u0027volume\u0027: volume_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf51134e_ab9aa5c1","line":1669,"range":{"start_line":1669,"start_character":12,"end_line":1669,"end_character":74},"in_reply_to":"bf51134e_83236ba7","updated":"2020-07-24 14:45:22.000000000","message":"Hello Lee,\n\nThank you for the comment - this fixed for in patchset 6.","commit_id":"0f5d953fb36ae9ede894c8e1d7accaff80e4c2e9"}],"releasenotes/notes/bug-1888022-detach-multiattached-volumes-5fa862aea7f237ea.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0210b7c3b2199218688f723ae686b8ca298fa461","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `Bug #1888022 \u003chttps://launchpad.net/bugs/1888022\u003e`_:"},{"line_number":5,"context_line":"    Fixed an issue with detaching multi-attached fs-based volumes."},{"line_number":6,"context_line":"    Volume drivers using _HostMountStateManager are special case."},{"line_number":7,"context_line":"    _HostMountStateManager ensures that the compute node only attempts"},{"line_number":8,"context_line":"    to mount a single mountpoint in use by multiple attachments once,"},{"line_number":9,"context_line":"    and that it is not unmounted until it is no longer in use by any"},{"line_number":10,"context_line":"    attachments."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_978f842d","line":10,"range":{"start_line":5,"start_character":0,"end_line":10,"end_character":16},"updated":"2020-08-11 08:59:20.000000000","message":"This is quite low-level and I\u0027m not sure how useful it is in a commit message. Could we simply say:\n\n  An issue that prevented detach of multi-attached fs-based volumes\n  is resolved.\n\n?","commit_id":"3292a60a80a8582ce7936aedd83edba97be9a1c2"},{"author":{"_account_id":29568,"name":"Alex Deiter","display_name":"Alex Deiter","email":"alex.deiter@gmail.com","username":"deiter"},"change_message_id":"075a4fcc8d0ebeb9e26188d8d0ac882cf18569c2","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `Bug #1888022 \u003chttps://launchpad.net/bugs/1888022\u003e`_:"},{"line_number":5,"context_line":"    Fixed an issue with detaching multi-attached fs-based volumes."},{"line_number":6,"context_line":"    Volume drivers using _HostMountStateManager are special case."},{"line_number":7,"context_line":"    _HostMountStateManager ensures that the compute node only attempts"},{"line_number":8,"context_line":"    to mount a single mountpoint in use by multiple attachments once,"},{"line_number":9,"context_line":"    and that it is not unmounted until it is no longer in use by any"},{"line_number":10,"context_line":"    attachments."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9f560f44_7a39f5f0","line":10,"range":{"start_line":5,"start_character":0,"end_line":10,"end_character":16},"in_reply_to":"9f560f44_978f842d","updated":"2020-08-11 11:37:35.000000000","message":"Hello Stephen,\n\nDone, thank you!","commit_id":"3292a60a80a8582ce7936aedd83edba97be9a1c2"}]}
