)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6efcf4feca70c7bab3603bf195bf05dc04936dcb","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is just pseudocode for the moment, marking the place where we"},{"line_number":10,"context_line":"need to trigger an image copy between stores to be able to do the"},{"line_number":11,"context_line":"clone behavior we want, even if the image is not local."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ia839ad418b0f2887cb8e8f5ee3e660a0751db9ce"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ff570b3c_a26b74ee","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":54},"updated":"2020-05-21 10:39:45.000000000","message":"this is primarlia for rbd right\n\nso that in cases where glance and nova are both backed by the same ceph cluster we can have ceph do a copy on write clone.\n\nyour inent is to allow nova to copy the image to the correct backing store so we can leverage that same clone capablity if intillay glance and the specific nova compute where using idfferent ceph clusters which may be the case for example in edge deployments.\n\nmy question is will this only be useful for ceph? or is there some other backend where we will want do this kind of backend image copy.\n\ne.g. is this still useful for qcow image backend with glance swift or file backend.\n\ni think copying it to a local glance instance with sotrage closer to the edge site would still be benifical in that case as we may not be able to do a cow clone but copying the data closer will at least  reduce the netwrok overhead of retiving it at the remote site i just though i would ask how generic you intended this to be. e.g. is it an optimisation for one backend or applciatble to seveal in differnt configure ations and usecases.","commit_id":"24635d3aa9353a9c3cd13f47b89382c073776d73"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6de07711b95149c3d990652d1af2159eb2bafdf8","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is just pseudocode for the moment, marking the place where we"},{"line_number":10,"context_line":"need to trigger an image copy between stores to be able to do the"},{"line_number":11,"context_line":"clone behavior we want, even if the image is not local."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ia839ad418b0f2887cb8e8f5ee3e660a0751db9ce"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ff570b3c_3a2941f2","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":54},"in_reply_to":"ff570b3c_a26b74ee","updated":"2020-05-21 20:21:17.000000000","message":"\u003e this is primarlia for rbd right\n\nOnly for rbd.\n\n \u003e so that in cases where glance and nova are both backed by the same\n \u003e ceph cluster we can have ceph do a copy on write clone.\n\nNot exactly. Right now if nova and glance share a ceph, then everything is fine. This is for the case where nova is backed by a ceph that glance *knows* about, but the image is actually stored in a different glance store (either another rbd, or something totally separate).\n\n \u003e your inent is to allow nova to copy the image to the correct\n \u003e backing store so we can leverage that same clone capablity if\n \u003e intillay glance and the specific nova compute where using idfferent\n \u003e ceph clusters which may be the case for example in edge\n \u003e deployments.\n\nNo, the intent is for glance to do it. Glance has been working on adding the ability to copy between stores, which is now merged and available to us. The goal here is for nova to tell glance to copy the image into the proper store for us, so we can then go and do the fast-clone behavior we already support when the base image is in our ceph cluster.\n\n \u003e my question is will this only be useful for ceph? or is there some\n \u003e other backend where we will want do this kind of backend image\n \u003e copy.\n\nPretty much rbd-only. There\u0027s no other case I\u0027m aware of where the base image needs to be in a specific glance backend for us. If we\u0027re doing a regular local-storage instance, we need to download the image to our local disk, either from glance or direct-to-rbd, so it doesn\u0027t much matter.\n\n \u003e i think copying it to a local glance instance with sotrage closer\n \u003e to the edge site would still be benifical in that case as we may\n \u003e not be able to do a cow clone but copying the data closer will at\n \u003e least  reduce the netwrok overhead of retiving it at the remote\n \u003e site i just though i would ask how generic you intended this to be.\n \u003e e.g. is it an optimisation for one backend or applciatble to seveal\n \u003e in differnt configure ations and usecases.\n\nWe get that behavior by default if the edge site is running a caching glance api worker in front of the novas at that site. If nova compute is pointed at the site-local glance, then when it tries to download it for its local image-cache, the glance worker will cache it in transit so that other computes at that same site will have it closer after that is done.","commit_id":"24635d3aa9353a9c3cd13f47b89382c073776d73"}],"nova/conf/libvirt.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":945,"context_line":"               help\u003d\"\"\""},{"line_number":946,"context_line":"The name of the Glance store that represents the rbd cluster in use by"},{"line_number":947,"context_line":"this node. If set, this will allow Nova to request that Glance copy an"},{"line_number":948,"context_line":"image from an existing (not non-local) store into the one named by this option"},{"line_number":949,"context_line":"before booting so that proper Copy-on-Write behavior is maintained."},{"line_number":950,"context_line":""},{"line_number":951,"context_line":"Related options:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_418b0b1d","line":948,"range":{"start_line":948,"start_character":24,"end_line":948,"end_character":38},"updated":"2020-06-12 14:57:09.000000000","message":"not non-local ?\u003d local","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"79fe2ca8a00734389e3f016821911bad26277574","unresolved":false,"context_lines":[{"line_number":945,"context_line":"               help\u003d\"\"\""},{"line_number":946,"context_line":"The name of the Glance store that represents the rbd cluster in use by"},{"line_number":947,"context_line":"this node. If set, this will allow Nova to request that Glance copy an"},{"line_number":948,"context_line":"image from an existing (not non-local) store into the one named by this option"},{"line_number":949,"context_line":"before booting so that proper Copy-on-Write behavior is maintained."},{"line_number":950,"context_line":""},{"line_number":951,"context_line":"Related options:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_2ae3a135","line":948,"range":{"start_line":948,"start_character":24,"end_line":948,"end_character":38},"in_reply_to":"ff570b3c_418b0b1d","updated":"2020-06-15 14:48:16.000000000","message":"Wow, that\u0027s...I don\u0027t even know :)","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5b70a8c0736a8fe4976bb666abd0420cb8ff29bc","unresolved":false,"context_lines":[{"line_number":966,"context_line":"Related options:"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"* images_type - must be set to ``rbd``"},{"line_number":969,"context_line":"* images_rbd_glance_store_name - must be set to a store name"},{"line_number":970,"context_line":"\"\"\"),"},{"line_number":971,"context_line":"    cfg.IntOpt(\u0027images_rbd_glance_copy_timeout\u0027,"},{"line_number":972,"context_line":"               default\u003d600,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_0503dc0e","line":969,"updated":"2020-06-18 21:23:24.000000000","message":"images_rbd_glance_copy_timeout should also be here, no?","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fb07f1f45b36b458572f9e34fe393bb8efd8e639","unresolved":false,"context_lines":[{"line_number":966,"context_line":"Related options:"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"* images_type - must be set to ``rbd``"},{"line_number":969,"context_line":"* images_rbd_glance_store_name - must be set to a store name"},{"line_number":970,"context_line":"\"\"\"),"},{"line_number":971,"context_line":"    cfg.IntOpt(\u0027images_rbd_glance_copy_timeout\u0027,"},{"line_number":972,"context_line":"               default\u003d600,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_30d45c20","line":969,"in_reply_to":"bf51134e_0503dc0e","updated":"2020-06-18 21:39:21.000000000","message":"I guess you could argue that, but my thinking is that many people will not need to tweak the larger timeout, but may want to tweak this. This doesn\u0027t really have any bearing on the overall timeout and doesn\u0027t mention it in the help text. The overall timeout doc text covers a larger set of things, and mentions the poll interval in terms of noticing most normal errors, which is why I included this in its related options list. I\u0027d think that the kinda root option is the store_name, which references all the actual things you need to go look at, and tweaking it is required for anyone using this feature, so they get exposure to all the options there. The line has to be somewhere, and we don\u0027t list all the other rbd options as related to these, even though they clearly are for someone using rbd...","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3c66f827f50cf4f124c5d10cd23ffa9e0c079f2d","unresolved":false,"context_lines":[{"line_number":966,"context_line":"Related options:"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"* images_type - must be set to ``rbd``"},{"line_number":969,"context_line":"* images_rbd_glance_store_name - must be set to a store name"},{"line_number":970,"context_line":"\"\"\"),"},{"line_number":971,"context_line":"    cfg.IntOpt(\u0027images_rbd_glance_copy_timeout\u0027,"},{"line_number":972,"context_line":"               default\u003d600,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_f0814491","line":969,"in_reply_to":"bf51134e_30d45c20","updated":"2020-06-18 21:55:47.000000000","message":"OK, np, I thought maybe it was overlooked.","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"}],"nova/image/glance.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"68445e7695410477297b7fd6347fda28411c8479","unresolved":false,"context_lines":[{"line_number":658,"context_line":"        try:"},{"line_number":659,"context_line":"            self._client.call(context, 2, \u0027image_import\u0027, args\u003d(image_id,),"},{"line_number":660,"context_line":"                              kwargs\u003d{\u0027method\u0027: method, \u0027stores\u0027: stores})"},{"line_number":661,"context_line":"        except Exception as e:"},{"line_number":662,"context_line":"            raise"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_80a9fa91","line":661,"updated":"2020-05-21 22:28:39.000000000","message":"pep8: F841 local variable \u0027e\u0027 is assigned to but never used","commit_id":"7b40c351c6e1d4a5f64811397a15bbba7b0436a8"}],"nova/tests/unit/virt/libvirt/test_imagebackend.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":1790,"context_line":"        ]"},{"line_number":1791,"context_line":"        image.copy_to_store(self.CONTEXT, {\u0027id\u0027: \u0027foo\u0027})"},{"line_number":1792,"context_line":"        mock_imgapi.copy_image_to_store.assert_called_once_with("},{"line_number":1793,"context_line":"            self.CONTEXT, \u0027foo\u0027, \u0027store\u0027)"},{"line_number":1794,"context_line":""},{"line_number":1795,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.imagebackend.IMAGE_API\u0027)"},{"line_number":1796,"context_line":"    def test_copy_to_store_race_with_existing(self, mock_imgapi):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_21c41740","line":1793,"updated":"2020-06-12 14:57:09.000000000","message":"you could check that mock_imgapi called 3 times and not less so the looping not existed too early","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":1810,"context_line":"                                      response\u003d\u0027already in progress\u0027))"},{"line_number":1811,"context_line":"        # Make the first poll indicate that the image has already"},{"line_number":1812,"context_line":"        # been copied"},{"line_number":1813,"context_line":"        mock_imgapi.get.return_value \u003d {\u0027stores\u0027: \u0027store\u0027}"},{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"        # Despite the (expected) exception from the copy, we should"},{"line_number":1816,"context_line":"        # not raise here if the subsequent poll works."}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_61044f7f","line":1813,"updated":"2020-06-12 14:57:09.000000000","message":"shouldn\u0027t it be {\u0027stores\u0027: [\u0027store\u0027]} ? I don\u0027t get it why it does not make the test fail.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"150fde062e550873ac26c45103c80817d96419cb","unresolved":false,"context_lines":[{"line_number":1810,"context_line":"                                      response\u003d\u0027already in progress\u0027))"},{"line_number":1811,"context_line":"        # Make the first poll indicate that the image has already"},{"line_number":1812,"context_line":"        # been copied"},{"line_number":1813,"context_line":"        mock_imgapi.get.return_value \u003d {\u0027stores\u0027: \u0027store\u0027}"},{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"        # Despite the (expected) exception from the copy, we should"},{"line_number":1816,"context_line":"        # not raise here if the subsequent poll works."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_ca98256c","line":1813,"in_reply_to":"bf51134e_aa45f119","updated":"2020-06-15 14:58:06.000000000","message":"Ah, it\u0027s because:\n\n \u0027foo\u0027 in \u0027foo\u0027\n\nis true for substring reasons and\n\n \u0027foo\u0027 in [\u0027foo\u0027]\n\nis true for membership reasons :)\n\nI\u0027ll add another store to this for reality and to prevent that from short-circuiting if something else changes.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"72a16d1623bd56c54f6e2508c39838a1f1391ff3","unresolved":false,"context_lines":[{"line_number":1810,"context_line":"                                      response\u003d\u0027already in progress\u0027))"},{"line_number":1811,"context_line":"        # Make the first poll indicate that the image has already"},{"line_number":1812,"context_line":"        # been copied"},{"line_number":1813,"context_line":"        mock_imgapi.get.return_value \u003d {\u0027stores\u0027: \u0027store\u0027}"},{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"        # Despite the (expected) exception from the copy, we should"},{"line_number":1816,"context_line":"        # not raise here if the subsequent poll works."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_8def6786","line":1813,"in_reply_to":"bf51134e_ca98256c","updated":"2020-06-15 15:51:14.000000000","message":"Ahh thanks. This is when dynamic typing strikes back :)","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"79fe2ca8a00734389e3f016821911bad26277574","unresolved":false,"context_lines":[{"line_number":1810,"context_line":"                                      response\u003d\u0027already in progress\u0027))"},{"line_number":1811,"context_line":"        # Make the first poll indicate that the image has already"},{"line_number":1812,"context_line":"        # been copied"},{"line_number":1813,"context_line":"        mock_imgapi.get.return_value \u003d {\u0027stores\u0027: \u0027store\u0027}"},{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"        # Despite the (expected) exception from the copy, we should"},{"line_number":1816,"context_line":"        # not raise here if the subsequent poll works."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_aa45f119","line":1813,"in_reply_to":"ff570b3c_61044f7f","updated":"2020-06-15 14:48:16.000000000","message":"Hrm, yeah I think you\u0027re right. I\u0027ll poke.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":1989,"context_line":"            mock_copy.assert_not_called()"},{"line_number":1990,"context_line":"        mock_driver.is_cloneable.assert_called_once_with(\u0027fake\u0027, fake_image)"},{"line_number":1991,"context_line":""},{"line_number":1992,"context_line":""},{"line_number":1993,"context_line":"class PloopTestCase(_ImageTestCase, test.NoDBTestCase):"},{"line_number":1994,"context_line":"    SIZE \u003d 1024"},{"line_number":1995,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_c16f1bf8","line":1992,"updated":"2020-06-12 14:57:09.000000000","message":"Nice comprehensive test coverage.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5b70a8c0736a8fe4976bb666abd0420cb8ff29bc","unresolved":false,"context_lines":[{"line_number":1780,"context_line":"        image \u003d self.image_class(self.INSTANCE, self.NAME)"},{"line_number":1781,"context_line":"        mock_imgapi.get.side_effect \u003d ["},{"line_number":1782,"context_line":"            # Simulate a race between starting the copy and the first poll"},{"line_number":1783,"context_line":"            {\u0027stores\u0027: []},"},{"line_number":1784,"context_line":"            # Second poll shows it in progress"},{"line_number":1785,"context_line":"            {\u0027os_glance_importing_to_stores\u0027: [\u0027store\u0027],"},{"line_number":1786,"context_line":"             \u0027stores\u0027: []},"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_e52fc89e","line":1783,"updated":"2020-06-18 21:23:24.000000000","message":"Nice to cover this\n\nNote to self: This could have also been \u0027stores\u0027: [\u0027not our store\u0027] if the image is already in _a_ store and needs to be copied to the store nova is using.\n\nI think this patch is missing test coverage for this case ^","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3c66f827f50cf4f124c5d10cd23ffa9e0c079f2d","unresolved":false,"context_lines":[{"line_number":1780,"context_line":"        image \u003d self.image_class(self.INSTANCE, self.NAME)"},{"line_number":1781,"context_line":"        mock_imgapi.get.side_effect \u003d ["},{"line_number":1782,"context_line":"            # Simulate a race between starting the copy and the first poll"},{"line_number":1783,"context_line":"            {\u0027stores\u0027: []},"},{"line_number":1784,"context_line":"            # Second poll shows it in progress"},{"line_number":1785,"context_line":"            {\u0027os_glance_importing_to_stores\u0027: [\u0027store\u0027],"},{"line_number":1786,"context_line":"             \u0027stores\u0027: []},"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_d0a7e04e","line":1783,"in_reply_to":"bf51134e_70ac14a0","updated":"2020-06-18 21:55:47.000000000","message":"Yeah, it would catch if the code were assuming an unimported image would have an empty \u0027stores\u0027 list.","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fb07f1f45b36b458572f9e34fe393bb8efd8e639","unresolved":false,"context_lines":[{"line_number":1780,"context_line":"        image \u003d self.image_class(self.INSTANCE, self.NAME)"},{"line_number":1781,"context_line":"        mock_imgapi.get.side_effect \u003d ["},{"line_number":1782,"context_line":"            # Simulate a race between starting the copy and the first poll"},{"line_number":1783,"context_line":"            {\u0027stores\u0027: []},"},{"line_number":1784,"context_line":"            # Second poll shows it in progress"},{"line_number":1785,"context_line":"            {\u0027os_glance_importing_to_stores\u0027: [\u0027store\u0027],"},{"line_number":1786,"context_line":"             \u0027stores\u0027: []},"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_70ac14a0","line":1783,"in_reply_to":"bf51134e_e52fc89e","updated":"2020-06-18 21:39:21.000000000","message":"Okay, I\u0027m not really sure what that would catch, other than something like the code only checking that stores is set to any value...","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"}],"nova/virt/libvirt/imagebackend.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"68445e7695410477297b7fd6347fda28411c8479","unresolved":false,"context_lines":[{"line_number":962,"context_line":"    def copy_to_store(self, context, image_meta):"},{"line_number":963,"context_line":"        store_name \u003d CONF.libvirt.glance_rbd_store"},{"line_number":964,"context_line":"        image_id \u003d image_meta[\u0027id\u0027]"},{"line_number":965,"context_line":"        image \u003d IMAGE_API.copy_image_to_store(context, image_id, store_name)"},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"        def _wait_for_copy():"},{"line_number":968,"context_line":"            image \u003d IMAGE_API.get(context, image_id, include_locations\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_60ae6699","line":965,"updated":"2020-05-21 22:28:39.000000000","message":"pep8: F841 local variable \u0027image\u0027 is assigned to but never used","commit_id":"7b40c351c6e1d4a5f64811397a15bbba7b0436a8"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"68445e7695410477297b7fd6347fda28411c8479","unresolved":false,"context_lines":[{"line_number":989,"context_line":"        timer \u003d loopingcall.FixedIntervalWithTimeoutLoopingCall(_wait_for_copy)"},{"line_number":990,"context_line":"        try:"},{"line_number":991,"context_line":"            result \u003d timer.start(interval\u003d15, timeout\u003d600).wait()"},{"line_number":992,"context_line":"        except loopingcall.LoopingCallTimeout as e:"},{"line_number":993,"context_line":"            raise exception.ImageUnacceptable("},{"line_number":994,"context_line":"                image_id\u003dimage_id,"},{"line_number":995,"context_line":"                reason\u003d\u0027Copy to store %(store)s timed out\u0027 % {"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_c092d258","line":992,"updated":"2020-05-21 22:28:39.000000000","message":"pep8: F841 local variable \u0027e\u0027 is assigned to but never used","commit_id":"7b40c351c6e1d4a5f64811397a15bbba7b0436a8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c365da118976a0d0aa95bebb0c0afbbe1fc62819","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            # the copy. Fall through to polling the image for completion"},{"line_number":970,"context_line":"            pass"},{"line_number":971,"context_line":"        except exception.ImageImportImpossible as exc:"},{"line_number":972,"context_line":"            # NOTE(danms): This means we can not do this operation at all,"},{"line_number":973,"context_line":"            # so fold this into the kind of imagebackend failure that is"},{"line_number":974,"context_line":"            # expected by our callers"},{"line_number":975,"context_line":"            raise exception.ImageUnacceptable(image_id\u003dimage_id,"},{"line_number":976,"context_line":"                                              reason\u003dstr(exc))"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"        def _wait_for_copy():"},{"line_number":979,"context_line":"            image \u003d IMAGE_API.get(context, image_id, include_locations\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_8483a0a9","line":976,"range":{"start_line":972,"start_character":10,"end_line":976,"end_character":62},"updated":"2020-06-10 06:36:06.000000000","message":"so it looks like glance wont do the image convert from whatever its in to raw so that it can be used with ceph?\n\n\u0027Build of instance 7f3694e3-5d67-496c-9aec-5c49f851d0dc aborted: Image 3f64760b-a268-4b17-a137-5529f96442b1 is unacceptable: Image is not raw format\u0027\n\nyou can see that in the failure here.\n\nhttps://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_94d/734184/6/check/nova-ceph-multistore/94de0b4/testr_results.html\n\nso either we need to modify glance to do that, tell it to do that if it already can or do the donwload,convert and upload ourselves.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"79fe2ca8a00734389e3f016821911bad26277574","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            # the copy. Fall through to polling the image for completion"},{"line_number":970,"context_line":"            pass"},{"line_number":971,"context_line":"        except exception.ImageImportImpossible as exc:"},{"line_number":972,"context_line":"            # NOTE(danms): This means we can not do this operation at all,"},{"line_number":973,"context_line":"            # so fold this into the kind of imagebackend failure that is"},{"line_number":974,"context_line":"            # expected by our callers"},{"line_number":975,"context_line":"            raise exception.ImageUnacceptable(image_id\u003dimage_id,"},{"line_number":976,"context_line":"                                              reason\u003dstr(exc))"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"        def _wait_for_copy():"},{"line_number":979,"context_line":"            image \u003d IMAGE_API.get(context, image_id, include_locations\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_2abc4104","line":976,"range":{"start_line":972,"start_character":10,"end_line":976,"end_character":62},"in_reply_to":"ff570b3c_64448c75","updated":"2020-06-15 14:48:16.000000000","message":"We talked about this last week on IRC, but just for posterity here: we do not expect glance to be doing any image format conversions as part of this process. That would violate Glance\u0027s own notion of the image\u0027s format, container, hash, etc. I think Sean was confusing the original import/upload from devstack with this copy-to-store, which also uses Glance\u0027s import API.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"227cc95df51d31de225c2a42c4071b968615802d","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            # the copy. Fall through to polling the image for completion"},{"line_number":970,"context_line":"            pass"},{"line_number":971,"context_line":"        except exception.ImageImportImpossible as exc:"},{"line_number":972,"context_line":"            # NOTE(danms): This means we can not do this operation at all,"},{"line_number":973,"context_line":"            # so fold this into the kind of imagebackend failure that is"},{"line_number":974,"context_line":"            # expected by our callers"},{"line_number":975,"context_line":"            raise exception.ImageUnacceptable(image_id\u003dimage_id,"},{"line_number":976,"context_line":"                                              reason\u003dstr(exc))"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"        def _wait_for_copy():"},{"line_number":979,"context_line":"            image \u003d IMAGE_API.get(context, image_id, include_locations\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_64448c75","line":976,"range":{"start_line":972,"start_character":10,"end_line":976,"end_character":62},"in_reply_to":"ff570b3c_8483a0a9","updated":"2020-06-10 06:45:07.000000000","message":"so it looks like the alternivie would be to configure glance image import image_conversion plugin\n\n\nhttps://docs.openstack.org/glance/latest/admin/interoperable-image-import.html#the-image-conversion\n\nby setting the following in glance-image-import.conf\n\n[image_import_opts]\nimage_import_plugins \u003d [\u0027image_conversion\u0027]\n\n[image_conversion]\noutput_format \u003d raw\n\n\nif that works then we just need to document it.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"8c28a266906a49d3907c16da9d829af436a4cbe4","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        try:"},{"line_number":1014,"context_line":"            result \u003d timer.start(interval\u003dinterval, timeout\u003dtimeout).wait()"},{"line_number":1015,"context_line":"        except loopingcall.LoopingCallTimeOut:"},{"line_number":1016,"context_line":"            raise exception.ImageUnacceptable("},{"line_number":1017,"context_line":"                image_id\u003dimage_id,"},{"line_number":1018,"context_line":"                reason\u003d\u0027Copy to store %(store)s timed out\u0027 % {"},{"line_number":1019,"context_line":"                    \u0027store\u0027: store_name})"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        if result is not True:"},{"line_number":1022,"context_line":"            raise exception.ImageUnacceptable("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_a7922657","line":1019,"range":{"start_line":1016,"start_character":12,"end_line":1019,"end_character":41},"updated":"2020-06-10 13:52:01.000000000","message":"I would like to make this exception more details, such as why the image unacceptable, disk space? timeout? or other reason. \nbut when I saw sean paste the import error \"\u0027Build of instance 7f3694e3-5d67-496c-9aec-5c49f851d0dc aborted: Image 3f64760b-a268-4b17-a137-5529f96442b1 is unacceptable: Image is not raw format\u0027\"\n\nI think it\u0027s ok for me, from the error message that I can know why it\u0027s failed.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"        try:"},{"line_number":1014,"context_line":"            result \u003d timer.start(interval\u003dinterval, timeout\u003dtimeout).wait()"},{"line_number":1015,"context_line":"        except loopingcall.LoopingCallTimeOut:"},{"line_number":1016,"context_line":"            raise exception.ImageUnacceptable("},{"line_number":1017,"context_line":"                image_id\u003dimage_id,"},{"line_number":1018,"context_line":"                reason\u003d\u0027Copy to store %(store)s timed out\u0027 % {"},{"line_number":1019,"context_line":"                    \u0027store\u0027: store_name})"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        if result is not True:"},{"line_number":1022,"context_line":"            raise exception.ImageUnacceptable("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_8129a338","line":1019,"range":{"start_line":1016,"start_character":12,"end_line":1019,"end_character":41},"in_reply_to":"ff570b3c_a7922657","updated":"2020-06-12 14:57:09.000000000","message":"@Brin: The L1018 exactly states that this exception is due to timeout","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"                reason\u003d\u0027Copy to store %(store)s timed out\u0027 % {"},{"line_number":1019,"context_line":"                    \u0027store\u0027: store_name})"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        if result is not True:"},{"line_number":1022,"context_line":"            raise exception.ImageUnacceptable("},{"line_number":1023,"context_line":"                image_id\u003dimage_id,"},{"line_number":1024,"context_line":"                reason\u003d(\u0027Copy to store %(store)s unsuccessful \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_619f2f65","line":1021,"updated":"2020-06-12 14:57:09.000000000","message":"This checks out. Raising loopingcall.LoopingCallDone() from the periodic will result in a True return value.","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bbd8217a9b8342646826942351e3f71546427ae4","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        # and then retry"},{"line_number":1051,"context_line":"        if CONF.libvirt.images_rbd_glance_store_name and copy_to_store:"},{"line_number":1052,"context_line":"            self.copy_to_store(context, image_meta)"},{"line_number":1053,"context_line":"            return self.clone(context, image_id_or_uri, copy_to_store\u003dFalse)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        reason \u003d _(\u0027No image locations are accessible\u0027)"},{"line_number":1056,"context_line":"        raise exception.ImageUnacceptable(image_id\u003dimage_id_or_uri,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_c16c3b9f","line":1053,"range":{"start_line":1053,"start_character":56,"end_line":1053,"end_character":75},"updated":"2020-06-12 14:57:09.000000000","message":"clever :)","commit_id":"06d7a908d1cf82a361f0430fdbfafedf9b63225d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5b70a8c0736a8fe4976bb666abd0420cb8ff29bc","unresolved":false,"context_lines":[{"line_number":985,"context_line":"                  store_name in image[\u0027stores\u0027]):"},{"line_number":986,"context_line":"                # No longer importing and our store is listed in the stores"},{"line_number":987,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":988,"context_line":"            else:"},{"line_number":989,"context_line":"                LOG.debug(\u0027Glance reports copy of image %(image)s to \u0027"},{"line_number":990,"context_line":"                          \u0027rbd store %(store)s is still in progress\u0027,"},{"line_number":991,"context_line":"                          {\u0027image\u0027: image_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_25326011","line":988,"updated":"2020-06-18 21:23:24.000000000","message":"Note to self: os_glance_importing_to_stores shows the store in the list while it is importing and the store is removed from the list when import is fully handled:\n\nhttps://specs.openstack.org/openstack/glance-specs/specs/ussuri/approved/glance/import-multi-stores.html","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5b70a8c0736a8fe4976bb666abd0420cb8ff29bc","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"                reason\u003d\u0027Copy to store %(store)s timed out\u0027 % {"},{"line_number":1019,"context_line":"                    \u0027store\u0027: store_name})"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"        if result is not True:"},{"line_number":1022,"context_line":"            raise exception.ImageUnacceptable("},{"line_number":1023,"context_line":"                image_id\u003dimage_id,"},{"line_number":1024,"context_line":"                reason\u003d(\u0027Copy to store %(store)s unsuccessful \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_8551ac65","line":1021,"updated":"2020-06-18 21:23:24.000000000","message":"Note to self: LoopingCallDone\u0027s return value defaults to True:\n\nhttps://docs.openstack.org/oslo.service/1.24.0/1.24.0/api/loopingcall.html#oslo_service.loopingcall.LoopingCallDone\n\nso when LoopingCallDone() is raised without an arg, _wait_for_copy will return True.\n\nAnd then we get to this code block if LoopingCallDone(\u0027failed import\u0027) was raised, then wait() will return \u0027failed import\u0027.","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5b70a8c0736a8fe4976bb666abd0420cb8ff29bc","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                                              reason\u003dreason)"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        for location in locations:"},{"line_number":1045,"context_line":"            if self.driver.is_cloneable(location, image_meta):"},{"line_number":1046,"context_line":"                LOG.debug(\u0027Selected location: %(loc)s\u0027, {\u0027loc\u0027: location})"},{"line_number":1047,"context_line":"                return self.driver.clone(location, self.rbd_name)"},{"line_number":1048,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf51134e_c5bba40b","line":1045,"updated":"2020-06-18 21:23:24.000000000","message":"Note to self: is_cloneable will return False when the image is in a different ceph cluster:\n\nhttps://github.com/openstack/nova/blob/f5f7c2540150c7ee7640c834d5caec31b3f5a7ab/nova/virt/libvirt/storage/rbd_utils.py#L214-L217","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"}],"releasenotes/notes/libvirt-rbd-glance-multistore-ecb66a071c282183.yaml":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5b70a8c0736a8fe4976bb666abd0420cb8ff29bc","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The libvirt RBD image backend module can now handle a Glance"},{"line_number":5,"context_line":"    multistore environment where more than multiple RBD clusters are"},{"line_number":6,"context_line":"    in use across a single Nova/Glance deployment, configured as"},{"line_number":7,"context_line":"    independent Glance stores. In the case where an instance is booted"},{"line_number":8,"context_line":"    with an image that does not exist in the RBD cluster that Nova is"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"bf51134e_052c7c97","line":5,"range":{"start_line":5,"start_character":33,"end_line":5,"end_character":42},"updated":"2020-06-18 21:23:24.000000000","message":"Nix?","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fb07f1f45b36b458572f9e34fe393bb8efd8e639","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The libvirt RBD image backend module can now handle a Glance"},{"line_number":5,"context_line":"    multistore environment where more than multiple RBD clusters are"},{"line_number":6,"context_line":"    in use across a single Nova/Glance deployment, configured as"},{"line_number":7,"context_line":"    independent Glance stores. In the case where an instance is booted"},{"line_number":8,"context_line":"    with an image that does not exist in the RBD cluster that Nova is"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"bf51134e_709a5463","line":5,"range":{"start_line":5,"start_character":33,"end_line":5,"end_character":42},"in_reply_to":"bf51134e_052c7c97","updated":"2020-06-18 21:39:21.000000000","message":"Yep.","commit_id":"4cfdfb7955f0b084c70f1ce476ad9468e41addb1"}]}
