)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shunei Shiono \u003cs-shiono@ti.jp.nec.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-06-22 19:32:56 +0900"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"NEC driver: instance loses access to its volumes after live-migraion."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In Cinder API v3.44 and later, remove_export() is called after live-migration."},{"line_number":10,"context_line":"In remove_export(), NEC driver detaches the given volume from all servers."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_7107c671","line":7,"range":{"start_line":7,"start_character":60,"end_line":7,"end_character":68},"updated":"2018-07-06 09:03:05.000000000","message":"nit: migration","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shunei Shiono \u003cs-shiono@ti.jp.nec.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-06-22 19:32:56 +0900"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"NEC driver: instance loses access to its volumes after live-migraion."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In Cinder API v3.44 and later, remove_export() is called after live-migration."},{"line_number":10,"context_line":"In remove_export(), NEC driver detaches the given volume from all servers."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_64990b1c","line":7,"range":{"start_line":7,"start_character":60,"end_line":7,"end_character":68},"in_reply_to":"5f7c97a3_7107c671","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Basically NEC driver detaches volume in terminate_connection()."},{"line_number":14,"context_line":"The detach-from-all is needed only when an attached volume is deleted before"},{"line_number":15,"context_line":"detach."},{"line_number":16,"context_line":"This patch moves the detach-from-all from remove_export() to delete_volume()."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Closes-Bug: #1777385"},{"line_number":19,"context_line":"Change-Id: I7d9398dadca7115ad58040743a55601a592f2fa3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_d17b3af1","line":16,"updated":"2018-07-06 09:03:05.000000000","message":"nit: Please limit first limit first line to 50 characters and remove the period.  And wrap all other lines at 72 characters as guidelines recommend (https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure)","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Basically NEC driver detaches volume in terminate_connection()."},{"line_number":14,"context_line":"The detach-from-all is needed only when an attached volume is deleted before"},{"line_number":15,"context_line":"detach."},{"line_number":16,"context_line":"This patch moves the detach-from-all from remove_export() to delete_volume()."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Closes-Bug: #1777385"},{"line_number":19,"context_line":"Change-Id: I7d9398dadca7115ad58040743a55601a592f2fa3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f7c97a3_4482cfa6","line":16,"in_reply_to":"5f7c97a3_d17b3af1","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"}],"cinder/tests/unit/volume/drivers/nec/test_volume.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1012,"context_line":"        self.assertIsNone(location)"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"class DeleteVolume_test(volume_helper.MStorageDSVDriver, test.TestCase):"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.volume_common.MStorageVolumeCommon.\u0027"},{"line_number":1018,"context_line":"                \u0027_create_ismview_dir\u0027, new\u003dmock.Mock())"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_7166e62a","line":1015,"range":{"start_line":1015,"start_character":24,"end_line":1015,"end_character":55},"updated":"2018-07-06 09:03:05.000000000","message":"I don\u0027t think it\u0027s a good idea to create a test case that\u0027s also a driver.","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1012,"context_line":"        self.assertIsNone(location)"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"class DeleteVolume_test(volume_helper.MStorageDSVDriver, test.TestCase):"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.volume_common.MStorageVolumeCommon.\u0027"},{"line_number":1018,"context_line":"                \u0027_create_ismview_dir\u0027, new\u003dmock.Mock())"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_047617d6","line":1015,"range":{"start_line":1015,"start_character":24,"end_line":1015,"end_character":55},"in_reply_to":"5f7c97a3_7166e62a","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"class DeleteVolume_test(volume_helper.MStorageDSVDriver, test.TestCase):"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.volume_common.MStorageVolumeCommon.\u0027"},{"line_number":1018,"context_line":"                \u0027_create_ismview_dir\u0027, new\u003dmock.Mock())"},{"line_number":1019,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI.\u0027"},{"line_number":1020,"context_line":"                \u0027view_all\u0027, patch_view_all)"},{"line_number":1021,"context_line":"    def setUp(self):"},{"line_number":1022,"context_line":"        super(DeleteVolume_test, self).setUp()"},{"line_number":1023,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b1923efb","line":1020,"range":{"start_line":1017,"start_character":0,"end_line":1020,"end_character":43},"updated":"2018-07-06 09:03:05.000000000","message":"-1: These mocks will be removed after the call to setUp is completed, it would be best if we mocked them inside the setUp method using \u0027self.patch\u0027 method.  That method accepts the same parameters as mock.patch and takes care of the cleanup when each test completes.\n\nWe could probably also add the decorators to the class itself.","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"class DeleteVolume_test(volume_helper.MStorageDSVDriver, test.TestCase):"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.volume_common.MStorageVolumeCommon.\u0027"},{"line_number":1018,"context_line":"                \u0027_create_ismview_dir\u0027, new\u003dmock.Mock())"},{"line_number":1019,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI.\u0027"},{"line_number":1020,"context_line":"                \u0027view_all\u0027, patch_view_all)"},{"line_number":1021,"context_line":"    def setUp(self):"},{"line_number":1022,"context_line":"        super(DeleteVolume_test, self).setUp()"},{"line_number":1023,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a44ac37f","line":1020,"range":{"start_line":1017,"start_character":0,"end_line":1020,"end_character":43},"in_reply_to":"5f7c97a3_b1923efb","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":1024,"context_line":"        self.do_setup(None)"},{"line_number":1025,"context_line":"        self.vol \u003d DummyVolume()"},{"line_number":1026,"context_line":"        self.xml \u003d self._cli.view_all()"},{"line_number":1027,"context_line":"        (self.pools,"},{"line_number":1028,"context_line":"         self.lds,"},{"line_number":1029,"context_line":"         self.ldsets,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_d14eda94","line":1026,"updated":"2018-07-06 09:03:05.000000000","message":"?: Since you mocked this on this method, isn\u0027t this just like calling patch_view_all","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":1024,"context_line":"        self.do_setup(None)"},{"line_number":1025,"context_line":"        self.vol \u003d DummyVolume()"},{"line_number":1026,"context_line":"        self.xml \u003d self._cli.view_all()"},{"line_number":1027,"context_line":"        (self.pools,"},{"line_number":1028,"context_line":"         self.lds,"},{"line_number":1029,"context_line":"         self.ldsets,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_c44d7f99","line":1026,"in_reply_to":"5f7c97a3_d14eda94","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI._execute\u0027,"},{"line_number":1035,"context_line":"                patch_execute)"},{"line_number":1036,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI.view_all\u0027,"},{"line_number":1037,"context_line":"                patch_view_all)"},{"line_number":1038,"context_line":"    def test_delete_volume(self):"},{"line_number":1039,"context_line":"        self.vol.id \u003d \"46045673-41e7-44a7-9333-02f07feab04b\""},{"line_number":1040,"context_line":"        detached \u003d self._detach_from_all(self.vol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b12ebea8","line":1037,"updated":"2018-07-06 09:03:05.000000000","message":"If we mock this using self.patch on the setUp method we don\u0027t need to do it also here.","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI._execute\u0027,"},{"line_number":1035,"context_line":"                patch_execute)"},{"line_number":1036,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI.view_all\u0027,"},{"line_number":1037,"context_line":"                patch_view_all)"},{"line_number":1038,"context_line":"    def test_delete_volume(self):"},{"line_number":1039,"context_line":"        self.vol.id \u003d \"46045673-41e7-44a7-9333-02f07feab04b\""},{"line_number":1040,"context_line":"        detached \u003d self._detach_from_all(self.vol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_64402b60","line":1037,"in_reply_to":"5f7c97a3_b12ebea8","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI.view_all\u0027,"},{"line_number":1037,"context_line":"                patch_view_all)"},{"line_number":1038,"context_line":"    def test_delete_volume(self):"},{"line_number":1039,"context_line":"        self.vol.id \u003d \"46045673-41e7-44a7-9333-02f07feab04b\""},{"line_number":1040,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1041,"context_line":"        self.assertTrue(detached)"},{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_3122aebb","line":1039,"updated":"2018-07-06 09:03:05.000000000","message":"nit: Better use VOLUME_ID from cinder.tests.unit.fake_constants","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"    @mock.patch(\u0027cinder.volume.drivers.nec.cli.MStorageISMCLI.view_all\u0027,"},{"line_number":1037,"context_line":"                patch_view_all)"},{"line_number":1038,"context_line":"    def test_delete_volume(self):"},{"line_number":1039,"context_line":"        self.vol.id \u003d \"46045673-41e7-44a7-9333-02f07feab04b\""},{"line_number":1040,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1041,"context_line":"        self.assertTrue(detached)"},{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_5f0cd9e9","line":1039,"in_reply_to":"5f7c97a3_3122aebb","updated":"2018-07-10 09:35:55.000000000","message":"This test case fails with fake VOLUME_ID.\nThis tests that an attached volume is detached in advance to deletion.\nAn ID of attached volume must be specified to trigger detaching.","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"        self.vol.id \u003d \"46045673-41e7-44a7-9333-02f07feab04b\""},{"line_number":1040,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1041,"context_line":"        self.assertTrue(detached)"},{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""},{"line_number":1043,"context_line":"        ret \u003d self.delete_volume(self.vol)"},{"line_number":1044,"context_line":"        self.assertIsNone(ret)"},{"line_number":1045,"context_line":"        self.vol.id \u003d \"63410c76-2f12-4473-873d-74a63dfcd3e2\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b1179e54","line":1042,"updated":"2018-07-06 09:03:05.000000000","message":"nit: Better use VOLUME2_ID from cinder.tests.unit.fake_constants","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"        self.vol.id \u003d \"46045673-41e7-44a7-9333-02f07feab04b\""},{"line_number":1040,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1041,"context_line":"        self.assertTrue(detached)"},{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""},{"line_number":1043,"context_line":"        ret \u003d self.delete_volume(self.vol)"},{"line_number":1044,"context_line":"        self.assertIsNone(ret)"},{"line_number":1045,"context_line":"        self.vol.id \u003d \"63410c76-2f12-4473-873d-74a63dfcd3e2\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_0424d7c1","line":1042,"in_reply_to":"5f7c97a3_b1179e54","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"        self.assertTrue(detached)"},{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""},{"line_number":1043,"context_line":"        ret \u003d self.delete_volume(self.vol)"},{"line_number":1044,"context_line":"        self.assertIsNone(ret)"},{"line_number":1045,"context_line":"        self.vol.id \u003d \"63410c76-2f12-4473-873d-74a63dfcd3e2\""},{"line_number":1046,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1047,"context_line":"        self.assertFalse(detached)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_cc015d06","line":1044,"updated":"2018-07-06 09:03:05.000000000","message":"-1: This test case should be making sure we are actually calling the _detach_from_all method in the driver.  The best way to do it is to mock it and check that it has been called.  As the test is now we are not actually confirming that we call _detach_from_all.","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"        self.assertTrue(detached)"},{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""},{"line_number":1043,"context_line":"        ret \u003d self.delete_volume(self.vol)"},{"line_number":1044,"context_line":"        self.assertIsNone(ret)"},{"line_number":1045,"context_line":"        self.vol.id \u003d \"63410c76-2f12-4473-873d-74a63dfcd3e2\""},{"line_number":1046,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1047,"context_line":"        self.assertFalse(detached)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a42f23a5","line":1044,"in_reply_to":"5f7c97a3_cc015d06","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"74659ee93d84d371cde47c950567a91e46892c99","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""},{"line_number":1043,"context_line":"        ret \u003d self.delete_volume(self.vol)"},{"line_number":1044,"context_line":"        self.assertIsNone(ret)"},{"line_number":1045,"context_line":"        self.vol.id \u003d \"63410c76-2f12-4473-873d-74a63dfcd3e2\""},{"line_number":1046,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1047,"context_line":"        self.assertFalse(detached)"},{"line_number":1048,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_310b8e2b","line":1045,"updated":"2018-07-06 09:03:05.000000000","message":"nit: Better use VOLUME3_ID from cinder.tests.unit.fake_constants","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"ce5b7efa9b11dc3be72994ae8a0ac81322b0e258","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        self.vol.id \u003d \"1febb976-86d0-42ed-9bc0-4aa3e158f27d\""},{"line_number":1043,"context_line":"        ret \u003d self.delete_volume(self.vol)"},{"line_number":1044,"context_line":"        self.assertIsNone(ret)"},{"line_number":1045,"context_line":"        self.vol.id \u003d \"63410c76-2f12-4473-873d-74a63dfcd3e2\""},{"line_number":1046,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":1047,"context_line":"        self.assertFalse(detached)"},{"line_number":1048,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a4188383","line":1045,"in_reply_to":"5f7c97a3_310b8e2b","updated":"2018-07-10 09:35:55.000000000","message":"Done","commit_id":"21c5efb39fbacd6b375558946150c083efcd5c6e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def setUp(self):"},{"line_number":370,"context_line":"        super(VolumeIDConvertTest, self).setUp()"},{"line_number":371,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":372,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":373,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":374,"context_line":"        self.do_setup(None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_1e781ff5","line":371,"updated":"2018-07-16 15:42:01.000000000","message":"Why do we need a temporary variable?","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    def setUp(self):"},{"line_number":370,"context_line":"        super(VolumeIDConvertTest, self).setUp()"},{"line_number":371,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":372,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":373,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":374,"context_line":"        self.do_setup(None)"},{"line_number":375,"context_line":"        self.vol \u003d DummyVolume()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_7e511363","line":372,"updated":"2018-07-16 15:42:01.000000000","message":"You should not be replacing methods with mocks:\n\n self.mock_object(self, \u0027_create_ismview_dir\u0027)","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"2c7d5a1f82909994be66f88438e8999f4d31b629","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    def setUp(self):"},{"line_number":370,"context_line":"        super(VolumeIDConvertTest, self).setUp()"},{"line_number":371,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":372,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":373,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":374,"context_line":"        self.do_setup(None)"},{"line_number":375,"context_line":"        self.vol \u003d DummyVolume()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_1520cb4a","line":372,"in_reply_to":"5f7c97a3_7e511363","updated":"2018-07-18 08:36:13.000000000","message":"Done","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def setUp(self):"},{"line_number":412,"context_line":"        super(NominatePoolLDTest, self).setUp()"},{"line_number":413,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":414,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":415,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":416,"context_line":"        mock_cli_execute \u003d mock.Mock()"},{"line_number":417,"context_line":"        self._cli._execute \u003d mock_cli_execute"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5edbf7e8","line":414,"range":{"start_line":413,"start_character":0,"end_line":414,"end_character":50},"updated":"2018-07-16 15:42:01.000000000","message":"ditto","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"2c7d5a1f82909994be66f88438e8999f4d31b629","unresolved":false,"context_lines":[{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def setUp(self):"},{"line_number":412,"context_line":"        super(NominatePoolLDTest, self).setUp()"},{"line_number":413,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":414,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":415,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":416,"context_line":"        mock_cli_execute \u003d mock.Mock()"},{"line_number":417,"context_line":"        self._cli._execute \u003d mock_cli_execute"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f51aef15","line":414,"range":{"start_line":413,"start_character":0,"end_line":414,"end_character":50},"in_reply_to":"5f7c97a3_5edbf7e8","updated":"2018-07-18 08:36:13.000000000","message":"Done","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":414,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":415,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":416,"context_line":"        mock_cli_execute \u003d mock.Mock()"},{"line_number":417,"context_line":"        self._cli._execute \u003d mock_cli_execute"},{"line_number":418,"context_line":"        self._cli._execute.return_value \u003d \"success\", 0, 0"},{"line_number":419,"context_line":"        mock_cli_view \u003d mock.Mock()"},{"line_number":420,"context_line":"        self._cli.view_all \u003d mock_cli_view"},{"line_number":421,"context_line":"        self._cli.view_all.return_value \u003d xml_out"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3ee07b97","line":418,"range":{"start_line":416,"start_character":0,"end_line":418,"end_character":57},"updated":"2018-07-16 15:42:01.000000000","message":"self.mock_object(self._cli, \u0027_execute\u0027,\n                 return_value\u003d(\u0027success\u0027, 0, 0))","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"2c7d5a1f82909994be66f88438e8999f4d31b629","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        mock_create_dir \u003d mock.Mock()"},{"line_number":414,"context_line":"        self._create_ismview_dir \u003d mock_create_dir"},{"line_number":415,"context_line":"        self._set_config(conf.Configuration(None), \u0027dummy\u0027, \u0027dummy\u0027)"},{"line_number":416,"context_line":"        mock_cli_execute \u003d mock.Mock()"},{"line_number":417,"context_line":"        self._cli._execute \u003d mock_cli_execute"},{"line_number":418,"context_line":"        self._cli._execute.return_value \u003d \"success\", 0, 0"},{"line_number":419,"context_line":"        mock_cli_view \u003d mock.Mock()"},{"line_number":420,"context_line":"        self._cli.view_all \u003d mock_cli_view"},{"line_number":421,"context_line":"        self._cli.view_all.return_value \u003d xml_out"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_b510f7f5","line":418,"range":{"start_line":416,"start_character":0,"end_line":418,"end_character":57},"in_reply_to":"5f7c97a3_3ee07b97","updated":"2018-07-18 08:36:13.000000000","message":"Done","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        mock_cli_execute \u003d mock.Mock()"},{"line_number":417,"context_line":"        self._cli._execute \u003d mock_cli_execute"},{"line_number":418,"context_line":"        self._cli._execute.return_value \u003d \"success\", 0, 0"},{"line_number":419,"context_line":"        mock_cli_view \u003d mock.Mock()"},{"line_number":420,"context_line":"        self._cli.view_all \u003d mock_cli_view"},{"line_number":421,"context_line":"        self._cli.view_all.return_value \u003d xml_out"},{"line_number":422,"context_line":"        self.do_setup(None)"},{"line_number":423,"context_line":"        self.vol \u003d DummyVolume()"},{"line_number":424,"context_line":"        self.xml \u003d xml_out"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_7effd334","line":421,"range":{"start_line":419,"start_character":0,"end_line":421,"end_character":49},"updated":"2018-07-16 15:42:01.000000000","message":"self.mock_object(self._cli, \u0027view_all\u0027, return_value\u003dxml_out)","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"2c7d5a1f82909994be66f88438e8999f4d31b629","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        mock_cli_execute \u003d mock.Mock()"},{"line_number":417,"context_line":"        self._cli._execute \u003d mock_cli_execute"},{"line_number":418,"context_line":"        self._cli._execute.return_value \u003d \"success\", 0, 0"},{"line_number":419,"context_line":"        mock_cli_view \u003d mock.Mock()"},{"line_number":420,"context_line":"        self._cli.view_all \u003d mock_cli_view"},{"line_number":421,"context_line":"        self._cli.view_all.return_value \u003d xml_out"},{"line_number":422,"context_line":"        self.do_setup(None)"},{"line_number":423,"context_line":"        self.vol \u003d DummyVolume()"},{"line_number":424,"context_line":"        self.xml \u003d xml_out"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_75d49f1f","line":421,"range":{"start_line":419,"start_character":0,"end_line":421,"end_character":49},"in_reply_to":"5f7c97a3_7effd334","updated":"2018-07-18 08:36:13.000000000","message":"Done","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":676,"context_line":"        self._cli.view_all.return_value \u003d xml_out"},{"line_number":677,"context_line":"        self.do_setup(None)"},{"line_number":678,"context_line":"        self.vol \u003d DummyVolume()"},{"line_number":679,"context_line":"        self.src \u003d DummyVolume()"},{"line_number":680,"context_line":"        mock_bindld \u003d mock.Mock()"},{"line_number":681,"context_line":"        self._bind_ld \u003d mock_bindld"},{"line_number":682,"context_line":"        self._bind_ld.return_value \u003d 0, 0, 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9e566f2b","line":679,"range":{"start_line":679,"start_character":19,"end_line":679,"end_character":30},"updated":"2018-07-16 15:42:01.000000000","message":"Why doesn\u0027t your DummyVolume accept a volume id as a parameter? That way you don\u0027t have to set it in each test.","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"2c7d5a1f82909994be66f88438e8999f4d31b629","unresolved":false,"context_lines":[{"line_number":676,"context_line":"        self._cli.view_all.return_value \u003d xml_out"},{"line_number":677,"context_line":"        self.do_setup(None)"},{"line_number":678,"context_line":"        self.vol \u003d DummyVolume()"},{"line_number":679,"context_line":"        self.src \u003d DummyVolume()"},{"line_number":680,"context_line":"        mock_bindld \u003d mock.Mock()"},{"line_number":681,"context_line":"        self._bind_ld \u003d mock_bindld"},{"line_number":682,"context_line":"        self._bind_ld.return_value \u003d 0, 0, 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d5233305","line":679,"range":{"start_line":679,"start_character":19,"end_line":679,"end_character":30},"in_reply_to":"5f7c97a3_9e566f2b","updated":"2018-07-18 08:36:13.000000000","message":"Done","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a64dcbf539d4a943b668091d968175be2be624c1","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":727,"context_line":"        self.assertFalse(detached)"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        mock_detach_from_all \u003d mock.Mock()"},{"line_number":730,"context_line":"        self._detach_from_all \u003d mock_detach_from_all"},{"line_number":731,"context_line":"        self.vol.id \u003d constants.VOLUME2_ID"},{"line_number":732,"context_line":"        self.delete_volume(self.vol)"},{"line_number":733,"context_line":"        self._detach_from_all.assert_called_once_with(self.vol)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"class BindLDTest_Snap(volume_helper.MStorageDSVDriver, test.TestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a918d31e","line":733,"range":{"start_line":729,"start_character":0,"end_line":733,"end_character":63},"updated":"2018-07-16 15:42:01.000000000","message":"We should not replace methods directly with a Mock.  You can use for example:\n\n        self.vol.id \u003d constants.VOLUME2_ID\n        with mock.patch.object(self, \u0027_detach_from_all\u0027) as detach_mock:\n            self.delete_volume(self.vol)\n            detach_mock.assert_called_once_with(self.vol)","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"2c7d5a1f82909994be66f88438e8999f4d31b629","unresolved":false,"context_lines":[{"line_number":726,"context_line":"        detached \u003d self._detach_from_all(self.vol)"},{"line_number":727,"context_line":"        self.assertFalse(detached)"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        mock_detach_from_all \u003d mock.Mock()"},{"line_number":730,"context_line":"        self._detach_from_all \u003d mock_detach_from_all"},{"line_number":731,"context_line":"        self.vol.id \u003d constants.VOLUME2_ID"},{"line_number":732,"context_line":"        self.delete_volume(self.vol)"},{"line_number":733,"context_line":"        self._detach_from_all.assert_called_once_with(self.vol)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"class BindLDTest_Snap(volume_helper.MStorageDSVDriver, test.TestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_95e85be0","line":733,"range":{"start_line":729,"start_character":0,"end_line":733,"end_character":63},"in_reply_to":"5f7c97a3_a918d31e","updated":"2018-07-18 08:36:13.000000000","message":"Done","commit_id":"cc855f4754a9353cf03181a8ea33f4217e394858"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f6cfb78c29dd8b2a20aef4774a6b628436be04f0","unresolved":false,"context_lines":[{"line_number":660,"context_line":""},{"line_number":661,"context_line":"    def test_bindld_CreateCloneVolume(self):"},{"line_number":662,"context_line":"        self.vol.migration_status \u003d \"success\""},{"line_number":663,"context_line":"        self.src \u003d DummyVolume(\"46045673-41e7-44a7-9333-02f07feab04b\", 1)"},{"line_number":664,"context_line":"        self.mock_object(self._cli, \u0027query_BV_SV_status\u0027,"},{"line_number":665,"context_line":"                         return_value\u003d\u0027snap/active\u0027)"},{"line_number":666,"context_line":"        self.mock_object(self._cli, \u0027query_MV_RV_name\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_0bc42893","line":663,"range":{"start_line":663,"start_character":31,"end_line":663,"end_character":69},"updated":"2018-07-18 09:45:43.000000000","message":"nit: Better use `constants.VOLUME2_ID`","commit_id":"3b322ebd9aa0456bd90a8b17524ed13713feeb99"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"fa963416043aa07cbb7b57c11462c5785517f92b","unresolved":false,"context_lines":[{"line_number":660,"context_line":""},{"line_number":661,"context_line":"    def test_bindld_CreateCloneVolume(self):"},{"line_number":662,"context_line":"        self.vol.migration_status \u003d \"success\""},{"line_number":663,"context_line":"        self.src \u003d DummyVolume(\"46045673-41e7-44a7-9333-02f07feab04b\", 1)"},{"line_number":664,"context_line":"        self.mock_object(self._cli, \u0027query_BV_SV_status\u0027,"},{"line_number":665,"context_line":"                         return_value\u003d\u0027snap/active\u0027)"},{"line_number":666,"context_line":"        self.mock_object(self._cli, \u0027query_MV_RV_name\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_2559ff59","line":663,"range":{"start_line":663,"start_character":31,"end_line":663,"end_character":69},"in_reply_to":"5f7c97a3_0bc42893","updated":"2018-07-19 00:42:07.000000000","message":"This test case fails with `constants.VOLUME2_ID`.\nAn ID of existent volume in xml_out must be specified.","commit_id":"3b322ebd9aa0456bd90a8b17524ed13713feeb99"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f6cfb78c29dd8b2a20aef4774a6b628436be04f0","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        self.vol.id \u003d constants.VOLUME2_ID"},{"line_number":688,"context_line":"        with mock.patch.object(self, \u0027_detach_from_all\u0027) as detach_mock:"},{"line_number":689,"context_line":"            self.delete_volume(self.vol)"},{"line_number":690,"context_line":"            self._detach_from_all.assert_called_once_with(self.vol)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"class BindLDTest_Snap(volume_helper.MStorageDSVDriver, test.TestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_4bcf808a","line":690,"updated":"2018-07-18 09:45:43.000000000","message":"-1: this should be referring to the `detach_mock` content manager that you created on L688.\n\n detach_mock.assert_called_once_with(self.vol)","commit_id":"3b322ebd9aa0456bd90a8b17524ed13713feeb99"},{"author":{"_account_id":23885,"name":"Shunei Shiono","email":"shunei.shiono@gmail.com","username":"s-shiono"},"change_message_id":"fa963416043aa07cbb7b57c11462c5785517f92b","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        self.vol.id \u003d constants.VOLUME2_ID"},{"line_number":688,"context_line":"        with mock.patch.object(self, \u0027_detach_from_all\u0027) as detach_mock:"},{"line_number":689,"context_line":"            self.delete_volume(self.vol)"},{"line_number":690,"context_line":"            self._detach_from_all.assert_called_once_with(self.vol)"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"class BindLDTest_Snap(volume_helper.MStorageDSVDriver, test.TestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c5512b33","line":690,"in_reply_to":"5f7c97a3_4bcf808a","updated":"2018-07-19 00:42:07.000000000","message":"Done","commit_id":"3b322ebd9aa0456bd90a8b17524ed13713feeb99"}],"cinder/volume/drivers/nec/volume_helper.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"1800812d7a583e4190197aa5982b350289b2f291","unresolved":false,"context_lines":[{"line_number":959,"context_line":"        pass"},{"line_number":960,"context_line":""},{"line_number":961,"context_line":"    def _detach_from_all(self, volume):"},{"line_number":962,"context_line":"        LOG.debug(\u0027_detach_from_all Start.\u0027)"},{"line_number":963,"context_line":"        xml \u003d self._cli.view_all(self._properties[\u0027ismview_path\u0027])"},{"line_number":964,"context_line":"        pools, lds, ldsets, used_ldns, hostports, max_ld_count \u003d ("},{"line_number":965,"context_line":"            self.configs(xml))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_8e1ec65b","line":962,"updated":"2018-07-20 13:08:59.000000000","message":"You might want to consider using the common trace decorator rather than have start/end debug calls:\n\nhttps://github.com/openstack/cinder/blob/d24bbf35a1b82626404d6df7e0a68e688719295c/cinder/utils.py#L872","commit_id":"620e1b7613316e271be0d0aef2e037eff0f6f888"}]}
