)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"46240639f8a799be5fcb30d628c9509e3d487614","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Josh Durgin \u003cjosh.durgin@inktank.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-01-17 01:00:26 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"make rbd usable for ephemeral storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when using rbd as an image backend, nova downloads the"},{"line_number":10,"context_line":"glance image to local disk and then copies it again into rbd. This"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAUH%2F%2FEps%3D","line":7,"updated":"2014-01-17 17:51:08.000000000","message":"This is really not a useful commit summary. Please describe what you\u0027re doing in this change.","commit_id":"a79167efcd96f09d6f621523a2b5339b48c1f7b1"}],"etc/nova/nova.conf.sample":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3159fbf71ad6be61e80ef1ac8795a6dbf88333d7","unresolved":false,"context_lines":[{"line_number":2003,"context_line":"# handling images. The first extension in the list which can"},{"line_number":2004,"context_line":"# handle the image with a suitable location will be used."},{"line_number":2005,"context_line":"# (list value)"},{"line_number":2006,"context_line":"#image_handlers\u003drbd_clone,download"},{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":""},{"line_number":2009,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAUH%2F%2FY3g%3D","line":2006,"updated":"2014-01-14 12:45:40.000000000","message":"I prefer rename this to \"libvirt_rbd_clone\"","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b38b513f1bc26fba596e6065832527865820f10a","unresolved":false,"context_lines":[{"line_number":2003,"context_line":"# handling images. The first extension in the list which can"},{"line_number":2004,"context_line":"# handle the image with a suitable location will be used."},{"line_number":2005,"context_line":"# (list value)"},{"line_number":2006,"context_line":"#image_handlers\u003drbd_clone,download"},{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":""},{"line_number":2009,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAUH%2F%2FWGI%3D","line":2006,"in_reply_to":"AAAAUH%2F%2FY3g%3D","updated":"2014-01-15 01:08:15.000000000","message":"Done","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"9bd3f82b9d9b4783a4dd3ecd29ed5ce6a1aff6f7","unresolved":false,"context_lines":[{"line_number":2003,"context_line":"# handling images. The first extension in the list which can"},{"line_number":2004,"context_line":"# handle the image with a suitable location will be used."},{"line_number":2005,"context_line":"# (list value)"},{"line_number":2006,"context_line":"#image_handlers\u003dlibvirt_rbd_clone,download"},{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":""},{"line_number":2009,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAUH%2F%2BbHY%3D","line":2006,"updated":"2014-01-27 02:23:56.000000000","message":"do you think enabling this handler by default is a good choice for us?","commit_id":"60a93fc4fa36a0d8852d7f8d4b23dc7bd6094e92"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b84e72467a9988246d1fc175a1c79fb45444062c","unresolved":false,"context_lines":[{"line_number":2003,"context_line":"# handling images. The first extension in the list which can"},{"line_number":2004,"context_line":"# handle the image with a suitable location will be used."},{"line_number":2005,"context_line":"# (list value)"},{"line_number":2006,"context_line":"#image_handlers\u003dlibvirt_rbd_clone,download"},{"line_number":2007,"context_line":""},{"line_number":2008,"context_line":""},{"line_number":2009,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":12,"id":"AAAAUH%2F%2BVa8%3D","line":2006,"in_reply_to":"AAAAUH%2F%2BbHY%3D","updated":"2014-01-27 23:18:06.000000000","message":"Yes, I think nova would benefit from more defaults that don\u0027t need to change for each setup.\n\nEnabling this handler by default does nothing for deployments that do not use it (see my first comment on https://review.openstack.org/#/c/59149/6/nova/virt/libvirt/imagehandler.py).","commit_id":"60a93fc4fa36a0d8852d7f8d4b23dc7bd6094e92"}],"nova/tests/virt/libvirt/test_imagebackend.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"fdfb15a7414ad7977cdc5327d49391d63b046eef","unresolved":false,"context_lines":[{"line_number":547,"context_line":"        self.mox.VerifyAll()"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    def test_cache_base_dir_exists(self):"},{"line_number":550,"context_line":"        fn \u003d self.mox.CreateMockAnything()"},{"line_number":551,"context_line":"        image \u003d self.image_class(self.INSTANCE, self.NAME)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        self.mox.StubOutWithMock(os.path, \u0027exists\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Bl0U%3D","line":550,"updated":"2014-01-24 02:52:14.000000000","message":"duplicated with line #557?","commit_id":"faa21913eb12316a95a57e2526dac75cadf61c4d"}],"nova/tests/virt/libvirt/test_imagehandler.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"9bd3f82b9d9b4783a4dd3ecd29ed5ce6a1aff6f7","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                                               \u0027pool\u0027,"},{"line_number":90,"context_line":"                                                               \u0027image\u0027,"},{"line_number":91,"context_line":"                                                               \u0027snap\u0027)"},{"line_number":92,"context_line":"        self.assertTrue(handled)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BbGM%3D","line":92,"updated":"2014-01-27 02:23:56.000000000","message":"so it will be better if we also test \"move\" and \"remove\" functions at here since you have already implemented it.","commit_id":"60a93fc4fa36a0d8852d7f8d4b23dc7bd6094e92"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b84e72467a9988246d1fc175a1c79fb45444062c","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                                                               \u0027pool\u0027,"},{"line_number":90,"context_line":"                                                               \u0027image\u0027,"},{"line_number":91,"context_line":"                                                               \u0027snap\u0027)"},{"line_number":92,"context_line":"        self.assertTrue(handled)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BVMU%3D","line":92,"in_reply_to":"AAAAUH%2F%2BbGM%3D","updated":"2014-01-27 23:18:06.000000000","message":"Done","commit_id":"60a93fc4fa36a0d8852d7f8d4b23dc7bd6094e92"}],"nova/tests/virt/libvirt/test_libvirt.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"e1f717118e018bae7507b3832cf290f3e2e48f9c","unresolved":false,"context_lines":[{"line_number":7155,"context_line":"        self.stubs.Set(nova.tests.image.fake.FakeImageService(),"},{"line_number":7156,"context_line":"                       \u0027show\u0027, fake_image_show)"},{"line_number":7157,"context_line":""},{"line_number":7158,"context_line":"        self.executes \u003d []"},{"line_number":7159,"context_line":"        imagehandler.load_image_handlers(libvirt_driver.LibvirtDriver("},{"line_number":7160,"context_line":"                                             fake.FakeVirtAPI(), False))"},{"line_number":7161,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BQtI%3D","line":7158,"updated":"2014-01-28 15:46:56.000000000","message":"I don\u0027t understand why you moved this line up.  Seems like needless churn.","commit_id":"3955a89ce201e4aba7846900c42a417ac0b6e23d"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"23af2bb91fac2643064dd8345d45318106a98b15","unresolved":false,"context_lines":[{"line_number":7155,"context_line":"        self.stubs.Set(nova.tests.image.fake.FakeImageService(),"},{"line_number":7156,"context_line":"                       \u0027show\u0027, fake_image_show)"},{"line_number":7157,"context_line":""},{"line_number":7158,"context_line":"        self.executes \u003d []"},{"line_number":7159,"context_line":"        imagehandler.load_image_handlers(libvirt_driver.LibvirtDriver("},{"line_number":7160,"context_line":"                                             fake.FakeVirtAPI(), False))"},{"line_number":7161,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BPxo%3D","line":7158,"in_reply_to":"AAAAUH%2F%2BQtI%3D","updated":"2014-01-28 22:48:26.000000000","message":"It seems to be an artifact of my test environment that load_image_handlers() leads to using fake_exists(). Removed this change.","commit_id":"3955a89ce201e4aba7846900c42a417ac0b6e23d"}],"nova/virt/imagehandler/__init__.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"498d01c9ebe212f500973ed93c43d3abd0511915","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"image_opts \u003d ["},{"line_number":33,"context_line":"    cfg.ListOpt(\u0027image_handlers\u0027,"},{"line_number":34,"context_line":"                default\u003d[\u0027libvirt_rbd_clone\u0027, \u0027download\u0027],"},{"line_number":35,"context_line":"                help\u003d\u0027Specifies which image handler extension names to use \u0027"},{"line_number":36,"context_line":"                     \u0027for handling images. The first extension in the list \u0027"},{"line_number":37,"context_line":"                     \u0027which can handle the image with a suitable location \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAVn%2F%2FrPY%3D","line":34,"updated":"2014-03-04 18:20:15.000000000","message":"This isn\u0027t going to fly.\n\nThe image handler code is intended to be usable by multiple virt drivers. The nova/virt/driver.py constructor will load all handers. As such the default value of this config must only contain shared impls. You can\u0027t reference custom libvirt handlers in this. An admin will have to make the decision to configure that themselves","commit_id":"46bd53d50dd853f267cbd6bf8895701fc1fa3cc7"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"74e71ad18b3ba4575dc5ea6534a69d000495f769","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"image_opts \u003d ["},{"line_number":33,"context_line":"    cfg.ListOpt(\u0027image_handlers\u0027,"},{"line_number":34,"context_line":"                default\u003d[\u0027libvirt_rbd_clone\u0027, \u0027download\u0027],"},{"line_number":35,"context_line":"                help\u003d\u0027Specifies which image handler extension names to use \u0027"},{"line_number":36,"context_line":"                     \u0027for handling images. The first extension in the list \u0027"},{"line_number":37,"context_line":"                     \u0027which can handle the image with a suitable location \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAVn%2F%2FrH4%3D","line":34,"in_reply_to":"AAAAVn%2F%2FrPY%3D","updated":"2014-03-04 18:31:46.000000000","message":"Done","commit_id":"46bd53d50dd853f267cbd6bf8895701fc1fa3cc7"}],"nova/virt/imagehandler/base.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"526d86587a1a8cc5014329a068928fadd5f2273d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.associate_fn \u003d kwargs.get(\u0027associate_fn\u0027, noop)"},{"line_number":57,"context_line":"        self.disassociate_fn \u003d kwargs.get(\u0027disassociate_fn\u0027, noop)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @abc.abstractmethod"},{"line_number":60,"context_line":"    def get_schemes(self):"},{"line_number":61,"context_line":"        \"\"\"Returns a tuple of schemes which this handler can handle.\"\"\""},{"line_number":62,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BsX4%3D","line":59,"updated":"2014-01-23 06:18:56.000000000","message":"Duplicated code, see line #178-189. It caused pylint testing failure.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.associate_fn \u003d kwargs.get(\u0027associate_fn\u0027, noop)"},{"line_number":57,"context_line":"        self.disassociate_fn \u003d kwargs.get(\u0027disassociate_fn\u0027, noop)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @abc.abstractmethod"},{"line_number":60,"context_line":"    def get_schemes(self):"},{"line_number":61,"context_line":"        \"\"\"Returns a tuple of schemes which this handler can handle.\"\"\""},{"line_number":62,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BoDs%3D","line":59,"in_reply_to":"AAAAUH%2F%2BsX4%3D","updated":"2014-01-23 21:01:54.000000000","message":"Done","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3b19fd7fa2f9ab197ac3586d697e32d99ab35219","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        This lets callers distinguish between images being downloaded to"},{"line_number":69,"context_line":"        local disk or fetched to remotely accessible storage."},{"line_number":70,"context_line":"        \"\"\""},{"line_number":71,"context_line":"        pass"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def fetch_image(self, context, image_id, image_meta, path,"},{"line_number":74,"context_line":"                    user_id\u003dNone, project_id\u003dNone, location\u003dNone,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2Bo54%3D","line":71,"updated":"2014-01-23 17:00:22.000000000","message":"I think these changes ought to be part of the main patch which adds this class.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        This lets callers distinguish between images being downloaded to"},{"line_number":69,"context_line":"        local disk or fetched to remotely accessible storage."},{"line_number":70,"context_line":"        \"\"\""},{"line_number":71,"context_line":"        pass"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def fetch_image(self, context, image_id, image_meta, path,"},{"line_number":74,"context_line":"                    user_id\u003dNone, project_id\u003dNone, location\u003dNone,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BoDo%3D","line":71,"in_reply_to":"AAAAUH%2F%2Bo54%3D","updated":"2014-01-23 21:01:54.000000000","message":"Done","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"}],"nova/virt/libvirt/imagebackend.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"526d86587a1a8cc5014329a068928fadd5f2273d","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # are trying to create a base file at the same time"},{"line_number":103,"context_line":"        self.lock_path \u003d os.path.join(CONF.instances_path, \u0027locks\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def backend_location(self):"},{"line_number":106,"context_line":"        \"\"\"Return where the data is stored by this image backend.\"\"\""},{"line_number":107,"context_line":"        return self.path"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BsXs%3D","line":105,"updated":"2014-01-23 06:18:56.000000000","message":"Duplicated code","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # are trying to create a base file at the same time"},{"line_number":103,"context_line":"        self.lock_path \u003d os.path.join(CONF.instances_path, \u0027locks\u0027)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def backend_location(self):"},{"line_number":106,"context_line":"        \"\"\"Return where the data is stored by this image backend.\"\"\""},{"line_number":107,"context_line":"        return self.path"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BoDk%3D","line":105,"in_reply_to":"AAAAUH%2F%2BsXs%3D","updated":"2014-01-23 21:01:54.000000000","message":"Done","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"e1f717118e018bae7507b3832cf290f3e2e48f9c","unresolved":false,"context_lines":[{"line_number":490,"context_line":"    def get_disk_size(self, name):"},{"line_number":491,"context_line":"        # ignore the name argument since we already know the name of"},{"line_number":492,"context_line":"        # the rbd image, and don\u0027t want to try to get the size of"},{"line_number":493,"context_line":"        # a local file that doesn\u0027t exist"},{"line_number":494,"context_line":"        return self.driver.size(self.rbd_name)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BQuU%3D","line":493,"updated":"2014-01-28 15:46:56.000000000","message":"I think this comment should be in the docstring.","commit_id":"3955a89ce201e4aba7846900c42a417ac0b6e23d"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"23af2bb91fac2643064dd8345d45318106a98b15","unresolved":false,"context_lines":[{"line_number":490,"context_line":"    def get_disk_size(self, name):"},{"line_number":491,"context_line":"        # ignore the name argument since we already know the name of"},{"line_number":492,"context_line":"        # the rbd image, and don\u0027t want to try to get the size of"},{"line_number":493,"context_line":"        # a local file that doesn\u0027t exist"},{"line_number":494,"context_line":"        return self.driver.size(self.rbd_name)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BPzU%3D","line":493,"in_reply_to":"AAAAUH%2F%2BQuU%3D","updated":"2014-01-28 22:48:26.000000000","message":"Done","commit_id":"3955a89ce201e4aba7846900c42a417ac0b6e23d"}],"nova/virt/libvirt/imagehandler.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3159fbf71ad6be61e80ef1ac8795a6dbf88333d7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\""},{"line_number":16,"context_line":"Image handlers for libvirt hypervisor."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FY2g%3D","line":16,"updated":"2014-01-14 12:45:40.000000000","message":"nit: what about \"RBD clone image handlers for libvirt hypervisor.\"","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b38b513f1bc26fba596e6065832527865820f10a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\""},{"line_number":16,"context_line":"Image handlers for libvirt hypervisor."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FWFs%3D","line":16,"in_reply_to":"AAAAUH%2F%2FY2g%3D","updated":"2014-01-15 01:08:15.000000000","message":"Done","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3159fbf71ad6be61e80ef1ac8795a6dbf88333d7","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def _can_handle_image(self, context, image_id, location, **kwargs):"},{"line_number":58,"context_line":"        backend_type \u003d kwargs.get(\u0027backend_type\u0027)"},{"line_number":59,"context_line":"        backend_location \u003d kwargs.get(\u0027backend_location\u0027)"},{"line_number":60,"context_line":"        if location is None or \u0027url\u0027 not in location:"},{"line_number":61,"context_line":"            LOG.debug(\u0027image location/url is not reported by glance\u0027)"},{"line_number":62,"context_line":"            return False"},{"line_number":63,"context_line":"        if backend_type !\u003d \u0027rbd\u0027 or not backend_location:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FY0c%3D","line":60,"updated":"2014-01-14 12:45:40.000000000","message":"We don\u0027t need to check \"location\" since upper layer code at [1] is already do that correctly. Because the handler reported \u0027rbd\u0027 scheme at above line #52, so this \"location\" variable will contains an available url like \"rbd://xxx\" for this handler.\n\n[1] https://review.openstack.org/#/c/33409/32/nova/virt/imagehandler/__init__.py Line #60","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b38b513f1bc26fba596e6065832527865820f10a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def _can_handle_image(self, context, image_id, location, **kwargs):"},{"line_number":58,"context_line":"        backend_type \u003d kwargs.get(\u0027backend_type\u0027)"},{"line_number":59,"context_line":"        backend_location \u003d kwargs.get(\u0027backend_location\u0027)"},{"line_number":60,"context_line":"        if location is None or \u0027url\u0027 not in location:"},{"line_number":61,"context_line":"            LOG.debug(\u0027image location/url is not reported by glance\u0027)"},{"line_number":62,"context_line":"            return False"},{"line_number":63,"context_line":"        if backend_type !\u003d \u0027rbd\u0027 or not backend_location:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FWFw%3D","line":60,"in_reply_to":"AAAAUH%2F%2FY0c%3D","updated":"2014-01-15 01:08:15.000000000","message":"Done","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3159fbf71ad6be61e80ef1ac8795a6dbf88333d7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            LOG.debug(\u0027backend type is not rbd or backend_location is not set\u0027)"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # TODO(vish): Improve context handling and add owner and auth data"},{"line_number":68,"context_line":"        #             when it is added to glance.  Right now there is no"},{"line_number":69,"context_line":"        #             auth checking in glance, so we assume that access was"},{"line_number":70,"context_line":"        #             checked before we got here."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FYwg%3D","line":67,"updated":"2014-01-14 12:45:40.000000000","message":"IMO line #67-74 is useless, as I mentioned in above comments, because upper layer code is already get the correct image location and pass it into here, so we can just do:\n\n    return self._is_cloneable(location, image_meta)","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"9ea71d4ba859cf6ee4553d048281178bfbad1987","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            LOG.debug(\u0027backend type is not rbd or backend_location is not set\u0027)"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # TODO(vish): Improve context handling and add owner and auth data"},{"line_number":68,"context_line":"        #             when it is added to glance.  Right now there is no"},{"line_number":69,"context_line":"        #             auth checking in glance, so we assume that access was"},{"line_number":70,"context_line":"        #             checked before we got here."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FTdc%3D","line":67,"in_reply_to":"AAAAUH%2F%2FTh0%3D","updated":"2014-01-15 09:23:27.000000000","message":"Done","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"9c91b4b921463889502851fb612827c8b6e0627b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            LOG.debug(\u0027backend type is not rbd or backend_location is not set\u0027)"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # TODO(vish): Improve context handling and add owner and auth data"},{"line_number":68,"context_line":"        #             when it is added to glance.  Right now there is no"},{"line_number":69,"context_line":"        #             auth checking in glance, so we assume that access was"},{"line_number":70,"context_line":"        #             checked before we got here."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FUBo%3D","line":67,"in_reply_to":"AAAAUH%2F%2FUXQ%3D","updated":"2014-01-15 06:11:16.000000000","message":"I also think it would be better to have the image rather than the image id.\nJosh has a valid use case and I am pretty this will be also useful for the zero-copy use case in the vmwareapi.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"aac1372737d44ed43034b84dde7e4b4b650d5adf","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            LOG.debug(\u0027backend type is not rbd or backend_location is not set\u0027)"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # TODO(vish): Improve context handling and add owner and auth data"},{"line_number":68,"context_line":"        #             when it is added to glance.  Right now there is no"},{"line_number":69,"context_line":"        #             auth checking in glance, so we assume that access was"},{"line_number":70,"context_line":"        #             checked before we got here."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FTh0%3D","line":67,"in_reply_to":"AAAAUH%2F%2FUXQ%3D","updated":"2014-01-15 08:57:45.000000000","message":"Yeah, I think that\u0027s a good idea.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"d40ad4c07d5efa0352a7142c3f2210b3474bcbfb","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            LOG.debug(\u0027backend type is not rbd or backend_location is not set\u0027)"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # TODO(vish): Improve context handling and add owner and auth data"},{"line_number":68,"context_line":"        #             when it is added to glance.  Right now there is no"},{"line_number":69,"context_line":"        #             auth checking in glance, so we assume that access was"},{"line_number":70,"context_line":"        #             checked before we got here."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FUXQ%3D","line":67,"in_reply_to":"AAAAUH%2F%2FWBg%3D","updated":"2014-01-15 04:56:00.000000000","message":"ah, OK. So do you think it will be better if we change #33409 to allow upper layer code pass image_metadata into here (fetch_image and other interfaces) as a common logic? it will prevent execute duplicated image query request like this.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b38b513f1bc26fba596e6065832527865820f10a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            LOG.debug(\u0027backend type is not rbd or backend_location is not set\u0027)"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # TODO(vish): Improve context handling and add owner and auth data"},{"line_number":68,"context_line":"        #             when it is added to glance.  Right now there is no"},{"line_number":69,"context_line":"        #             auth checking in glance, so we assume that access was"},{"line_number":70,"context_line":"        #             checked before we got here."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FWBg%3D","line":67,"in_reply_to":"AAAAUH%2F%2FYwg%3D","updated":"2014-01-15 01:08:15.000000000","message":"We need to check that the image is in raw format as well, so we need the image metadata.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3159fbf71ad6be61e80ef1ac8795a6dbf88333d7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FYRE%3D","line":93,"updated":"2014-01-14 12:45:40.000000000","message":"@Josh I\u0027m confused, we did nothing here. IMO remove_image be used to move an image bits from one place to another place, even it be stored/managed in remote.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"4d48ad7df8d38884912170643bd7369c98baab79","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FItw%3D","line":93,"in_reply_to":"AAAAUH%2F%2FI3M%3D","updated":"2014-01-17 03:56:03.000000000","message":"I agree. Like you said, that can be done in later patches.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"eb53e87c430f0821169e0fa0a263e56fb6fa5476","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FI3M%3D","line":93,"in_reply_to":"AAAAUH%2F%2FLhs%3D","updated":"2014-01-17 03:12:01.000000000","message":"Thanks for the explaining. Actually I think it will be better if those places call image handler\u0027s function instead of handle rbd volume directly, since I still think we\u0027d better give upper layer a single interface and wrap whole the image resource logic into here. We can do that in a dedicated changes of course, after this part landing, to make driver\u0027s code more common: always using image handler to handle image *resource*, and we can evolve (particular) handler implementation separately. Anyway let\u0027s land this worth part down first, thanks.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"fd97d149ecd725c0749e556b37e7ee768829257c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FLhs%3D","line":93,"in_reply_to":"AAAAUH%2F%2FO%2Bc%3D","updated":"2014-01-16 17:35:56.000000000","message":"When it \u0027expires\u0027, the cache ignores it since the local file doesn\u0027t exist. The libvirt driver handles deleting it when the vm using it is deleted: https://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L1017","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"01dc0adf7afabb339c11f15c714332046181abb8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FO%2Bc%3D","line":93,"in_reply_to":"AAAAUH%2F%2FPGw%3D","updated":"2014-01-16 04:03:48.000000000","message":"\u003e\u003e\u003e Looking at the way the libvirt driver uses imagebackends currently, maybe starting afresh like this would be better. I\u0027ll implement these.\n\nThanks, it\u0027s great to me.\n\n\u003e\u003e\u003e Note though that this handler intentionally bypasses the cach ...\n\nOh yes, sorry to confuse you and my unclear comment on above.It just is the purpose of this handler, to reduce unnecessary image bit downloading, so no local cached files. But I\u0027m thinking what will be happen if a remote \"cloned\" image get expiration? thanks.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b3dcf5ebe5b045f653879362971a58fa6bacf5dd","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FPGw%3D","line":93,"in_reply_to":"AAAAUH%2F%2FTdM%3D","updated":"2014-01-16 03:23:39.000000000","message":"Oops, missed this comment earlier.\n\nLooking at the way the libvirt driver uses imagebackends currently, maybe starting afresh like this would be better. I\u0027ll implement these.\n\nNote though that this handler intentionally bypasses the cache, storing no local files, since they\u0027re a waste when the glance image and the clone used by the vm are both in a remote cluster, and have no inherent tie to the local machine. So these methods won\u0027t actually be used by anything yet.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"9ea71d4ba859cf6ee4553d048281178bfbad1987","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FTdM%3D","line":93,"in_reply_to":"AAAAUH%2F%2FUUo%3D","updated":"2014-01-15 09:23:27.000000000","message":"Still like to know, may I get your thoughts?","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"d40ad4c07d5efa0352a7142c3f2210b3474bcbfb","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FUUo%3D","line":93,"in_reply_to":"AAAAUH%2F%2FWEQ%3D","updated":"2014-01-15 04:56:00.000000000","message":"The reason to me to asking we implement these two functions completely is that I think we\u0027d better to do things in correct abstraction layer: IMO we implement correct functions in these two functions within ImageHandler layer, and require ImageBackends or other place which need to remove/move image call ImageHandler functions but implement it by itself or in their own layer. IMO the purpose of ImageHandler is just for aggregate all operation functions into an (particular) image\u0027s \"resource\".\n\nbtw, I\u0027m interested in what will do by this handler when image cache manager require remove an overdue image from compute host? https://review.openstack.org/#/c/33409/34/nova/virt/libvirt/imagecache.py Line #452.\n\nAm i misunderstanding your point?\n\nthanks.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b38b513f1bc26fba596e6065832527865820f10a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":91,"context_line":"                      **kwargs):"},{"line_number":92,"context_line":"        # no local file is ever saved by this handler"},{"line_number":93,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _move_image(self, src_path, dst_path,"},{"line_number":96,"context_line":"                    context\u003dNone, image_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FWEQ%3D","line":93,"in_reply_to":"AAAAUH%2F%2FYRE%3D","updated":"2014-01-15 01:08:15.000000000","message":"I don\u0027t really see a use case for this for remote images at the imagehandler level.\n\nTo me it seems like it\u0027s more of a property of the final storage location (in libvirt the ImageBackend). The only use so far is for moving around images after conversion, which is unnecessary for this handler, and could be handled at a higher level using ImageBackends instead.\n\nI\u0027d rather push the ImageBackend down to where conversion is happening in images.fetch_to_raw (which is only used by libvirt) than duplicate functionality from it in ImageHandlers, but maybe there\u0027s some other use case I don\u0027t see.","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"3159fbf71ad6be61e80ef1ac8795a6dbf88333d7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                    user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":98,"context_line":"                    **kwargs):"},{"line_number":99,"context_line":"        # no local file is ever saved by this handler"},{"line_number":100,"context_line":"        return self._can_handle_image(context, image_id, location, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FYRA%3D","line":100,"updated":"2014-01-14 12:45:40.000000000","message":"ditto","commit_id":"9ddbb6a747766273fef8fba31a86879751721cfd"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"c8853dda8ae2d457dca990a28339776138e66008","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":47,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":48,"context_line":"        if not CONF.libvirt.images_rbd_pool:"},{"line_number":49,"context_line":"            raise RuntimeError(_(\u0027You should specify images_rbd_pool \u0027"},{"line_number":50,"context_line":"                                 \u0027flag to use rbd images.\u0027))"},{"line_number":51,"context_line":"        self._configure("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FUSk%3D","line":48,"updated":"2014-01-15 04:56:09.000000000","message":"I think do following first will be necessary at here:\n\n    nonapplicable_drivers \u003d [vmwareapi.VMWareESXDriver, vmwareapi.VMwareVCDriver]\n        if type(driver) in applicable_drivers:\n            raise UnsupportedVirtDriver()\n\nFor the reason please refer my comments at https://review.openstack.org/#/c/63975/4/nova/virt/imagehandler/vmware.py Line #39 .\n\nAnd btw, do you really think it\u0027s a good idea that we enable \"libvirt_rbd_clone\" image handler by default? ( https://review.openstack.org/#/c/59149/6/etc/nova/nova.conf.sample and https://review.openstack.org/#/c/59149/6/nova/virt/imagehandler/__init__.py ) Since I think \"libvirt_rbd_clone\" is not applicable for most deployment as a default handler, so IMO can we don\u0027t enable it by default?","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"323c130c6452ee7cb83008108f50950f46c02f4c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":47,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":48,"context_line":"        if not CONF.libvirt.images_rbd_pool:"},{"line_number":49,"context_line":"            raise RuntimeError(_(\u0027You should specify images_rbd_pool \u0027"},{"line_number":50,"context_line":"                                 \u0027flag to use rbd images.\u0027))"},{"line_number":51,"context_line":"        self._configure("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FO%2BY%3D","line":48,"in_reply_to":"AAAAUH%2F%2FPFM%3D","updated":"2014-01-16 04:03:40.000000000","message":"cool","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"7f0e49c40028ad0889e8f7b7824a0c359d30c46e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":47,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":48,"context_line":"        if not CONF.libvirt.images_rbd_pool:"},{"line_number":49,"context_line":"            raise RuntimeError(_(\u0027You should specify images_rbd_pool \u0027"},{"line_number":50,"context_line":"                                 \u0027flag to use rbd images.\u0027))"},{"line_number":51,"context_line":"        self._configure("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FPFM%3D","line":48,"in_reply_to":"AAAAUH%2F%2FTZY%3D","updated":"2014-01-16 03:23:57.000000000","message":"Having a consistent approach for the check would be good. For this handler we need to check both that it\u0027s libvirt, and also the libvirt_images_type value (which is passed down as backend_type here) which might be \u0027rbd\u0027, \u0027raw\u0027, \u0027qcow\u0027, \u0027lvm\u0027, or \u0027default\u0027. For the first check your suggestion is fine with me. I don\u0027t mind if this second check is more generic, or just specific to this handler (at least until other handlers that care about the same thing are implemented).","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"b820f66cdbd06a20c3634fb2517eee5cff61b199","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":47,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":48,"context_line":"        if not CONF.libvirt.images_rbd_pool:"},{"line_number":49,"context_line":"            raise RuntimeError(_(\u0027You should specify images_rbd_pool \u0027"},{"line_number":50,"context_line":"                                 \u0027flag to use rbd images.\u0027))"},{"line_number":51,"context_line":"        self._configure("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FTZY%3D","line":48,"in_reply_to":"AAAAUH%2F%2FTiY%3D","updated":"2014-01-15 09:39:57.000000000","message":"For fist point, can we figure out a consistent approach to do this check? It will be really better if we can make this check mechanism as consistent as possible cross different hyervisor driver, especially on this initial stage of image handler part landing. IMO my approach which I mentioned in above comments is more easy to implement and self-contains.\n\nAs second point, I\"m ok to  enable \"libvirt_rbd_clone\" image handler by default.","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"214dd483939f69ac78192dcec7d05470705a9226","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \"\"\""},{"line_number":46,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":47,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":48,"context_line":"        if not CONF.libvirt.images_rbd_pool:"},{"line_number":49,"context_line":"            raise RuntimeError(_(\u0027You should specify images_rbd_pool \u0027"},{"line_number":50,"context_line":"                                 \u0027flag to use rbd images.\u0027))"},{"line_number":51,"context_line":"        self._configure("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FTiY%3D","line":48,"in_reply_to":"AAAAUH%2F%2FUSk%3D","updated":"2014-01-15 08:58:01.000000000","message":"This is why I added the backend_type kwarg - if that\u0027s not set to rbd by the virt driver calling this, this handler returns false so the next one can be tried.\n\nI thought it made sense to enable by default because it\u0027s a no-op with very little cost (a single function call and check for the backend_type argument) when it\u0027s not applicable, but it makes things simpler for operators who don\u0027t have to learn and set up yet another config option when they are using rbd.","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"31cd00d1adb659145fcbd2db505878703c7173c9","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service(context,"},{"line_number":82,"context_line":"                                                                    image_id)"},{"line_number":83,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":84,"context_line":"        return self._is_cloneable(location[\u0027url\u0027], image_meta)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _fetch_image(self, context, image_id, path,"},{"line_number":87,"context_line":"                     user_id\u003dNone, project_id\u003dNone, location\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FT70%3D","line":84,"updated":"2014-01-15 06:42:17.000000000","message":"location is already a string (url).","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"214dd483939f69ac78192dcec7d05470705a9226","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service(context,"},{"line_number":82,"context_line":"                                                                    image_id)"},{"line_number":83,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":84,"context_line":"        return self._is_cloneable(location[\u0027url\u0027], image_meta)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _fetch_image(self, context, image_id, path,"},{"line_number":87,"context_line":"                     user_id\u003dNone, project_id\u003dNone, location\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FTiI%3D","line":84,"in_reply_to":"AAAAUH%2F%2FT70%3D","updated":"2014-01-15 08:58:01.000000000","message":"I\u0027m confused by this - it seems to still be a dict with url and meta data to me...","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"b820f66cdbd06a20c3634fb2517eee5cff61b199","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        (image_service, image_id) \u003d glance.get_remote_image_service(context,"},{"line_number":82,"context_line":"                                                                    image_id)"},{"line_number":83,"context_line":"        image_meta \u003d image_service.show(context, image_id)"},{"line_number":84,"context_line":"        return self._is_cloneable(location[\u0027url\u0027], image_meta)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _fetch_image(self, context, image_id, path,"},{"line_number":87,"context_line":"                     user_id\u003dNone, project_id\u003dNone, location\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FTYw%3D","line":84,"in_reply_to":"AAAAUH%2F%2FTiI%3D","updated":"2014-01-15 09:39:57.000000000","message":"Oops, you are right Josh, sorry confused ...","commit_id":"dfb3cecefba65a3371d41c08a1c4fd6af1c92254"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"526d86587a1a8cc5014329a068928fadd5f2273d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BsEU%3D","line":1,"updated":"2014-01-23 06:18:56.000000000","message":"I\u0027m thinking maybe we can make a \"nova/virt/libvirt/imagehandler\"\ndirectory and put all handler into it? like \"nova/virt/libvirt/imagehandler/rbd_clone.py\". It can help we organize this stuff in future and prevent refactoring your code again.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BncA%3D","line":1,"in_reply_to":"AAAAUH%2F%2BsEU%3D","updated":"2014-01-23 21:01:54.000000000","message":"That makes sense when there are other libvirt-speciifc image handlers. For now I\u0027d like to see these merged, and we can re-arrange things later if more libvirt-specific handlers are added.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"526d86587a1a8cc5014329a068928fadd5f2273d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class RBDImageHandler(base.ImageHandler, rbd_utils.RBDDriver):"},{"line_number":34,"context_line":"    \"\"\"Handler for rbd-backed images."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    If libvirt is using rbd for ephemeral/root disks, this handler"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BsW8%3D","line":33,"updated":"2014-01-23 06:18:56.000000000","message":"So we don\u0027t need to extend RBDDriver.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class RBDImageHandler(base.ImageHandler, rbd_utils.RBDDriver):"},{"line_number":34,"context_line":"    \"\"\"Handler for rbd-backed images."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    If libvirt is using rbd for ephemeral/root disks, this handler"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BoDg%3D","line":33,"in_reply_to":"AAAAUH%2F%2BsW8%3D","updated":"2014-01-23 21:01:54.000000000","message":"Done","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"526d86587a1a8cc5014329a068928fadd5f2273d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    If rbd is not the image backend type, this handler does nothing."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":43,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":44,"context_line":"        self.driver \u003d rbd_utils.RBDDriver("},{"line_number":45,"context_line":"            pool\u003dCONF.libvirt.images_rbd_pool,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BsMc%3D","line":42,"updated":"2014-01-23 06:18:56.000000000","message":"I still thing it will be better if we do a check at here, as I mentioned in https://review.openstack.org/#/c/59149/6/nova/virt/libvirt/imagehandler.py\n\nbtw, if we do the check at here in my way, the performance can be improved a little, since if we report handler unavailable at here rather than in interfaces, e.g. line #76, 88, 98, upper layer code will skip this handler completely according to current deployment/configuration, and the checking will happen only once.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    If rbd is not the image backend type, this handler does nothing."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    def __init__(self, driver\u003dNone, *args, **kwargs):"},{"line_number":43,"context_line":"        super(RBDImageHandler, self).__init__(driver, *args, **kwargs)"},{"line_number":44,"context_line":"        self.driver \u003d rbd_utils.RBDDriver("},{"line_number":45,"context_line":"            pool\u003dCONF.libvirt.images_rbd_pool,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BoBg%3D","line":42,"in_reply_to":"AAAAUH%2F%2BsMc%3D","updated":"2014-01-23 21:01:54.000000000","message":"Ah, thanks for reminding me. I was clearly too tired when updating this yesterday. Re-added the check.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"526d86587a1a8cc5014329a068928fadd5f2273d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.driver.clone(dest_pool, dest_image, pool, image, snapshot)"},{"line_number":82,"context_line":"        return True"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _remove_image(self, context, image_id, image_meta, path,"},{"line_number":85,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":86,"context_line":"                      **kwargs):"},{"line_number":87,"context_line":"        if not self._can_handle_image(context, image_meta, location, **kwargs):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BsC8%3D","line":84,"updated":"2014-01-23 06:18:56.000000000","message":"Thanks for you implement this two interface Josh.\n\nAfter my digging, btw, I think this two functions seems have a long way to go, actually since we have not an effective image resource abstract historically, we write a lot of little utils for various image backend (and hypervisor, not check yet but it\u0027s probable) which scattered around in some places in code base currently, e.g. https://github.com/openstack/nova/blob/master/nova/virt/libvirt/utils.py#L293 .","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"57e162bd09fb6d1ef4041e9095acb9a35712d2ad","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        self.driver.clone(dest_pool, dest_image, pool, image, snapshot)"},{"line_number":82,"context_line":"        return True"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _remove_image(self, context, image_id, image_meta, path,"},{"line_number":85,"context_line":"                      user_id\u003dNone, project_id\u003dNone, location\u003dNone,"},{"line_number":86,"context_line":"                      **kwargs):"},{"line_number":87,"context_line":"        if not self._can_handle_image(context, image_meta, location, **kwargs):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BndM%3D","line":84,"in_reply_to":"AAAAUH%2F%2BsC8%3D","updated":"2014-01-23 21:01:54.000000000","message":"Yes, later patches can consolidate those more.","commit_id":"1f22375caab4a3c1d3c67e2fc62258946ee3edfe"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"fdfb15a7414ad7977cdc5327d49391d63b046eef","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class RBDImageHandler(base.ImageHandler, rbd_utils.RBDDriver):"},{"line_number":35,"context_line":"    \"\"\"Handler for rbd-backed images."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    If libvirt is using rbd for ephemeral/root disks, this handler"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BlzE%3D","line":34,"updated":"2014-01-24 02:52:14.000000000","message":"same comment at here as https://review.openstack.org/#/c/59149/8/nova/virt/libvirt/imagehandler.py","commit_id":"faa21913eb12316a95a57e2526dac75cadf61c4d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"9bd3f82b9d9b4783a4dd3ecd29ed5ce6a1aff6f7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class RBDImageHandler(base.ImageHandler):"},{"line_number":35,"context_line":"    \"\"\"Handler for rbd-backed images."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    If libvirt is using rbd for ephemeral/root disks, this handler"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BbGY%3D","line":34,"updated":"2014-01-27 02:23:56.000000000","message":"nit: what about name this handler to RBDCloneImageHandler? it will be helpful if we implement other image handlers around RBD backend.","commit_id":"60a93fc4fa36a0d8852d7f8d4b23dc7bd6094e92"},{"author":{"_account_id":1107,"name":"Josh Durgin","email":"jdurgin@redhat.com","username":"jdurgin"},"change_message_id":"b84e72467a9988246d1fc175a1c79fb45444062c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class RBDImageHandler(base.ImageHandler):"},{"line_number":35,"context_line":"    \"\"\"Handler for rbd-backed images."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    If libvirt is using rbd for ephemeral/root disks, this handler"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BVME%3D","line":34,"in_reply_to":"AAAAUH%2F%2BbGY%3D","updated":"2014-01-27 23:18:06.000000000","message":"Done","commit_id":"60a93fc4fa36a0d8852d7f8d4b23dc7bd6094e92"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"e047002b2c1b01a4277682b774fea8ca4f917f49","unresolved":false,"context_lines":[{"line_number":622,"context_line":"    if backend_dest is not None:"},{"line_number":623,"context_line":"        for (handler, loc) in handle_image(context, image_id,"},{"line_number":624,"context_line":"                                           user_id, project_id, target):"},{"line_number":625,"context_line":"            # The loop will stop when the handle function return success."},{"line_number":626,"context_line":"            handler.fetch_to_backend(context, image_id, target,"},{"line_number":627,"context_line":"                                     user_id, project_id, loc,"},{"line_number":628,"context_line":"                                     backend_dest)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2F76E%3D","line":625,"updated":"2014-01-06 15:17:04.000000000","message":"s/return/returns/","commit_id":"0f1cc7ede04d4079e06fa52920c2fba52edbd376"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"029cfb1cc1d85ff677f6cb1aa910c04f1afb0969","unresolved":false,"context_lines":[{"line_number":622,"context_line":"    if backend_dest is not None:"},{"line_number":623,"context_line":"        for (handler, loc) in handle_image(context, image_id,"},{"line_number":624,"context_line":"                                           user_id, project_id, target):"},{"line_number":625,"context_line":"            # The loop will stop when the handle function return success."},{"line_number":626,"context_line":"            handler.fetch_to_backend(context, image_id, target,"},{"line_number":627,"context_line":"                                     user_id, project_id, loc,"},{"line_number":628,"context_line":"                                     backend_dest)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2Fr1M%3D","line":625,"in_reply_to":"AAAAUH%2F%2F76E%3D","updated":"2014-01-09 17:51:52.000000000","message":"Done, thanks David.","commit_id":"0f1cc7ede04d4079e06fa52920c2fba52edbd376"}]}
