)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8ea3a877c13fdd34da9614cd5f8e13df8c155668","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"rbd is the only example of a currently supported image storage"},{"line_number":10,"context_line":"backend where it makes sense to put the config drive in the"},{"line_number":11,"context_line":"configured storage backend instead of local hypervisor disk."},{"line_number":12,"context_line":"Support this special case by moving the image to rbd once it has"},{"line_number":13,"context_line":"been created in the local instance directory on the hypervisor."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da9df570_53ff9834","line":11,"updated":"2014-09-22 15:39:18.000000000","message":"Would you mind including an explanation in this commit message as to why RBD is the only backend where it makes sense to put the config drive in this configured storage backend instead of local hypervisor disk?","commit_id":"13bc020680f42fa1a4dbabc4383f8432036af76c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"7199cfd9687adf2b45bfa7b1fba9745528ade6c6","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"rbd is the only example of a currently supported image storage"},{"line_number":10,"context_line":"backend where it makes sense to put the config drive in the"},{"line_number":11,"context_line":"configured storage backend instead of local hypervisor disk."},{"line_number":12,"context_line":"Support this special case by moving the image to rbd once it has"},{"line_number":13,"context_line":"been created in the local instance directory on the hypervisor."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da9df570_c4900e98","line":11,"in_reply_to":"da9df570_53ff9834","updated":"2014-09-23 02:18:16.000000000","message":"Done","commit_id":"13bc020680f42fa1a4dbabc4383f8432036af76c"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"96d36a07cd92ab9aade0a4349edece3a95072c9e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"I\u0027ve tested this change in devstack and it works."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Related-bug: #1369627"},{"line_number":28,"context_line":"Related-bug: #1361840"},{"line_number":29,"context_line":"Closes-Bug: #1377000"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia3ca5a18c79d62b71b9c042a612d12dd074b245e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"da86d52c_ea3b9f35","line":28,"updated":"2015-02-18 16:30:26.000000000","message":"Related-bug: #1246201","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"be5a60ce64be03d4a8fbe373d77e6f2241a66c1f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"I\u0027ve tested this change in devstack and it works."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Related-bug: #1369627"},{"line_number":28,"context_line":"Related-bug: #1361840"},{"line_number":29,"context_line":"Closes-Bug: #1377000"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia3ca5a18c79d62b71b9c042a612d12dd074b245e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba7be1f8_945fa540","line":28,"in_reply_to":"da86d52c_ea3b9f35","updated":"2015-02-25 09:33:53.000000000","message":"Done","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"6e0b6a0632bebba807476d456774a1ce16fa77e3","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Related-bug: #1369627"},{"line_number":28,"context_line":"Related-bug: #1361840"},{"line_number":29,"context_line":"Related-bug: #1246201"},{"line_number":30,"context_line":"Closes-Bug: #1377000"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Co-Authored-By: Mehdi Abaakouk \u003csileht@redhat.com\u003e"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"fa963961_130c5093","line":30,"updated":"2015-03-26 19:27:22.000000000","message":"so this is not the right bug report to close right?  This is a mirantis bug  on mos, that points to 1246201 as the upstream nova bug,","commit_id":"b8f4911b6f1b35f21e1d43713eb956caa48665b3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dcd03232e134dfb2eed6918cb839f1eb064d89e5","unresolved":false,"context_lines":[{"line_number":22,"context_line":"Support this special case by moving the image to rbd once it has"},{"line_number":23,"context_line":"been created in the local instance directory on the hypervisor."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"I\u0027ve tested this change in devstack and it works."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Related-bug: #1369627"},{"line_number":28,"context_line":"Related-bug: #1361840"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"3a50d1a3_fcd38c36","line":25,"updated":"2015-07-21 11:12:02.000000000","message":":)\n\nAll you need is a link to a dreamhost tshirt","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"be5a60ce64be03d4a8fbe373d77e6f2241a66c1f","unresolved":false,"context_lines":[{"line_number":7063,"context_line":"            # Turn on some swap to exercise that codepath in _create_image"},{"line_number":7064,"context_line":"            instance_ref[\u0027system_metadata\u0027][\u0027instance_type_swap\u0027] \u003d 500"},{"line_number":7065,"context_line":""},{"line_number":7066,"context_line":"            got_files, _ \u003d self._create_image_helper(enable_swap)"},{"line_number":7067,"context_line":"            want_files \u003d ["},{"line_number":7068,"context_line":"                {\u0027filename\u0027: \u0027356a192b7913b04c54574d18c28d46e6395428ab\u0027,"},{"line_number":7069,"context_line":"                 \u0027size\u0027: 10 * units.Gi},"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_8f7152aa","line":7066,"updated":"2015-02-25 09:33:53.000000000","message":"indentation is broken here, fixed.","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"9c9e3bcf928972abe2729ed5ee9c929c47737993","unresolved":false,"context_lines":[{"line_number":8267,"context_line":"        # image backend store"},{"line_number":8268,"context_line":"        _, imported_files \u003d self._create_image_helper(enable_configdrive,"},{"line_number":8269,"context_line":"                                                      suffix\u003d\u0027.rescue\u0027)"},{"line_number":8270,"context_line":"        self.assertTrue(imported_files[0][0].endswith(\u0027/disk.config.rescue\u0027))"},{"line_number":8271,"context_line":"        self.assertEqual(\u0027disk.config.rescue\u0027, imported_files[0][1])"},{"line_number":8272,"context_line":""},{"line_number":8273,"context_line":"    @mock.patch.object(utils, \u0027execute\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_bdbd5004","line":8270,"updated":"2015-02-25 18:39:05.000000000","message":"There is a mismatch with the assertTrue above.\nThe local file ([0][0]) doesn\u0027t get the suffix. So I presume the above needs to change s/config.rescue/config/","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"afafa0aa8bde5aba2ce99df42f34fbecc2248990","unresolved":false,"context_lines":[{"line_number":8267,"context_line":"        # image backend store"},{"line_number":8268,"context_line":"        _, imported_files \u003d self._create_image_helper(enable_configdrive,"},{"line_number":8269,"context_line":"                                                      suffix\u003d\u0027.rescue\u0027)"},{"line_number":8270,"context_line":"        self.assertTrue(imported_files[0][0].endswith(\u0027/disk.config.rescue\u0027))"},{"line_number":8271,"context_line":"        self.assertEqual(\u0027disk.config.rescue\u0027, imported_files[0][1])"},{"line_number":8272,"context_line":""},{"line_number":8273,"context_line":"    @mock.patch.object(utils, \u0027execute\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_1ea30f50","line":8270,"in_reply_to":"ba7be1f8_741c8678","updated":"2015-03-02 14:56:57.000000000","message":"Ah right. This test backported to icehouse thus also depends on the fix for bug 1334024","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"f7b0e355c6f7752db4ea2cb10826846b585b1642","unresolved":false,"context_lines":[{"line_number":8267,"context_line":"        # image backend store"},{"line_number":8268,"context_line":"        _, imported_files \u003d self._create_image_helper(enable_configdrive,"},{"line_number":8269,"context_line":"                                                      suffix\u003d\u0027.rescue\u0027)"},{"line_number":8270,"context_line":"        self.assertTrue(imported_files[0][0].endswith(\u0027/disk.config.rescue\u0027))"},{"line_number":8271,"context_line":"        self.assertEqual(\u0027disk.config.rescue\u0027, imported_files[0][1])"},{"line_number":8272,"context_line":""},{"line_number":8273,"context_line":"    @mock.patch.object(utils, \u0027execute\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_741c8678","line":8270,"in_reply_to":"ba7be1f8_bdbd5004","updated":"2015-02-27 07:27:40.000000000","message":"The local file have the suffix too. See driver.py L2848","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":7135,"context_line":"                                      mkfs\u003dTrue)"},{"line_number":7136,"context_line":""},{"line_number":7137,"context_line":"    def _create_image_helper(self, callback, suffix\u003d\u0027\u0027):"},{"line_number":7138,"context_line":"        got_files \u003d []"},{"line_number":7139,"context_line":"        imported_files \u003d []"},{"line_number":7140,"context_line":""},{"line_number":7141,"context_line":"        def fake_image(self, instance, name, image_type\u003d\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_0b25785b","line":7138,"updated":"2015-03-25 15:57:58.000000000","message":"Please avoid co-mingling stylistic changes -- it\u0027s more difficult to see exactly what this patch is changing vs. a straight transformation of the source code to follow a different convention.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":7175,"context_line":"        instance_ref[\u0027image_ref\u0027] \u003d 1"},{"line_number":7176,"context_line":"        # NOTE(mikal): use this callback to tweak the instance to match"},{"line_number":7177,"context_line":"        # what you\u0027re trying to test"},{"line_number":7178,"context_line":"        callback(instance_ref)"},{"line_number":7179,"context_line":"        instance \u003d objects.Instance(**instance_ref)"},{"line_number":7180,"context_line":"        # Turn on some swap to exercise that codepath in _create_image"},{"line_number":7181,"context_line":"        instance.flavor.swap \u003d 500"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_abc38455","line":7178,"updated":"2015-03-25 15:57:58.000000000","message":"Is this callback actually used?","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":12244,"context_line":"                                    mox.IgnoreArg())"},{"line_number":12245,"context_line":""},{"line_number":12246,"context_line":"        imagebackend.Backend.image(instance, \u0027kernel.rescue\u0027, \u0027raw\u0027"},{"line_number":12247,"context_line":"                                   ).AndReturn(fake_imagebackend.Raw())"},{"line_number":12248,"context_line":"        imagebackend.Backend.image(instance, \u0027ramdisk.rescue\u0027, \u0027raw\u0027"},{"line_number":12249,"context_line":"                                   ).AndReturn(fake_imagebackend.Raw())"},{"line_number":12250,"context_line":"        imagebackend.Backend.image(instance, \u0027disk.rescue\u0027, \u0027default\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_8b740837","line":12247,"updated":"2015-03-25 15:57:58.000000000","message":"Avoid unrelated whitespace changes.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":12246,"context_line":"        imagebackend.Backend.image(instance, \u0027kernel.rescue\u0027, \u0027raw\u0027"},{"line_number":12247,"context_line":"                                   ).AndReturn(fake_imagebackend.Raw())"},{"line_number":12248,"context_line":"        imagebackend.Backend.image(instance, \u0027ramdisk.rescue\u0027, \u0027raw\u0027"},{"line_number":12249,"context_line":"                                   ).AndReturn(fake_imagebackend.Raw())"},{"line_number":12250,"context_line":"        imagebackend.Backend.image(instance, \u0027disk.rescue\u0027, \u0027default\u0027"},{"line_number":12251,"context_line":"                                   ).AndReturn(fake_imagebackend.Raw())"},{"line_number":12252,"context_line":"        imagebackend.Backend.image(instance, \u0027disk.config.rescue\u0027, \u0027raw\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_ab71c445","line":12249,"updated":"2015-03-25 15:57:58.000000000","message":"Ditto","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":12270,"context_line":"                                            content\u003dmox.IgnoreArg(),"},{"line_number":12271,"context_line":"                                            extra_md\u003dmox.IgnoreArg(),"},{"line_number":12272,"context_line":"                                            network_info\u003dmox.IgnoreArg())"},{"line_number":12273,"context_line":""},{"line_number":12274,"context_line":"        image_meta \u003d {\u0027id\u0027: \u0027fake\u0027, \u0027name\u0027: \u0027fake\u0027}"},{"line_number":12275,"context_line":"        self.drvr._get_guest_xml(mox.IgnoreArg(), instance,"},{"line_number":12276,"context_line":"                                network_info, mox.IgnoreArg(),"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_cb8a801a","line":12273,"updated":"2015-03-25 15:57:58.000000000","message":"Unrelated whitespace change.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"}],"nova/tests/unit/virt/libvirt/test_rbd.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    @mock.patch.object(rbd_utils, \u0027rbd\u0027)"},{"line_number":287,"context_line":"    @mock.patch.object(rbd_utils, \u0027rados\u0027)"},{"line_number":288,"context_line":"    @mock.patch.object(rbd_utils, \u0027RADOSClient\u0027)"},{"line_number":289,"context_line":"    def test_remove_image(self, mock_client, mock_rados, mock_rbd):"},{"line_number":290,"context_line":"        name \u003d \u002712345_disk.config.rescue\u0027"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        rbd \u003d mock_rbd.RBD.return_value"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_3ffb52c2","line":289,"updated":"2015-03-25 15:57:58.000000000","message":"Please add test cases for the exceptions that could be thrown within and from remove_image.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e760e49785dc05810f3857477104be145e0d96d4","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    @mock.patch.object(rbd_utils, \u0027rbd\u0027)"},{"line_number":287,"context_line":"    @mock.patch.object(rbd_utils, \u0027rados\u0027)"},{"line_number":288,"context_line":"    @mock.patch.object(rbd_utils, \u0027RADOSClient\u0027)"},{"line_number":289,"context_line":"    def test_remove_image(self, mock_client, mock_rados, mock_rbd):"},{"line_number":290,"context_line":"        name \u003d \u002712345_disk.config.rescue\u0027"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        rbd \u003d mock_rbd.RBD.return_value"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_f1f72157","line":289,"in_reply_to":"1a6ced46_3ffb52c2","updated":"2015-03-25 20:37:05.000000000","message":"Unfortunately, this is hard to do because of the design of the code and the fact that we don\u0027t have the rbd module in unit tests to grab a reference to the exception :(","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        self.driver.remove_image(name)"},{"line_number":296,"context_line":"        rbd.remove.assert_called_once_with(client.ioctx, name)"},{"line_number":297,"context_line":"        client.__enter__.assert_called_once_with()"},{"line_number":298,"context_line":"        client.__exit__.assert_called_once_with(None, None, None)"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_5fdc8e73","line":298,"updated":"2015-03-25 15:57:58.000000000","message":"An inline comment would be helpful for these last two assertions. What are they checking?","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"}],"nova/tests/virt/libvirt/test_driver.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8ea3a877c13fdd34da9614cd5f8e13df8c155668","unresolved":false,"context_lines":[{"line_number":12046,"context_line":"                        ).AndReturn(None)"},{"line_number":12047,"context_line":"        imagebackend.Image.import_file(mox.IgnoreArg(),"},{"line_number":12048,"context_line":"                                       mox.IgnoreArg(),"},{"line_number":12049,"context_line":"                                       mox.IgnoreArg())"},{"line_number":12050,"context_line":""},{"line_number":12051,"context_line":"        image_meta \u003d {\u0027id\u0027: \u0027fake\u0027, \u0027name\u0027: \u0027fake\u0027}"},{"line_number":12052,"context_line":"        self.libvirtconnection._get_guest_xml(mox.IgnoreArg(), instance,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9df570_b3636419","line":12049,"updated":"2014-09-22 15:39:18.000000000","message":"Can we add a test that verifies that the RBD backend\u0027s import_file() call is made with appropriate parameters?","commit_id":"13bc020680f42fa1a4dbabc4383f8432036af76c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"7199cfd9687adf2b45bfa7b1fba9745528ade6c6","unresolved":false,"context_lines":[{"line_number":12046,"context_line":"                        ).AndReturn(None)"},{"line_number":12047,"context_line":"        imagebackend.Image.import_file(mox.IgnoreArg(),"},{"line_number":12048,"context_line":"                                       mox.IgnoreArg(),"},{"line_number":12049,"context_line":"                                       mox.IgnoreArg())"},{"line_number":12050,"context_line":""},{"line_number":12051,"context_line":"        image_meta \u003d {\u0027id\u0027: \u0027fake\u0027, \u0027name\u0027: \u0027fake\u0027}"},{"line_number":12052,"context_line":"        self.libvirtconnection._get_guest_xml(mox.IgnoreArg(), instance,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9df570_8472867a","line":12049,"in_reply_to":"da9df570_b3636419","updated":"2014-09-23 02:18:16.000000000","message":"Sure.","commit_id":"13bc020680f42fa1a4dbabc4383f8432036af76c"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"4c328a9a5e51b062bdbd2ede56aef43a70edd334","unresolved":false,"context_lines":[{"line_number":3093,"context_line":"                    ceph_conf\u003dCONF.libvirt.images_rbd_ceph_conf,"},{"line_number":3094,"context_line":"                    rbd_user\u003dCONF.libvirt.rbd_user)"},{"line_number":3095,"context_line":"                rbd_driver.import_image("},{"line_number":3096,"context_line":"                    configdrive_path, \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))"},{"line_number":3097,"context_line":""},{"line_number":3098,"context_line":"        # File injection only if needed"},{"line_number":3099,"context_line":"        elif inject_files and CONF.libvirt.inject_partition !\u003d -2:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9df570_8888f423","line":3096,"updated":"2014-09-22 08:53:55.000000000","message":"I really consider any time we have \u0027if CONF.libvirt.images_type \u003d\u003d \"blah\"\u0027 in driver.py to be a bug, because it indicates we\u0027ve not properly taken advantage of our imagebackend abstraction. Lets introduce a new method in imagebackend.py \u0027import\u0027, so that we can do\n\n   image(\u0027disk.config\u0027).import(configdrive_path, \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))\n\nThe Rbd class can do the logic you have here, and the other Image subclasses can simply be no-ops.","commit_id":"b3ee6a14c2dc1ced7ce775a6806da74a0f84b423"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"1f6f9e1c729556c580ba8c59d4e56f7b1c222c1e","unresolved":false,"context_lines":[{"line_number":3093,"context_line":"                    ceph_conf\u003dCONF.libvirt.images_rbd_ceph_conf,"},{"line_number":3094,"context_line":"                    rbd_user\u003dCONF.libvirt.rbd_user)"},{"line_number":3095,"context_line":"                rbd_driver.import_image("},{"line_number":3096,"context_line":"                    configdrive_path, \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))"},{"line_number":3097,"context_line":""},{"line_number":3098,"context_line":"        # File injection only if needed"},{"line_number":3099,"context_line":"        elif inject_files and CONF.libvirt.inject_partition !\u003d -2:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9df570_689030ed","line":3096,"in_reply_to":"da9df570_8888f423","updated":"2014-09-22 09:07:37.000000000","message":"That\u0027s a fair alternative, although I kind of sort of hate the way imagebackend works at the moment so I don\u0027t love expanding it. I\u0027ll have a go at that after dinner unless you want to...","commit_id":"b3ee6a14c2dc1ced7ce775a6806da74a0f84b423"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"83cd9660ce29e7ef879719d91e5d8d06e19c1fa2","unresolved":false,"context_lines":[{"line_number":2864,"context_line":"                        LOG.error(_LE(\u0027Creating config drive failed \u0027"},{"line_number":2865,"context_line":"                                      \u0027with error: %s\u0027),"},{"line_number":2866,"context_line":"                                  e, instance\u003dinstance)"},{"line_number":2867,"context_line":""},{"line_number":2868,"context_line":"            # Tell the storage backend about the config drive"},{"line_number":2869,"context_line":"            config_drive_image \u003d self.image_backend.image("},{"line_number":2870,"context_line":"                instance, \u0027disk.config\u0027 + suffix,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_4ec43692","line":2867,"updated":"2014-12-09 10:11:59.000000000","message":"I think it is probably good practice to have\n\n   try:\n\n....","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"be5a60ce64be03d4a8fbe373d77e6f2241a66c1f","unresolved":false,"context_lines":[{"line_number":2864,"context_line":"                        LOG.error(_LE(\u0027Creating config drive failed \u0027"},{"line_number":2865,"context_line":"                                      \u0027with error: %s\u0027),"},{"line_number":2866,"context_line":"                                  e, instance\u003dinstance)"},{"line_number":2867,"context_line":""},{"line_number":2868,"context_line":"            # Tell the storage backend about the config drive"},{"line_number":2869,"context_line":"            config_drive_image \u003d self.image_backend.image("},{"line_number":2870,"context_line":"                instance, \u0027disk.config\u0027 + suffix,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_b423c9bb","line":2867,"in_reply_to":"3a961159_4ec43692","updated":"2015-02-25 09:33:53.000000000","message":"Done","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"2b11ddbe13a98a6aba8742d24f980bc9ee364306","unresolved":false,"context_lines":[{"line_number":2871,"context_line":"                self._get_disk_config_image_type())"},{"line_number":2872,"context_line":"            config_drive_image.import_file("},{"line_number":2873,"context_line":"                instance, configdrive_path,"},{"line_number":2874,"context_line":"                \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))"},{"line_number":2875,"context_line":""},{"line_number":2876,"context_line":"            # NOTE(mikal): if the config drive was imported into RBD, then we"},{"line_number":2877,"context_line":"            # no longer need the local copy"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_e42daf96","line":2874,"updated":"2015-02-24 16:55:11.000000000","message":"This should be just \u0027disk.config\u0027 as otherwise you\u0027re doubling the instance.uuid and then qemu will get the wrong name to look for and fail","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"be5a60ce64be03d4a8fbe373d77e6f2241a66c1f","unresolved":false,"context_lines":[{"line_number":2871,"context_line":"                self._get_disk_config_image_type())"},{"line_number":2872,"context_line":"            config_drive_image.import_file("},{"line_number":2873,"context_line":"                instance, configdrive_path,"},{"line_number":2874,"context_line":"                \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))"},{"line_number":2875,"context_line":""},{"line_number":2876,"context_line":"            # NOTE(mikal): if the config drive was imported into RBD, then we"},{"line_number":2877,"context_line":"            # no longer need the local copy"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_8012ff06","line":2874,"in_reply_to":"ba7be1f8_e42daf96","updated":"2015-02-25 09:33:53.000000000","message":"Done, I have also added a check on this parameter into the test.","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"83cd9660ce29e7ef879719d91e5d8d06e19c1fa2","unresolved":false,"context_lines":[{"line_number":2872,"context_line":"            config_drive_image.import_file("},{"line_number":2873,"context_line":"                instance, configdrive_path,"},{"line_number":2874,"context_line":"                \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))"},{"line_number":2875,"context_line":""},{"line_number":2876,"context_line":"            # NOTE(mikal): if the config drive was imported into RBD, then we"},{"line_number":2877,"context_line":"            # no longer need the local copy"},{"line_number":2878,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_aebbda0c","line":2875,"updated":"2014-12-09 10:11:59.000000000","message":".....\n\n    finally:","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"be5a60ce64be03d4a8fbe373d77e6f2241a66c1f","unresolved":false,"context_lines":[{"line_number":2872,"context_line":"            config_drive_image.import_file("},{"line_number":2873,"context_line":"                instance, configdrive_path,"},{"line_number":2874,"context_line":"                \u0027%s_%s\u0027 % (instance.uuid, \u0027disk.config\u0027))"},{"line_number":2875,"context_line":""},{"line_number":2876,"context_line":"            # NOTE(mikal): if the config drive was imported into RBD, then we"},{"line_number":2877,"context_line":"            # no longer need the local copy"},{"line_number":2878,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_5439adf0","line":2875,"in_reply_to":"3a961159_aebbda0c","updated":"2015-02-25 09:33:53.000000000","message":"Done","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"83cd9660ce29e7ef879719d91e5d8d06e19c1fa2","unresolved":false,"context_lines":[{"line_number":2876,"context_line":"            # NOTE(mikal): if the config drive was imported into RBD, then we"},{"line_number":2877,"context_line":"            # no longer need the local copy"},{"line_number":2878,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2879,"context_line":"                os.unlink(configdrive_path)"},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":"        # File injection only if needed"},{"line_number":2882,"context_line":"        elif inject_files and CONF.libvirt.inject_partition !\u003d -2:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a961159_4e4b562b","line":2879,"updated":"2014-12-09 10:11:59.000000000","message":"So this runs even if RBD import throws an exception for some reason","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"be5a60ce64be03d4a8fbe373d77e6f2241a66c1f","unresolved":false,"context_lines":[{"line_number":2876,"context_line":"            # NOTE(mikal): if the config drive was imported into RBD, then we"},{"line_number":2877,"context_line":"            # no longer need the local copy"},{"line_number":2878,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2879,"context_line":"                os.unlink(configdrive_path)"},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":"        # File injection only if needed"},{"line_number":2882,"context_line":"        elif inject_files and CONF.libvirt.inject_partition !\u003d -2:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_9426c5cc","line":2879,"in_reply_to":"3a961159_4e4b562b","updated":"2015-02-25 09:33:53.000000000","message":"Done","commit_id":"1e6bdee4774c2be3ad7127017ad921a5d31f2b10"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"0bd0ef6deca0af504c0dc2572c7e26e7dd9ea177","unresolved":false,"context_lines":[{"line_number":5766,"context_line":""},{"line_number":5767,"context_line":"        image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":5768,"context_line":"            instance.system_metadata)"},{"line_number":5769,"context_line":""},{"line_number":5770,"context_line":"        if not (is_shared_instance_path and is_shared_block_storage):"},{"line_number":5771,"context_line":"            # NOTE(mikal): live migration of instances using config drive is"},{"line_number":5772,"context_line":"            # not supported because of a bug in libvirt (read only devices"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_1aa2e5fc","line":5769,"updated":"2015-02-25 17:00:38.000000000","message":"Can\u0027t we remove this restriction now? I.E.\n\n    if not (is_shared_instance_path or is_shared_block_storage):","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"f7b0e355c6f7752db4ea2cb10826846b585b1642","unresolved":false,"context_lines":[{"line_number":5766,"context_line":""},{"line_number":5767,"context_line":"        image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":5768,"context_line":"            instance.system_metadata)"},{"line_number":5769,"context_line":""},{"line_number":5770,"context_line":"        if not (is_shared_instance_path and is_shared_block_storage):"},{"line_number":5771,"context_line":"            # NOTE(mikal): live migration of instances using config drive is"},{"line_number":5772,"context_line":"            # not supported because of a bug in libvirt (read only devices"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_b448be88","line":5769,"in_reply_to":"ba7be1f8_1aa2e5fc","updated":"2015-02-27 07:27:40.000000000","message":"Done","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7c4cb65c0b04fa2e1efcbeac84e1669870a6d23a","unresolved":false,"context_lines":[{"line_number":2587,"context_line":""},{"line_number":2588,"context_line":"    @staticmethod"},{"line_number":2589,"context_line":"    def _get_disk_config_image_type():"},{"line_number":2590,"context_line":"        if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2591,"context_line":"            # TODO(mikal): there is a bug here if images_type has"},{"line_number":2592,"context_line":"            # changed since creation of the instance, but I am pretty"},{"line_number":2593,"context_line":"            # sure that this bug already exists."}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_af3a96ca","line":2590,"updated":"2015-03-03 15:10:06.000000000","message":"guess you could do:\nreturn \u0027rbd\u0027 if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027 else \u0027raw\u0027","commit_id":"892666f5f11147d1f2951449f425af4666a309ef"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"c60a2a1db71c68129661e1f1837f44484117b96e","unresolved":false,"context_lines":[{"line_number":2587,"context_line":""},{"line_number":2588,"context_line":"    @staticmethod"},{"line_number":2589,"context_line":"    def _get_disk_config_image_type():"},{"line_number":2590,"context_line":"        if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2591,"context_line":"            # TODO(mikal): there is a bug here if images_type has"},{"line_number":2592,"context_line":"            # changed since creation of the instance, but I am pretty"},{"line_number":2593,"context_line":"            # sure that this bug already exists."}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_f85f6f73","line":2590,"in_reply_to":"ba7be1f8_af3a96ca","updated":"2015-03-11 11:59:14.000000000","message":"Done","commit_id":"892666f5f11147d1f2951449f425af4666a309ef"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"3bfe31b74e314fc1d22328b72e276cd48a94337f","unresolved":false,"context_lines":[{"line_number":5752,"context_line":""},{"line_number":5753,"context_line":"        image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":5754,"context_line":"            instance.system_metadata)"},{"line_number":5755,"context_line":""},{"line_number":5756,"context_line":"        if not (is_shared_instance_path or is_shared_block_storage):"},{"line_number":5757,"context_line":"            # NOTE(mikal): live migration of instances using config drive is"},{"line_number":5758,"context_line":"            # not supported because of a bug in libvirt (read only devices"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_31aaeb19","line":5755,"updated":"2015-03-11 20:10:19.000000000","message":"This is mysterious dark voodoo magics. I had to write down what these meant in plain english and say them both out loud just to be able to consider what this meant. AFAICT they\u0027re both wrong :)\n\nIIUC the test here should be: is there a config drive which resides on non-shared storage? I don\u0027t think this is directly related to block storage at all, which means that these 2 values are actually proxies for logic elsewhere.\n\nIs there a way to express the intended test directly? If not, could we please have a 20 page comment explaining all the context embedded in that 1 line of evilness?","commit_id":"6a5f620551f19f6d5e05317ed7935f7655ebb0ca"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"56bc238c87a705a852cf3715edc3762f46525ad0","unresolved":false,"context_lines":[{"line_number":5752,"context_line":""},{"line_number":5753,"context_line":"        image_meta \u003d utils.get_image_from_system_metadata("},{"line_number":5754,"context_line":"            instance.system_metadata)"},{"line_number":5755,"context_line":""},{"line_number":5756,"context_line":"        if not (is_shared_instance_path or is_shared_block_storage):"},{"line_number":5757,"context_line":"            # NOTE(mikal): live migration of instances using config drive is"},{"line_number":5758,"context_line":"            # not supported because of a bug in libvirt (read only devices"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_abc9a85b","line":5755,"in_reply_to":"9a80dd14_31aaeb19","updated":"2015-03-19 16:41:10.000000000","message":"I write down the logic into multiple condition statement with a comment, hope that help for the comprehension.","commit_id":"6a5f620551f19f6d5e05317ed7935f7655ebb0ca"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":2588,"context_line":"    def _get_disk_config_image_type():"},{"line_number":2589,"context_line":"        # TODO(mikal): there is a bug here if images_type has"},{"line_number":2590,"context_line":"        # changed since creation of the instance, but I am pretty"},{"line_number":2591,"context_line":"        # sure that this bug already exists."},{"line_number":2592,"context_line":"        return \u0027rbd\u0027 if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027 else \u0027raw\u0027"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"    def _chown_console_log_for_instance(self, instance):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_b24f796a","line":2591,"updated":"2015-03-25 15:57:58.000000000","message":"Can\u0027t this information be gleaned from the instance? If not, then the comment should state that explicitly.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":2684,"context_line":"        booted_from_volume \u003d self._is_booted_from_volume("},{"line_number":2685,"context_line":"            instance, disk_mapping)"},{"line_number":2686,"context_line":""},{"line_number":2687,"context_line":"        # NOTE(sileht): many callers of this method assume that this"},{"line_number":2688,"context_line":"        # method doesn\u0027t fail if an image already exists but instead"},{"line_number":2689,"context_line":"        # think that it will be reused (ie: (live)-migration/resize)"},{"line_number":2690,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_df6a3eed","line":2687,"updated":"2015-03-25 15:57:58.000000000","message":"Which method? _create_image or image, which is immediately below?","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":2686,"context_line":""},{"line_number":2687,"context_line":"        # NOTE(sileht): many callers of this method assume that this"},{"line_number":2688,"context_line":"        # method doesn\u0027t fail if an image already exists but instead"},{"line_number":2689,"context_line":"        # think that it will be reused (ie: (live)-migration/resize)"},{"line_number":2690,"context_line":""},{"line_number":2691,"context_line":"        def image(fname, image_type\u003dCONF.libvirt.images_type):"},{"line_number":2692,"context_line":"            return self.image_backend.image(instance,"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_9246fd4d","line":2689,"updated":"2015-03-25 15:57:58.000000000","message":"What *should* this method do?","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":2855,"context_line":"                    instance, configdrive_path, \u0027disk.config\u0027 + suffix)"},{"line_number":2856,"context_line":"            finally:"},{"line_number":2857,"context_line":"                # NOTE(mikal): if the config drive was imported into RBD, then"},{"line_number":2858,"context_line":"                # we no longer need the local copy"},{"line_number":2859,"context_line":"                if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2860,"context_line":"                    os.unlink(configdrive_path)"},{"line_number":2861,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_52dc8573","line":2858,"updated":"2015-03-25 15:57:58.000000000","message":"This finally block is guaranteed to execute even in the presence of errors... If the import fails, should the local copy still be deleted? (I think not because that would leave no way to access the information.)","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e760e49785dc05810f3857477104be145e0d96d4","unresolved":false,"context_lines":[{"line_number":2855,"context_line":"                    instance, configdrive_path, \u0027disk.config\u0027 + suffix)"},{"line_number":2856,"context_line":"            finally:"},{"line_number":2857,"context_line":"                # NOTE(mikal): if the config drive was imported into RBD, then"},{"line_number":2858,"context_line":"                # we no longer need the local copy"},{"line_number":2859,"context_line":"                if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2860,"context_line":"                    os.unlink(configdrive_path)"},{"line_number":2861,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_248179c4","line":2858,"in_reply_to":"1a6ced46_0ee01ccc","updated":"2015-03-25 20:37:05.000000000","message":"Actually, looks like we\u0027re going to fail here on exception anyway, so perhaps this is just ensuring that the thing we created gets cleaned up either way.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aa14af428f229182a50be8252b6395b8dc979c96","unresolved":false,"context_lines":[{"line_number":2855,"context_line":"                    instance, configdrive_path, \u0027disk.config\u0027 + suffix)"},{"line_number":2856,"context_line":"            finally:"},{"line_number":2857,"context_line":"                # NOTE(mikal): if the config drive was imported into RBD, then"},{"line_number":2858,"context_line":"                # we no longer need the local copy"},{"line_number":2859,"context_line":"                if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2860,"context_line":"                    os.unlink(configdrive_path)"},{"line_number":2861,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_0ee01ccc","line":2858,"in_reply_to":"1a6ced46_52dc8573","updated":"2015-03-25 19:48:50.000000000","message":"Yeah, agree. Maybe this was supposed to be a try..else?","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":5768,"context_line":"                # Please see bug/1246201 for details on the libvirt bug."},{"line_number":5769,"context_line":"                pass"},{"line_number":5770,"context_line":"            else:"},{"line_number":5771,"context_line":"                raise exception.NoLiveMigrationForConfigDriveInLibVirt()"},{"line_number":5772,"context_line":""},{"line_number":5773,"context_line":"        if not is_shared_instance_path:"},{"line_number":5774,"context_line":"            instance_dir \u003d libvirt_utils.get_instance_path_at_destination("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_ab18e475","line":5771,"updated":"2015-03-25 15:57:58.000000000","message":"This refactoring does not preserve the original behavior. In particular, the original can raise in exception if is_shared_instance_path is False or is_shared_block_storage is False, but this code can raise an exception only when neither is True.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"9f5a807f9a27f4b4dfdd706446c46f037b9aba0d","unresolved":false,"context_lines":[{"line_number":5768,"context_line":"                # Please see bug/1246201 for details on the libvirt bug."},{"line_number":5769,"context_line":"                pass"},{"line_number":5770,"context_line":"            else:"},{"line_number":5771,"context_line":"                raise exception.NoLiveMigrationForConfigDriveInLibVirt()"},{"line_number":5772,"context_line":""},{"line_number":5773,"context_line":"        if not is_shared_instance_path:"},{"line_number":5774,"context_line":"            instance_dir \u003d libvirt_utils.get_instance_path_at_destination("}],"source_content_type":"text/x-python","patch_set":20,"id":"fa963961_423452dd","line":5771,"in_reply_to":"1a6ced46_66954386","updated":"2015-03-26 13:28:21.000000000","message":"Sorry, I missed your comment on patch set 14.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"897914aeeb36e7592f78966ecd4fc8cc133aefa0","unresolved":false,"context_lines":[{"line_number":5768,"context_line":"                # Please see bug/1246201 for details on the libvirt bug."},{"line_number":5769,"context_line":"                pass"},{"line_number":5770,"context_line":"            else:"},{"line_number":5771,"context_line":"                raise exception.NoLiveMigrationForConfigDriveInLibVirt()"},{"line_number":5772,"context_line":""},{"line_number":5773,"context_line":"        if not is_shared_instance_path:"},{"line_number":5774,"context_line":"            instance_dir \u003d libvirt_utils.get_instance_path_at_destination("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_66954386","line":5771,"in_reply_to":"1a6ced46_ab18e475","updated":"2015-03-25 16:09:25.000000000","message":"This was a refactor _and_ a change to relax the constraints.\nThe refactor was requested on a previous review","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dcd03232e134dfb2eed6918cb839f1eb064d89e5","unresolved":false,"context_lines":[{"line_number":5869,"context_line":"            instance.system_metadata)"},{"line_number":5870,"context_line":""},{"line_number":5871,"context_line":"        if configdrive.required_by(instance):"},{"line_number":5872,"context_line":"            if is_shared_block_storage:"},{"line_number":5873,"context_line":"                # NOTE(sileht): configdrive is stored into the block storage"},{"line_number":5874,"context_line":"                # kvm is a block device, live migration will work"},{"line_number":5875,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_5ca9607a","line":5872,"updated":"2015-07-21 11:12:02.000000000","message":"# You can add the comments above\nif (is_shared_block_storage or\n    is_shared_instance_path or\n    CONF.config_drive_format \u003d\u003d \u0027vfat\u0027):\n    pass\nelse:\n    raise ...","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":1313,"name":"yaguang","display_name":"Yaguang Tang","email":"heut2008@gmail.com","username":"heut2008"},"change_message_id":"6c920e16796a708816bc8c7ddd1db6445495e69d","unresolved":false,"context_lines":[{"line_number":5869,"context_line":"            instance.system_metadata)"},{"line_number":5870,"context_line":""},{"line_number":5871,"context_line":"        if configdrive.required_by(instance):"},{"line_number":5872,"context_line":"            if is_shared_block_storage:"},{"line_number":5873,"context_line":"                # NOTE(sileht): configdrive is stored into the block storage"},{"line_number":5874,"context_line":"                # kvm is a block device, live migration will work"},{"line_number":5875,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_73ad549a","line":5872,"in_reply_to":"3a50d1a3_5ca9607a","updated":"2015-08-01 03:56:50.000000000","message":"Done","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"52ba2225c650ea43b187445a1d679c6c7c7c56e7","unresolved":false,"context_lines":[{"line_number":2875,"context_line":"            finally:"},{"line_number":2876,"context_line":"                # NOTE(mikal): if the config drive was imported into RBD, then"},{"line_number":2877,"context_line":"                # we no longer need the local copy"},{"line_number":2878,"context_line":"                if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":2879,"context_line":"                    os.unlink(configdrive_path)"},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":"        # File injection only if needed"}],"source_content_type":"text/x-python","patch_set":29,"id":"1a4dcd0f_f7999220","line":2878,"updated":"2015-08-10 09:11:08.000000000","message":"I think this really should be a call back into the image backend, as only it should know if the import_file was a no op or not.\n\nBut its a nit we can fix later.","commit_id":"adecf780d3ed4315e4ce305cb1821d493650494b"}],"nova/virt/libvirt/imagebackend.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"61bc1f6c8d8496f527e7eb5038ca1a22cc89f909","unresolved":false,"context_lines":[{"line_number":750,"context_line":"    def import_file(self, instance, local_file, remote_name):"},{"line_number":751,"context_line":"        self.driver.import_image(local_file,"},{"line_number":752,"context_line":"                                 \u0027%s_%s\u0027 % (instance.uuid, remote_name))"},{"line_number":753,"context_line":"        os.unlink(local_file)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"class Backend(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_4a2ea0a6","line":753,"updated":"2014-12-02 12:49:34.000000000","message":"I don\u0027t think we should be unlinking the \"local_file\" here. IMHO a method named \"import_file\" indicates that the data is imported and the original image not changed in any way - IOW deleting the local file is an unexpected side effect. The caller should be left to delete it, if they wish to IMHO.","commit_id":"957f7c9528548f92f94e057aa02a01cc6bad8d9c"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"27805c7191943031da88309de8b4475b84af4bcb","unresolved":false,"context_lines":[{"line_number":750,"context_line":"    def import_file(self, instance, local_file, remote_name):"},{"line_number":751,"context_line":"        self.driver.import_image(local_file,"},{"line_number":752,"context_line":"                                 \u0027%s_%s\u0027 % (instance.uuid, remote_name))"},{"line_number":753,"context_line":"        os.unlink(local_file)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":""},{"line_number":756,"context_line":"class Backend(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_a5922655","line":753,"in_reply_to":"5a890539_4a2ea0a6","updated":"2014-12-08 23:39:43.000000000","message":"Done","commit_id":"957f7c9528548f92f94e057aa02a01cc6bad8d9c"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"3dc700bc7c5f1e1313107a22d0d8e6d96a92a4f3","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        \"\"\"Import an image from local storage into this backend."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        Import a local file into the store used by this image type. Remove"},{"line_number":381,"context_line":"        the local file if it is imported into a store. Note that this is a"},{"line_number":382,"context_line":"        noop for stores using local disk (the local file is considered \"in"},{"line_number":383,"context_line":"        the store\")."},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_e18ad3bd","line":381,"updated":"2015-02-25 14:25:54.000000000","message":"Having the \"Remove the local file\" comment here implies this method should do that, which is not what the Rbd class does. Maybe \"After this method succeeds, be sure to remove the local file\"?","commit_id":"6a02806f4d3faefc254ae3e339548c3e2cd4d3a3"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"5e531c476550c17126f8d694a8a2fef635534298","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        \"\"\"Import an image from local storage into this backend."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        Import a local file into the store used by this image type. Remove"},{"line_number":381,"context_line":"        the local file if it is imported into a store. Note that this is a"},{"line_number":382,"context_line":"        noop for stores using local disk (the local file is considered \"in"},{"line_number":383,"context_line":"        the store\")."},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_afa94be1","line":381,"in_reply_to":"ba7be1f8_e18ad3bd","updated":"2015-02-27 07:28:03.000000000","message":"Done","commit_id":"6a02806f4d3faefc254ae3e339548c3e2cd4d3a3"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"9c9e3bcf928972abe2729ed5ee9c929c47737993","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        noop for stores using local disk (the local file is considered \"in"},{"line_number":383,"context_line":"        the store\")."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        If the image already exists it will be overrided by the new file"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        :param local_file: path to the file to import"},{"line_number":388,"context_line":"        :param remote_name: the name for the file in the store"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_dd4f6432","line":385,"updated":"2015-02-25 18:39:05.000000000","message":"s/overrided/overridden/","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"f7b0e355c6f7752db4ea2cb10826846b585b1642","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        noop for stores using local disk (the local file is considered \"in"},{"line_number":383,"context_line":"        the store\")."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        If the image already exists it will be overrided by the new file"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        :param local_file: path to the file to import"},{"line_number":388,"context_line":"        :param remote_name: the name for the file in the store"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_141fcab8","line":385,"in_reply_to":"ba7be1f8_dd4f6432","updated":"2015-02-27 07:27:40.000000000","message":"Done","commit_id":"5c4bfa8fcda0fbc95bc8d7e8cc801bc50c1c3746"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":783,"context_line":"        raise exception.ImageUnacceptable(image_id\u003dimage_id_or_uri,"},{"line_number":784,"context_line":"                                          reason\u003dreason)"},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"    def import_file(self, instance, local_file, remote_name):"},{"line_number":787,"context_line":"        name \u003d \u0027%s_%s\u0027 % (instance.uuid, remote_name)"},{"line_number":788,"context_line":"        if self.check_image_exists():"},{"line_number":789,"context_line":"            self.driver.remove_image(name)"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_5f1f2e08","line":786,"updated":"2015-03-25 15:57:58.000000000","message":"Please add unit tests for this method.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"}],"nova/virt/libvirt/rbd_utils.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7c4cb65c0b04fa2e1efcbeac84e1669870a6d23a","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            except (rbd.ImageNotFound, rbd.ImageHasSnapshots):"},{"line_number":250,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s \u0027"},{"line_number":251,"context_line":"                                \u0027failed\u0027),"},{"line_number":252,"context_line":"                            {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def import_image(self, base, name):"},{"line_number":255,"context_line":"        \"\"\"Import RBD volume from image file."}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_0f456242","line":252,"updated":"2015-03-03 15:10:06.000000000","message":"alignment here is a little dodgy","commit_id":"892666f5f11147d1f2951449f425af4666a309ef"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"c60a2a1db71c68129661e1f1837f44484117b96e","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            except (rbd.ImageNotFound, rbd.ImageHasSnapshots):"},{"line_number":250,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s \u0027"},{"line_number":251,"context_line":"                                \u0027failed\u0027),"},{"line_number":252,"context_line":"                            {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def import_image(self, base, name):"},{"line_number":255,"context_line":"        \"\"\"Import RBD volume from image file."}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_d84aabab","line":252,"in_reply_to":"ba7be1f8_0f456242","updated":"2015-03-11 11:59:14.000000000","message":"Done","commit_id":"892666f5f11147d1f2951449f425af4666a309ef"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96ef6a433c48005586a1d01883566018f10cbe2d","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            try:"},{"line_number":248,"context_line":"                rbd.RBD().remove(client.ioctx, name)"},{"line_number":249,"context_line":"            except (rbd.ImageNotFound, rbd.ImageHasSnapshots):"},{"line_number":250,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":251,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    def import_image(self, base, name):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6ced46_7f322af3","line":250,"updated":"2015-03-25 15:57:58.000000000","message":"LOG.warn seems reasonable if the image isn\u0027t found (I assume the image could have been deleted separately?), but it seems more appropriate to record an error if the image has snapshots.","commit_id":"bf768549aa95a683e2acc037829f05d993d204d2"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"e91f4bd265e18236b793a0c241eb1379cdf8a9c7","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":255,"context_line":"                          {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def import_image(self, base, name):"},{"line_number":258,"context_line":"        \"\"\"Import RBD volume from image file."}],"source_content_type":"text/x-python","patch_set":26,"id":"5afe65bd_2d647520","line":255,"updated":"2015-06-02 22:04:05.000000000","message":"For these logs, shouldn\u0027t we give some explanation of why the failure? If I understand correctly, the log won\u0027t tell anything about \"image not found\" or \"image has snapshots\" the way it is here.","commit_id":"9397be798a4fab708d2c9e7e064f3d063e7eb84e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dcd03232e134dfb2eed6918cb839f1eb064d89e5","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            try:"},{"line_number":249,"context_line":"                rbd.RBD().remove(client.ioctx, name)"},{"line_number":250,"context_line":"            except rbd.ImageNotFound:"},{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_3c21f4fb","line":251,"updated":"2015-07-21 11:12:02.000000000","message":"maybe we should consider writing that the image is not found","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":1313,"name":"yaguang","display_name":"Yaguang Tang","email":"heut2008@gmail.com","username":"heut2008"},"change_message_id":"6c920e16796a708816bc8c7ddd1db6445495e69d","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            try:"},{"line_number":249,"context_line":"                rbd.RBD().remove(client.ioctx, name)"},{"line_number":250,"context_line":"            except rbd.ImageNotFound:"},{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_be5403ca","line":251,"in_reply_to":"3a50d1a3_3c21f4fb","updated":"2015-08-01 03:56:50.000000000","message":"Done","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"1bcc7e514adf25aed29f45213b2e6ef428dc3113","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            try:"},{"line_number":249,"context_line":"                rbd.RBD().remove(client.ioctx, name)"},{"line_number":250,"context_line":"            except rbd.ImageNotFound:"},{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_1fac878b","line":251,"in_reply_to":"3a50d1a3_3c21f4fb","updated":"2015-07-23 20:12:31.000000000","message":"concur","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dcd03232e134dfb2eed6918cb839f1eb064d89e5","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":255,"context_line":"                          {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def import_image(self, base, name):"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_5c1c00c1","line":254,"updated":"2015-07-21 11:12:02.000000000","message":"add that is has snapshots","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":1313,"name":"yaguang","display_name":"Yaguang Tang","email":"heut2008@gmail.com","username":"heut2008"},"change_message_id":"6c920e16796a708816bc8c7ddd1db6445495e69d","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":255,"context_line":"                          {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def import_image(self, base, name):"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_9e6027a6","line":254,"in_reply_to":"3a50d1a3_5c1c00c1","updated":"2015-08-01 03:56:50.000000000","message":"Done","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"1bcc7e514adf25aed29f45213b2e6ef428dc3113","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":252,"context_line":"                         {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":253,"context_line":"            except rbd.ImageHasSnapshots:"},{"line_number":254,"context_line":"                LOG.error(_LE(\u0027rbd remove %(volume)s in pool %(pool)s failed\u0027),"},{"line_number":255,"context_line":"                          {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def import_image(self, base, name):"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a50d1a3_3fa9437c","line":254,"in_reply_to":"3a50d1a3_5c1c00c1","updated":"2015-07-23 20:12:31.000000000","message":"ditto","commit_id":"f108ac2e670098a14db78b6408918147d00c4a5b"}],"nova/virt/libvirt/storage/rbd_utils.py":[{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"b29f0422035799c0176bfcc26e5a87f70ff93d09","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            try:"},{"line_number":249,"context_line":"                rbd.RBD().remove(client.ioctx, name)"},{"line_number":250,"context_line":"            except rbd.ImageNotFound:"},{"line_number":251,"context_line":"                LOG.warn(_LW(\u0027image %(volume)s in pool %(pool)s can not be \u0027"},{"line_number":252,"context_line":"                             \u0027found, failed to remove\u0027),"},{"line_number":253,"context_line":"                            {\u0027volume\u0027: name, \u0027pool\u0027: self.pool})"},{"line_number":254,"context_line":"            except rbd.ImageHasSnapshots:"}],"source_content_type":"text/x-python","patch_set":29,"id":"1a4dcd0f_d751fbd9","line":251,"updated":"2015-08-10 06:20:51.000000000","message":"I\u0027m not sure that\u0027s worth a warn, but its a nit.","commit_id":"adecf780d3ed4315e4ce305cb1821d493650494b"}]}
