)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"2fc00063a8a33415c5d2c0b4341518ed2a115372","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tomoki Sekiyama \u003ctomoki.sekiyama@hds.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-27 21:10:29 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Efficient image download and upload for Glance Cinder backend"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds an implementation of clone_image which offloads"},{"line_number":10,"context_line":"the image copy when the image is stored in Glance Cinder backend."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3a50d1a3_4a8a7d1c","line":7,"updated":"2015-07-29 07:59:26.000000000","message":"The first line should be limited to 50 characters. https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"a4c685e10eff321d15cc4849e634922236fca741"},{"author":{"_account_id":17444,"name":"Jay.Shen","email":"shenhong09@huawei.com","username":"Jay.Shen"},"change_message_id":"7e32b048bb960a1f25f1ec5d72ae0502f57a9f6a","unresolved":false,"context_lines":[{"line_number":24,"context_line":"in the current context\u0027s tenant."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"This also changes LVM driver implementation to enable"},{"line_number":27,"context_line":"image uplaod. Especially for thin LVM, it modifies"},{"line_number":28,"context_line":"create_cloned_volume method to create thin snapshot LV."},{"line_number":29,"context_line":"Note that the thin snapshot LV can be treated as the normal"},{"line_number":30,"context_line":"LVs; it can be read/written and can survive after the parent"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1a4dcd0f_4536a7b5","line":27,"updated":"2015-08-09 05:23:51.000000000","message":"S/uplaod/upload","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":24,"context_line":"in the current context\u0027s tenant."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"This also changes LVM driver implementation to enable"},{"line_number":27,"context_line":"image uplaod. Especially for thin LVM, it modifies"},{"line_number":28,"context_line":"create_cloned_volume method to create thin snapshot LV."},{"line_number":29,"context_line":"Note that the thin snapshot LV can be treated as the normal"},{"line_number":30,"context_line":"LVs; it can be read/written and can survive after the parent"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1a4dcd0f_e63a2b34","line":27,"in_reply_to":"1a4dcd0f_4536a7b5","updated":"2015-08-10 18:41:29.000000000","message":"Done","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"}],"cinder/image/glance.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                return client.call(context, \u0027add_location\u0027,"},{"line_number":278,"context_line":"                                   image_id, url, metadata)"},{"line_number":279,"context_line":"            except Exception:"},{"line_number":280,"context_line":"                _reraise_translated_image_exception(image_id)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def delete_locations(self, context, image_id, url_set):"},{"line_number":283,"context_line":"        if CONF.glance_api_version \u003d\u003d 2:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_ef50f260","line":280,"updated":"2015-08-09 02:22:11.000000000","message":"Should you throw exception if glance API version is not 2?","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                return client.call(context, \u0027add_location\u0027,"},{"line_number":278,"context_line":"                                   image_id, url, metadata)"},{"line_number":279,"context_line":"            except Exception:"},{"line_number":280,"context_line":"                _reraise_translated_image_exception(image_id)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def delete_locations(self, context, image_id, url_set):"},{"line_number":283,"context_line":"        if CONF.glance_api_version \u003d\u003d 2:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_864ec7bf","line":280,"in_reply_to":"1a4dcd0f_ef50f260","updated":"2015-08-10 18:41:29.000000000","message":"Agreed. Will raise an exception here if it is called. \n(The caller is checking the glance_api_version, so it shouldn\u0027t be raised usually. Just for future other users.)","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                return client.call(context, \u0027delete_locations\u0027,"},{"line_number":287,"context_line":"                                   image_id, url_set)"},{"line_number":288,"context_line":"            except Exception:"},{"line_number":289,"context_line":"                _reraise_translated_image_exception(image_id)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def download(self, context, image_id, data\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Calls out to Glance for data and writes data.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_8f4daec6","line":289,"updated":"2015-08-09 02:22:11.000000000","message":"Same here","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                return client.call(context, \u0027delete_locations\u0027,"},{"line_number":287,"context_line":"                                   image_id, url_set)"},{"line_number":288,"context_line":"            except Exception:"},{"line_number":289,"context_line":"                _reraise_translated_image_exception(image_id)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def download(self, context, image_id, data\u003dNone):"},{"line_number":292,"context_line":"        \"\"\"Calls out to Glance for data and writes data.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_66ca9b1c","line":289,"in_reply_to":"1a4dcd0f_8f4daec6","updated":"2015-08-10 18:41:29.000000000","message":"ditto.","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f02500726ddf425c798eceef6c0504d7ef1ca8a4","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        Returns a dict containing image metadata on success."},{"line_number":277,"context_line":"        \"\"\""},{"line_number":278,"context_line":"        if CONF.glance_api_version !\u003d 2:"},{"line_number":279,"context_line":"            raise exception.Invalid(\"Image API version 2 is disabled.\")"},{"line_number":280,"context_line":"        client \u003d GlanceClientWrapper(version\u003d2)"},{"line_number":281,"context_line":"        try:"},{"line_number":282,"context_line":"            return client.call(context, \u0027add_location\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa1b9901_b37c6fb6","line":279,"updated":"2015-08-24 16:19:59.000000000","message":"IMO, exception.InvalidConfigurationValue should be rised here","commit_id":"464c7db6eb7c6483ea38a77201d1bf484cfddf29"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"1a47b477f7ae8ff107af52cdfa3c108e4ee2eaaf","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        Returns a dict containing image metadata on success."},{"line_number":277,"context_line":"        \"\"\""},{"line_number":278,"context_line":"        if CONF.glance_api_version !\u003d 2:"},{"line_number":279,"context_line":"            raise exception.Invalid(\"Image API version 2 is disabled.\")"},{"line_number":280,"context_line":"        client \u003d GlanceClientWrapper(version\u003d2)"},{"line_number":281,"context_line":"        try:"},{"line_number":282,"context_line":"            return client.call(context, \u0027add_location\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa1b9901_8ec82076","line":279,"in_reply_to":"fa1b9901_b37c6fb6","updated":"2015-08-24 16:25:19.000000000","message":"exception.InvalidConfigurationValue is not suitable here. The message for InvalidConfigurationValue is :\n\n  Value \"%(value)s\" is not valid for configuration option \"%(option)s\"\n\nwhich is raised when unknown value is specified to an option that only accept specific values.","commit_id":"464c7db6eb7c6483ea38a77201d1bf484cfddf29"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f02500726ddf425c798eceef6c0504d7ef1ca8a4","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    def delete_locations(self, context, image_id, url_set):"},{"line_number":288,"context_line":"        \"\"\"Delete backend location urls from an image.\"\"\""},{"line_number":289,"context_line":"        if CONF.glance_api_version !\u003d 2:"},{"line_number":290,"context_line":"            raise exception.Invalid(\"Image API version 2 is disabled.\")"},{"line_number":291,"context_line":"        client \u003d GlanceClientWrapper(version\u003d2)"},{"line_number":292,"context_line":"        try:"},{"line_number":293,"context_line":"            return client.call(context, \u0027delete_locations\u0027, image_id, url_set)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa1b9901_13443b72","line":290,"updated":"2015-08-24 16:19:59.000000000","message":"The same as above","commit_id":"464c7db6eb7c6483ea38a77201d1bf484cfddf29"}],"cinder/tests/unit/test_volume.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":5550,"context_line":"    def test_copy_volume_to_image_with_image_volume_qcow2(self):"},{"line_number":5551,"context_line":"        self.image_meta[\u0027disk_format\u0027] \u003d \u0027qcow2\u0027"},{"line_number":5552,"context_line":"        image \u003d self._test_copy_volume_to_image_with_image_volume()"},{"line_number":5553,"context_line":"        self.assertEqual(None, image.get(\u0027locations\u0027))"},{"line_number":5554,"context_line":""},{"line_number":5555,"context_line":"    @mock.patch.object(vol_manager.VolumeManager, \u0027delete_volume\u0027)"},{"line_number":5556,"context_line":"    @mock.patch.object(fake_image._FakeImageService, \u0027add_location\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_af4aeaaa","line":5553,"updated":"2015-08-09 02:22:11.000000000","message":"Use assertIsNone","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":5550,"context_line":"    def test_copy_volume_to_image_with_image_volume_qcow2(self):"},{"line_number":5551,"context_line":"        self.image_meta[\u0027disk_format\u0027] \u003d \u0027qcow2\u0027"},{"line_number":5552,"context_line":"        image \u003d self._test_copy_volume_to_image_with_image_volume()"},{"line_number":5553,"context_line":"        self.assertEqual(None, image.get(\u0027locations\u0027))"},{"line_number":5554,"context_line":""},{"line_number":5555,"context_line":"    @mock.patch.object(vol_manager.VolumeManager, \u0027delete_volume\u0027)"},{"line_number":5556,"context_line":"    @mock.patch.object(fake_image._FakeImageService, \u0027add_location\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_06e8777b","line":5553,"in_reply_to":"1a4dcd0f_af4aeaaa","updated":"2015-08-10 18:41:29.000000000","message":"Done","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":5558,"context_line":"    def test_copy_volume_to_image_with_image_volume_failure("},{"line_number":5559,"context_line":"            self, mock_add_location, mock_delete):"},{"line_number":5560,"context_line":"        image \u003d self._test_copy_volume_to_image_with_image_volume()"},{"line_number":5561,"context_line":"        self.assertEqual(None, image.get(\u0027locations\u0027))"},{"line_number":5562,"context_line":"        self.assertTrue(mock_delete.called)"},{"line_number":5563,"context_line":""},{"line_number":5564,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_6fcb821f","line":5561,"updated":"2015-08-09 02:22:11.000000000","message":"Use assertIsNone","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":5558,"context_line":"    def test_copy_volume_to_image_with_image_volume_failure("},{"line_number":5559,"context_line":"            self, mock_add_location, mock_delete):"},{"line_number":5560,"context_line":"        image \u003d self._test_copy_volume_to_image_with_image_volume()"},{"line_number":5561,"context_line":"        self.assertEqual(None, image.get(\u0027locations\u0027))"},{"line_number":5562,"context_line":"        self.assertTrue(mock_delete.called)"},{"line_number":5563,"context_line":""},{"line_number":5564,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a6e0a397","line":5561,"in_reply_to":"1a4dcd0f_6fcb821f","updated":"2015-08-10 18:41:29.000000000","message":"Done","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"}],"cinder/tests/unit/volume/flows/test_create_volume_flow.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7aa763c142889666a0915492f02b2827953411cb","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        else:"},{"line_number":273,"context_line":"            self.assertFalse(fake_driver.create_cloned_volume.called)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test_create_from_image_volume_in_qcow2_format(self):"},{"line_number":276,"context_line":"        self.test_create_from_image_volume(format\u003d\u0027qcow2\u0027)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def test_create_from_image_volume_of_other_owner(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa1b9901_3606cd1c","line":275,"updated":"2015-08-25 18:00:01.000000000","message":"DDT would be a good option for doing something like this in the future.","commit_id":"a953ecea5b4ad74ae28c8306b88e01ae6be23740"}],"cinder/volume/driver.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"16b49ad1c0caac695f6e6227592f584d5bcbf4fb","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                     \u0027content. The cinder backend and locations support \u0027"},{"line_number":235,"context_line":"                     \u0027must be enabled in the image service, and \u0027"},{"line_number":236,"context_line":"                     \u0027glance_api_version must be set to 2.\u0027),"},{"line_number":237,"context_line":"    cfg.StrOpt(\u0027image_volume_tenant_id\u0027,"},{"line_number":238,"context_line":"               default\u003dNone,"},{"line_number":239,"context_line":"               help\u003d\u0027Tenant ID to hold the volumes for store images. \u0027"},{"line_number":240,"context_line":"                    \u0027If set to None, the image volume is created in the \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_cb280136","line":237,"updated":"2015-07-15 01:32:12.000000000","message":"We might want to use the same ones from https://review.openstack.org/#/c/199352/ I think there are a couple of features that at least were thinking about using those config options.","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e53e7c8410e44268bcef38f19d8d475976929de9","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                     \u0027content. The cinder backend and locations support \u0027"},{"line_number":235,"context_line":"                     \u0027must be enabled in the image service, and \u0027"},{"line_number":236,"context_line":"                     \u0027glance_api_version must be set to 2.\u0027),"},{"line_number":237,"context_line":"    cfg.StrOpt(\u0027image_volume_tenant_id\u0027,"},{"line_number":238,"context_line":"               default\u003dNone,"},{"line_number":239,"context_line":"               help\u003d\u0027Tenant ID to hold the volumes for store images. \u0027"},{"line_number":240,"context_line":"                    \u0027If set to None, the image volume is created in the \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_d6a96225","line":237,"in_reply_to":"9a41bdd9_cb280136","updated":"2015-07-15 16:12:26.000000000","message":"Agreed. I will look into the internal tenant support patch. Thanks.","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"beb2858544fa8b7ab3e96ef339435021c5f1eb67","unresolved":false,"context_lines":[{"line_number":245,"context_line":"iser_opts \u003d ["},{"line_number":246,"context_line":"    cfg.IntOpt(\u0027num_iser_scan_tries\u0027,"},{"line_number":247,"context_line":"               default\u003d3,"},{"line_number":248,"context_line":"               help\u003d\u0027The maximum number of times to rescan iSER target\u0027"},{"line_number":249,"context_line":"                    \u0027to find volume\u0027),"},{"line_number":250,"context_line":"    cfg.IntOpt(\u0027iser_num_targets\u0027,"},{"line_number":251,"context_line":"               default\u003dNone,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_4b4951b6","line":248,"updated":"2015-07-15 00:59:41.000000000","message":"Need a blank space at the end of the sentence.","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"16b49ad1c0caac695f6e6227592f584d5bcbf4fb","unresolved":false,"context_lines":[{"line_number":245,"context_line":"iser_opts \u003d ["},{"line_number":246,"context_line":"    cfg.IntOpt(\u0027num_iser_scan_tries\u0027,"},{"line_number":247,"context_line":"               default\u003d3,"},{"line_number":248,"context_line":"               help\u003d\u0027The maximum number of times to rescan iSER target\u0027"},{"line_number":249,"context_line":"                    \u0027to find volume\u0027),"},{"line_number":250,"context_line":"    cfg.IntOpt(\u0027iser_num_targets\u0027,"},{"line_number":251,"context_line":"               default\u003dNone,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_8ea20798","line":248,"in_reply_to":"9a41bdd9_4b4951b6","updated":"2015-07-15 01:32:12.000000000","message":"that isn\u0027t part of this change... it can be fixed separately","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"16b49ad1c0caac695f6e6227592f584d5bcbf4fb","unresolved":false,"context_lines":[{"line_number":631,"context_line":"            self.db.volume_destroy(context.elevated(), image_volume.id)"},{"line_number":632,"context_line":"            return False"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        LOG.debug(\u0027Registering image volume URI succeeded.\u0027)"},{"line_number":635,"context_line":"        try:"},{"line_number":636,"context_line":"            model_update \u003d (self.create_cloned_volume(image_volume, volume)"},{"line_number":637,"context_line":"                            or {})"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_8b943943","line":634,"updated":"2015-07-15 01:32:12.000000000","message":"Any concern about someone trying to use the image before it has finished cloning? What happens?","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e53e7c8410e44268bcef38f19d8d475976929de9","unresolved":false,"context_lines":[{"line_number":631,"context_line":"            self.db.volume_destroy(context.elevated(), image_volume.id)"},{"line_number":632,"context_line":"            return False"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"        LOG.debug(\u0027Registering image volume URI succeeded.\u0027)"},{"line_number":635,"context_line":"        try:"},{"line_number":636,"context_line":"            model_update \u003d (self.create_cloned_volume(image_volume, volume)"},{"line_number":637,"context_line":"                            or {})"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_a13a5a97","line":634,"in_reply_to":"9a41bdd9_8b943943","updated":"2015-07-15 16:12:26.000000000","message":"Good point. My intention here was to check whether Glance accepts \"cinder://\" uri before cloning the actual volume, but it may happen accesses to volumes while it is in \u0027creating\u0027 status.\n\nI\u0027ll change this to register-after-clone.","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"16b49ad1c0caac695f6e6227592f584d5bcbf4fb","unresolved":false,"context_lines":[{"line_number":644,"context_line":"            # volume location which causes volume deletion request."},{"line_number":645,"context_line":"            self.db.volume_destroy(context.elevated(), image_volume.id)"},{"line_number":646,"context_line":"            try:"},{"line_number":647,"context_line":"                image_service.delete_locations(context, image_meta[\u0027id\u0027],"},{"line_number":648,"context_line":"                                               {uri})"},{"line_number":649,"context_line":"            except (exception.Invalid, exception.NotFound):"},{"line_number":650,"context_line":"                LOG.exception(_LE(\u0027Failed to delete location %(uri)s\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_6e7ea31a","line":647,"updated":"2015-07-15 01:32:12.000000000","message":"Do we need to handle the case where the volume is deleted in cinder out from underneath glance? Seems like we would need to delete the location from the image, right?","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e53e7c8410e44268bcef38f19d8d475976929de9","unresolved":false,"context_lines":[{"line_number":644,"context_line":"            # volume location which causes volume deletion request."},{"line_number":645,"context_line":"            self.db.volume_destroy(context.elevated(), image_volume.id)"},{"line_number":646,"context_line":"            try:"},{"line_number":647,"context_line":"                image_service.delete_locations(context, image_meta[\u0027id\u0027],"},{"line_number":648,"context_line":"                                               {uri})"},{"line_number":649,"context_line":"            except (exception.Invalid, exception.NotFound):"},{"line_number":650,"context_line":"                LOG.exception(_LE(\u0027Failed to delete location %(uri)s\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_5c7b317b","line":647,"in_reply_to":"9a41bdd9_6e7ea31a","updated":"2015-07-15 16:12:26.000000000","message":"That would be a good feature to have. I think we can add a hook into the volume deletion sequence to delete the location based on volume metadata.","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"16b49ad1c0caac695f6e6227592f584d5bcbf4fb","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                image_meta[\u0027container_format\u0027] \u003d\u003d \u0027bare\u0027):"},{"line_number":676,"context_line":"            if self._add_image_volume_location(context, volume,"},{"line_number":677,"context_line":"                                               image_service, image_meta):"},{"line_number":678,"context_line":"                return"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        use_multipath \u003d self.configuration.use_multipath_for_image_xfer"},{"line_number":681,"context_line":"        enforce_multipath \u003d self.configuration.enforce_multipath_for_image_xfer"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_8e944743","line":678,"updated":"2015-07-15 01:32:12.000000000","message":"So if we do this, how can anyone other than this cinder backend use the image? Does that require the glance changes to upload/download mentioned in the commit message?","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"e53e7c8410e44268bcef38f19d8d475976929de9","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                image_meta[\u0027container_format\u0027] \u003d\u003d \u0027bare\u0027):"},{"line_number":676,"context_line":"            if self._add_image_volume_location(context, volume,"},{"line_number":677,"context_line":"                                               image_service, image_meta):"},{"line_number":678,"context_line":"                return"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        use_multipath \u003d self.configuration.use_multipath_for_image_xfer"},{"line_number":681,"context_line":"        enforce_multipath \u003d self.configuration.enforce_multipath_for_image_xfer"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_1cc849a5","line":678,"in_reply_to":"9a41bdd9_8e944743","updated":"2015-07-15 16:12:26.000000000","message":"Yes, my Glance patch will give read access to the image volume added here for others than Cinder.","commit_id":"281dc5e4f6b81e7d0cc01e9ff1dd4bce9f72e8ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7aa763c142889666a0915492f02b2827953411cb","unresolved":false,"context_lines":[{"line_number":248,"context_line":"                help\u003d\u0027If set to True, the image volume created by \u0027"},{"line_number":249,"context_line":"                     \u0027upload-to-image will be placed in the internal tenant. \u0027"},{"line_number":250,"context_line":"                     \u0027Otherwise, the image volume is created in the current \u0027"},{"line_number":251,"context_line":"                     \u0027context\\\u0027s tenant.\u0027),"},{"line_number":252,"context_line":"]"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"# for backward compatibility"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa1b9901_962c799a","line":251,"updated":"2015-08-25 18:00:01.000000000","message":"Just use double quotes so you can use a single quote inline without escaping it.","commit_id":"a953ecea5b4ad74ae28c8306b88e01ae6be23740"}],"cinder/volume/flows/manager/create_volume.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3d4b1f9d11a30e34105492b10a684dc9149cfedb","unresolved":false,"context_lines":[{"line_number":591,"context_line":""},{"line_number":592,"context_line":"        if (image_meta.get(\u0027container_format\u0027) !\u003d \u0027bare\u0027 or"},{"line_number":593,"context_line":"                image_meta.get(\u0027disk_format\u0027) !\u003d \u0027raw\u0027):"},{"line_number":594,"context_line":"            LOG.debug(\"Requested image is not in raw format.\")"},{"line_number":595,"context_line":"            return None, False"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        image_volume \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_4031870a","line":594,"updated":"2015-07-17 18:41:55.000000000","message":"Maybe useful to add image id or something here.","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":591,"context_line":""},{"line_number":592,"context_line":"        if (image_meta.get(\u0027container_format\u0027) !\u003d \u0027bare\u0027 or"},{"line_number":593,"context_line":"                image_meta.get(\u0027disk_format\u0027) !\u003d \u0027raw\u0027):"},{"line_number":594,"context_line":"            LOG.debug(\"Requested image is not in raw format.\")"},{"line_number":595,"context_line":"            return None, False"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        image_volume \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_07596a5a","line":594,"in_reply_to":"9a41bdd9_4031870a","updated":"2015-07-20 18:56:14.000000000","message":"Done","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3d4b1f9d11a30e34105492b10a684dc9149cfedb","unresolved":false,"context_lines":[{"line_number":603,"context_line":"            if url.startswith(\"cinder://\"):"},{"line_number":604,"context_line":"                image_vol_id \u003d url[9:]"},{"line_number":605,"context_line":"                try:"},{"line_number":606,"context_line":"                    image_volume \u003d self.db.volume_get(context, image_vol_id)"},{"line_number":607,"context_line":"                except exception.VolumeNotFound:"},{"line_number":608,"context_line":"                    LOG.warning(_LW(\"Image volume %(id)s is not found.\"),"},{"line_number":609,"context_line":"                                {\u0027id\u0027: image_vol_id})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_43b671dd","line":606,"updated":"2015-07-17 18:41:55.000000000","message":"Not sure if it really matters much, or if we expect lots of different \u0027cinder://\u0027 urls but we could maybe build a list of their id\u0027s first then do a db.volume_get_all() call with the list of id\u0027s and host as filters. That way we only ever need to do a single db query to find the image_volume.","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":603,"context_line":"            if url.startswith(\"cinder://\"):"},{"line_number":604,"context_line":"                image_vol_id \u003d url[9:]"},{"line_number":605,"context_line":"                try:"},{"line_number":606,"context_line":"                    image_volume \u003d self.db.volume_get(context, image_vol_id)"},{"line_number":607,"context_line":"                except exception.VolumeNotFound:"},{"line_number":608,"context_line":"                    LOG.warning(_LW(\"Image volume %(id)s is not found.\"),"},{"line_number":609,"context_line":"                                {\u0027id\u0027: image_vol_id})"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_a7175650","line":606,"in_reply_to":"9a41bdd9_43b671dd","updated":"2015-07-20 18:56:14.000000000","message":"Nice idea. I\u0027ve changed these to db.volume_get_all_by_host, the code is now simpler.","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3d4b1f9d11a30e34105492b10a684dc9149cfedb","unresolved":false,"context_lines":[{"line_number":611,"context_line":"                # For the case image volume is stored in the service tenant,"},{"line_number":612,"context_line":"                # image_owner volume metadata should also be checked."},{"line_number":613,"context_line":"                image_owner \u003d None"},{"line_number":614,"context_line":"                for m in image_volume.get(\u0027volume_metadata\u0027, {}):"},{"line_number":615,"context_line":"                    if m[\u0027key\u0027] \u003d\u003d \u0027image_owner\u0027:"},{"line_number":616,"context_line":"                        image_owner \u003d m[\u0027value\u0027]"},{"line_number":617,"context_line":"                if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_e33545db","line":614,"updated":"2015-07-17 18:41:55.000000000","message":"Would it make sense to do the host check first? no point checking anything else if its on the wrong backend, or we maybe don\u0027t even need to do it at all if we use the filters with volume_get_all()","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":611,"context_line":"                # For the case image volume is stored in the service tenant,"},{"line_number":612,"context_line":"                # image_owner volume metadata should also be checked."},{"line_number":613,"context_line":"                image_owner \u003d None"},{"line_number":614,"context_line":"                for m in image_volume.get(\u0027volume_metadata\u0027, {}):"},{"line_number":615,"context_line":"                    if m[\u0027key\u0027] \u003d\u003d \u0027image_owner\u0027:"},{"line_number":616,"context_line":"                        image_owner \u003d m[\u0027value\u0027]"},{"line_number":617,"context_line":"                if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_b9ff7a00","line":614,"in_reply_to":"9a41bdd9_e33545db","updated":"2015-07-20 18:56:14.000000000","message":"Done","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3d4b1f9d11a30e34105492b10a684dc9149cfedb","unresolved":false,"context_lines":[{"line_number":615,"context_line":"                    if m[\u0027key\u0027] \u003d\u003d \u0027image_owner\u0027:"},{"line_number":616,"context_line":"                        image_owner \u003d m[\u0027value\u0027]"},{"line_number":617,"context_line":"                if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"},{"line_number":618,"context_line":"                        image_meta[\u0027owner\u0027] !\u003d image_owner):"},{"line_number":619,"context_line":"                    LOG.debug(\"Skipping image volume %(id)s because \""},{"line_number":620,"context_line":"                              \"it is not accesible by current Tenant.\","},{"line_number":621,"context_line":"                              {\u0027id\u0027: image_vol_id})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_8390f996","line":618,"updated":"2015-07-17 18:41:55.000000000","message":"should it also check if the image is public?","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":615,"context_line":"                    if m[\u0027key\u0027] \u003d\u003d \u0027image_owner\u0027:"},{"line_number":616,"context_line":"                        image_owner \u003d m[\u0027value\u0027]"},{"line_number":617,"context_line":"                if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"},{"line_number":618,"context_line":"                        image_meta[\u0027owner\u0027] !\u003d image_owner):"},{"line_number":619,"context_line":"                    LOG.debug(\"Skipping image volume %(id)s because \""},{"line_number":620,"context_line":"                              \"it is not accesible by current Tenant.\","},{"line_number":621,"context_line":"                              {\u0027id\u0027: image_vol_id})"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_992b9e30","line":618,"in_reply_to":"9a41bdd9_8390f996","updated":"2015-07-20 18:56:14.000000000","message":"If we have image_meta here, that means the image is accessible by current context, so I think omit the image visibility check.\n\nThis additional check here is to avoid users form accessing unauthorized volumes. For example, a users might add others\u0027 cinder volume location in the service tenant to their own image and tries to clone that volume. By checking the image volume owner matches to the image owner, we can users to access only to volumes they own.","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"aa187c4ce4fbde8cd8d68cb45a128c5494c298c8","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                pass"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    def _clone_image_volume(self, context, volume, image_location, image_meta,"},{"line_number":583,"context_line":"                            image_service):"},{"line_number":584,"context_line":"        \"\"\"Create a volume efficiently from an existing image."},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        Returns a dict of volume properties eg. provider_location,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_a8215b4f","line":583,"updated":"2015-07-20 23:57:30.000000000","message":"doesn\u0027t look like image_service is actually used, do we still need it passed in here?","commit_id":"4d674633f2dcda5197437f42f1a2d472f495d8f3"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2d51f3c78b9f5fbf0fd53bd2c0e4124cddbf2995","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                pass"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"    def _clone_image_volume(self, context, volume, image_location, image_meta,"},{"line_number":583,"context_line":"                            image_service):"},{"line_number":584,"context_line":"        \"\"\"Create a volume efficiently from an existing image."},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        Returns a dict of volume properties eg. provider_location,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_e93854f0","line":583,"in_reply_to":"3a50d1a3_a8215b4f","updated":"2015-07-22 19:05:04.000000000","message":"Removed image_service. Thanks for pointing out this.","commit_id":"4d674633f2dcda5197437f42f1a2d472f495d8f3"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        if (image_meta.get(\u0027container_format\u0027) !\u003d \u0027bare\u0027 or"},{"line_number":583,"context_line":"                image_meta.get(\u0027disk_format\u0027) !\u003d \u0027raw\u0027):"},{"line_number":584,"context_line":"            LOG.debug(\"Requested image %(id)s is not in raw format.\","},{"line_number":585,"context_line":"                      {\u0027id\u0027: image_meta.get(\u0027id\u0027)})"},{"line_number":586,"context_line":"            return None, False"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_2fd57ab8","line":584,"updated":"2015-08-09 02:22:11.000000000","message":"This should be a warning or info msg.","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":581,"context_line":""},{"line_number":582,"context_line":"        if (image_meta.get(\u0027container_format\u0027) !\u003d \u0027bare\u0027 or"},{"line_number":583,"context_line":"                image_meta.get(\u0027disk_format\u0027) !\u003d \u0027raw\u0027):"},{"line_number":584,"context_line":"            LOG.debug(\"Requested image %(id)s is not in raw format.\","},{"line_number":585,"context_line":"                      {\u0027id\u0027: image_meta.get(\u0027id\u0027)})"},{"line_number":586,"context_line":"            return None, False"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_26a2534c","line":584,"in_reply_to":"1a4dcd0f_2fd57ab8","updated":"2015-08-10 18:41:29.000000000","message":"Made it to LOG.info().","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                    image_owner \u003d m[\u0027value\u0027]"},{"line_number":604,"context_line":"            if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"},{"line_number":605,"context_line":"                    image_meta[\u0027owner\u0027] !\u003d image_owner):"},{"line_number":606,"context_line":"                LOG.debug(\"Skipping image volume %(id)s because \""},{"line_number":607,"context_line":"                          \"it is not accesible by current Tenant.\","},{"line_number":608,"context_line":"                          {\u0027id\u0027: image_volume.id})"},{"line_number":609,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_efd792bd","line":606,"updated":"2015-08-09 02:22:11.000000000","message":"Warning or info msg?","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                    image_owner \u003d m[\u0027value\u0027]"},{"line_number":604,"context_line":"            if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"},{"line_number":605,"context_line":"                    image_meta[\u0027owner\u0027] !\u003d image_owner):"},{"line_number":606,"context_line":"                LOG.debug(\"Skipping image volume %(id)s because \""},{"line_number":607,"context_line":"                          \"it is not accesible by current Tenant.\","},{"line_number":608,"context_line":"                          {\u0027id\u0027: image_volume.id})"},{"line_number":609,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_66985b1c","line":606,"in_reply_to":"1a4dcd0f_efd792bd","updated":"2015-08-10 18:41:29.000000000","message":"Made it to LOG.info().","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"4f53468377b593b7bf2b8b397516a252b1c9a6ee","unresolved":false,"context_lines":[{"line_number":604,"context_line":"            if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"},{"line_number":605,"context_line":"                    image_meta[\u0027owner\u0027] !\u003d image_owner):"},{"line_number":606,"context_line":"                LOG.info(_LI(\"Skipping image volume %(id)s because \""},{"line_number":607,"context_line":"                             \"it is not accesible by current Tenant.\"),"},{"line_number":608,"context_line":"                         {\u0027id\u0027: image_volume.id})"},{"line_number":609,"context_line":"                continue"},{"line_number":610,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"fa1b9901_7a46a050","line":607,"updated":"2015-08-24 20:03:56.000000000","message":"accesible -\u003e accessible","commit_id":"f645c11d0fe31ef3b800889503c90c60addf7f62"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"156d21a632427b5581a781f2cd8764d0e991281d","unresolved":false,"context_lines":[{"line_number":604,"context_line":"            if (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027] and"},{"line_number":605,"context_line":"                    image_meta[\u0027owner\u0027] !\u003d image_owner):"},{"line_number":606,"context_line":"                LOG.info(_LI(\"Skipping image volume %(id)s because \""},{"line_number":607,"context_line":"                             \"it is not accesible by current Tenant.\"),"},{"line_number":608,"context_line":"                         {\u0027id\u0027: image_volume.id})"},{"line_number":609,"context_line":"                continue"},{"line_number":610,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"fa1b9901_e421864e","line":607,"in_reply_to":"fa1b9901_7a46a050","updated":"2015-08-25 15:18:25.000000000","message":"Done","commit_id":"f645c11d0fe31ef3b800889503c90c60addf7f62"}],"cinder/volume/manager.py":[{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3d4b1f9d11a30e34105492b10a684dc9149cfedb","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        self._notify_about_volume_usage(context, volume, \"detach.end\")"},{"line_number":928,"context_line":"        LOG.info(_LI(\"Detach volume completed successfully.\"), resource\u003dvolume)"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _add_image_volume_location(self, ctx, volume, image_service,"},{"line_number":931,"context_line":"                                   image_meta):"},{"line_number":932,"context_line":"        \"\"\"Create a cloned volume and register its location to the image.\"\"\""},{"line_number":933,"context_line":"        if (image_meta[\u0027disk_format\u0027] !\u003d \u0027raw\u0027 or"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_76db311c","line":930,"updated":"2015-07-17 18:41:55.000000000","message":"we might want to name this something different, its doing a lot more than just adding the location, maybe too long but something more descriptive like _clone_image_volume_and_add_location","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        self._notify_about_volume_usage(context, volume, \"detach.end\")"},{"line_number":928,"context_line":"        LOG.info(_LI(\"Detach volume completed successfully.\"), resource\u003dvolume)"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _add_image_volume_location(self, ctx, volume, image_service,"},{"line_number":931,"context_line":"                                   image_meta):"},{"line_number":932,"context_line":"        \"\"\"Create a cloned volume and register its location to the image.\"\"\""},{"line_number":933,"context_line":"        if (image_meta[\u0027disk_format\u0027] !\u003d \u0027raw\u0027 or"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_79dd7241","line":930,"in_reply_to":"9a41bdd9_76db311c","updated":"2015-07-20 18:56:14.000000000","message":"Done","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"385ff6b882280c7990ed5414131c9a248499bf8a","unresolved":false,"context_lines":[{"line_number":969,"context_line":"                          {\u0027volume_id\u0027: volume.id,"},{"line_number":970,"context_line":"                           \u0027image_id\u0027: image_meta[\u0027id\u0027]})"},{"line_number":971,"context_line":"            try:"},{"line_number":972,"context_line":"                self.delete_volume(image_volume_context, image_volume)"},{"line_number":973,"context_line":"            except exception.CinderException:"},{"line_number":974,"context_line":"                LOG.exception(_LE(\u0027Could not delete failed image volume \u0027"},{"line_number":975,"context_line":"                                  \u0027%(id)s\u0027), {\u0027id\u0027: volume.id})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_05ab898a","line":972,"updated":"2015-07-17 21:04:48.000000000","message":"One thing I just noticed when playing around with the code a little bit, it looks like this delete will try and subtract used quota for the owner, but since we never go through the top level create api we never actually used any quota. This might do weird things to the image-volume owner\u0027s total quota values, although it is totally possible i\u0027m missing something and the quota reservation stuff is smarter than I think it is...\n\nMaybe the easiest fix is to add a new parameter to delete_volume to skip doing the quota stuff, looks like it does that right now if the volume is migrating anyway.","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":969,"context_line":"                          {\u0027volume_id\u0027: volume.id,"},{"line_number":970,"context_line":"                           \u0027image_id\u0027: image_meta[\u0027id\u0027]})"},{"line_number":971,"context_line":"            try:"},{"line_number":972,"context_line":"                self.delete_volume(image_volume_context, image_volume)"},{"line_number":973,"context_line":"            except exception.CinderException:"},{"line_number":974,"context_line":"                LOG.exception(_LE(\u0027Could not delete failed image volume \u0027"},{"line_number":975,"context_line":"                                  \u0027%(id)s\u0027), {\u0027id\u0027: volume.id})"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_5993d65b","line":972,"in_reply_to":"9a41bdd9_05ab898a","updated":"2015-07-20 18:56:14.000000000","message":"I\u0027ve added a quota reservation on creating the volume to store the image.\n(We would be better to configure quotas for service tenant unlimited.)","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"3d4b1f9d11a30e34105492b10a684dc9149cfedb","unresolved":false,"context_lines":[{"line_number":989,"context_line":"            LOG.warning(_LW(\u0027Registration of image volume URI %(uri)s \u0027"},{"line_number":990,"context_line":"                            \u0027to image %(image_id)s failed.\u0027),"},{"line_number":991,"context_line":"                        {\u0027uri\u0027: uri, \u0027image_id\u0027: image_meta[\u0027id\u0027]})"},{"line_number":992,"context_line":"            self.delete_volume(image_volume_context, image_volume)"},{"line_number":993,"context_line":"            return False"},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"        image_volume_meta \u003d {\u0027glance_image_id\u0027: image_meta[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_d6c9dd7a","line":992,"updated":"2015-07-17 18:41:55.000000000","message":"should this have a try/except like above on line 972?","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"d9710e9cca8bb63a30928e05981361475c77fae8","unresolved":false,"context_lines":[{"line_number":989,"context_line":"            LOG.warning(_LW(\u0027Registration of image volume URI %(uri)s \u0027"},{"line_number":990,"context_line":"                            \u0027to image %(image_id)s failed.\u0027),"},{"line_number":991,"context_line":"                        {\u0027uri\u0027: uri, \u0027image_id\u0027: image_meta[\u0027id\u0027]})"},{"line_number":992,"context_line":"            self.delete_volume(image_volume_context, image_volume)"},{"line_number":993,"context_line":"            return False"},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"        image_volume_meta \u003d {\u0027glance_image_id\u0027: image_meta[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_f976623d","line":992,"in_reply_to":"9a41bdd9_d6c9dd7a","updated":"2015-07-20 18:56:14.000000000","message":"Added try/except here too.","commit_id":"37c3b887a0fbf8ba0b8e8b2e85b5097eedb3f975"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"ea1f24bac7dcee152d34f69599c29c738cc4b88d","unresolved":false,"context_lines":[{"line_number":962,"context_line":"        image_volume \u003d self.db.volume_create(image_volume_context,"},{"line_number":963,"context_line":"                                             new_vol_values)"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        QUOTAS.commit(image_volume_context, reservations,"},{"line_number":966,"context_line":"                      project_id\u003dnew_vol_values[\u0027project_id\u0027])"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_7a02390d","line":965,"updated":"2015-07-20 23:09:08.000000000","message":"Other places in cinder where we do quota stuff it is inside a try/catch with a very broad clause (I see some \u0027Exception\u0027 ones) which will roll back the operation if things fail. I think we probably need to handle the case where the reservation fails from being out of quota where this method should just return False. Then the case where the self.db.volume_create doesn\u0027t succeed we need to roll back the quota reservation.\n\nLooks like later on if things fail we call self.delete_volume which should handle reverting the quota stuff so those ones are safe.","commit_id":"4d674633f2dcda5197437f42f1a2d472f495d8f3"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2d51f3c78b9f5fbf0fd53bd2c0e4124cddbf2995","unresolved":false,"context_lines":[{"line_number":962,"context_line":"        image_volume \u003d self.db.volume_create(image_volume_context,"},{"line_number":963,"context_line":"                                             new_vol_values)"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        QUOTAS.commit(image_volume_context, reservations,"},{"line_number":966,"context_line":"                      project_id\u003dnew_vol_values[\u0027project_id\u0027])"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_89019008","line":965,"in_reply_to":"3a50d1a3_7a02390d","updated":"2015-07-22 19:05:04.000000000","message":"Put self.db.volume_create into try/except and rollback on the exception.","commit_id":"4d674633f2dcda5197437f42f1a2d472f495d8f3"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"dc6d45e560d15339d94bf51847157ff1f228a55f","unresolved":false,"context_lines":[{"line_number":946,"context_line":"            new_vol_values[\u0027status\u0027] \u003d \u0027creating\u0027"},{"line_number":947,"context_line":"            new_vol_values[\u0027project_id\u0027] \u003d ctx.project_id"},{"line_number":948,"context_line":"            new_vol_values[\u0027display_name\u0027] \u003d \u0027image-%s\u0027 % image_meta[\u0027id\u0027]"},{"line_number":949,"context_line":"            LOG.debug(\u0027Creating image volume entry: %s\u0027, new_vol_values)"},{"line_number":950,"context_line":"            image_volume \u003d self.db.volume_create(ctx, new_vol_values)"},{"line_number":951,"context_line":"        except Exception:"},{"line_number":952,"context_line":"            QUOTAS.rollback(ctx, reservations)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_d7391bf4","line":949,"updated":"2015-07-24 02:05:48.000000000","message":". after \"entry: %s\"","commit_id":"2fb5ddb14b5c59339a4cb28c8ef6e97fb6648117"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"dc6d45e560d15339d94bf51847157ff1f228a55f","unresolved":false,"context_lines":[{"line_number":977,"context_line":"                self.delete_volume(ctx, image_volume)"},{"line_number":978,"context_line":"            except exception.CinderException:"},{"line_number":979,"context_line":"                LOG.exception(_LE(\u0027Could not delete failed image volume \u0027"},{"line_number":980,"context_line":"                                  \u0027%(id)s\u0027), {\u0027id\u0027: volume.id})"},{"line_number":981,"context_line":"            return False"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"    def _clone_image_volume_and_add_location(self, ctx, volume, image_service,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_371cff76","line":980,"updated":"2015-07-24 02:05:48.000000000","message":". after \"%(id)s\"","commit_id":"2fb5ddb14b5c59339a4cb28c8ef6e97fb6648117"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"dc6d45e560d15339d94bf51847157ff1f228a55f","unresolved":false,"context_lines":[{"line_number":1007,"context_line":"        except (exception.NotAuthorized, exception.Invalid,"},{"line_number":1008,"context_line":"                exception.NotFound):"},{"line_number":1009,"context_line":"            LOG.exception(_LE(\u0027Failed to register image volume location \u0027"},{"line_number":1010,"context_line":"                              \u0027%(uri)s\u0027), {\u0027uri\u0027: uri})"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"        if not image_registered:"},{"line_number":1013,"context_line":"            LOG.warning(_LW(\u0027Registration of image volume URI %(uri)s \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_7702870d","line":1010,"updated":"2015-07-24 02:05:48.000000000","message":". after \"%(uri)s\"","commit_id":"2fb5ddb14b5c59339a4cb28c8ef6e97fb6648117"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"dc6d45e560d15339d94bf51847157ff1f228a55f","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"                self.delete_volume(image_volume_context, image_volume)"},{"line_number":1018,"context_line":"            except exception.CinderException:"},{"line_number":1019,"context_line":"                LOG.exception(_LE(\u0027Could not delete failed image volume \u0027"},{"line_number":1020,"context_line":"                                  \u0027%(id)s\u0027), {\u0027id\u0027: volume.id})"},{"line_number":1021,"context_line":"            return False"},{"line_number":1022,"context_line":""},{"line_number":1023,"context_line":"        image_volume_meta \u003d {\u0027glance_image_id\u0027: image_meta[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_521c396a","line":1020,"updated":"2015-07-24 02:05:48.000000000","message":". after \"%(id)s\"","commit_id":"2fb5ddb14b5c59339a4cb28c8ef6e97fb6648117"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"02593f13f33f5b8683e39cc18d44a78c8eb1c4c0","unresolved":false,"context_lines":[{"line_number":935,"context_line":""},{"line_number":936,"context_line":"        try:"},{"line_number":937,"context_line":"            new_vol_values \u003d {}"},{"line_number":938,"context_line":"            for k, v in volume.iteritems():"},{"line_number":939,"context_line":"                new_vol_values[k] \u003d v"},{"line_number":940,"context_line":"            del new_vol_values[\u0027id\u0027]"},{"line_number":941,"context_line":"            del new_vol_values[\u0027_name_id\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_a3a3bc9d","line":938,"updated":"2015-07-25 07:46:12.000000000","message":"Should replace volume.iteritems() with  volume.items() to make it compatible to py3.","commit_id":"71c3c6b5e1d1bbfd7179c7f572b8f609468466e3"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"02593f13f33f5b8683e39cc18d44a78c8eb1c4c0","unresolved":false,"context_lines":[{"line_number":976,"context_line":"            try:"},{"line_number":977,"context_line":"                self.delete_volume(ctx, image_volume)"},{"line_number":978,"context_line":"            except exception.CinderException:"},{"line_number":979,"context_line":"                LOG.exception(_LE(\u0027Could not delete failed image volume \u0027"},{"line_number":980,"context_line":"                                  \u0027%(id)s.\u0027), {\u0027id\u0027: volume.id})"},{"line_number":981,"context_line":"            return False"},{"line_number":982,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a50d1a3_43b998ca","line":979,"updated":"2015-07-25 07:46:12.000000000","message":"What is ‘failed image volume’? It\u0027s confusing.","commit_id":"71c3c6b5e1d1bbfd7179c7f572b8f609468466e3"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"b20ceed0419b3aedde93fbd4d9f8afd693e50f96","unresolved":false,"context_lines":[{"line_number":962,"context_line":""},{"line_number":963,"context_line":"        try:"},{"line_number":964,"context_line":"            self.create_volume(ctx, image_volume.id,"},{"line_number":965,"context_line":"                               source_volid\u003dvolume.id,"},{"line_number":966,"context_line":"                               allow_reschedule\u003dFalse)"},{"line_number":967,"context_line":"            image_volume \u003d self.db.volume_get(ctx, image_volume.id)"},{"line_number":968,"context_line":"            if image_volume.status !\u003d \u0027available\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a50d1a3_f6de1d6c","line":965,"updated":"2015-07-27 22:18:31.000000000","message":"I think this parameter has been removed, I\u0027m seeing errors like this: http://paste.openstack.org/show/405975/\n\nIf I understand what the code does now we need to set\n\nnew_vol_values[\u0027source_volid\u0027] \u003d volume.id\n\nearlier in the new image_volume db entry and then create without passing this parameter in","commit_id":"9de286fdbceee08d87df9066502f2810f6b8d10b"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0f838f99c048dde885069f1553807aac74540b88","unresolved":false,"context_lines":[{"line_number":967,"context_line":"                               allow_reschedule\u003dFalse)"},{"line_number":968,"context_line":"            image_volume \u003d self.db.volume_get(ctx, image_volume.id)"},{"line_number":969,"context_line":"            if image_volume.status !\u003d \u0027available\u0027:"},{"line_number":970,"context_line":"                raise exception.CinderException(_(\u0027Volume is not available.\u0027))"},{"line_number":971,"context_line":""},{"line_number":972,"context_line":"            self.db.volume_admin_metadata_update(ctx.elevated(),"},{"line_number":973,"context_line":"                                                 image_volume.id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_4fed668d","line":970,"updated":"2015-08-09 02:22:11.000000000","message":"Should be InvalidVolume exception","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"660553196a5b68ecbd9330b01e67dd907dee58b1","unresolved":false,"context_lines":[{"line_number":967,"context_line":"                               allow_reschedule\u003dFalse)"},{"line_number":968,"context_line":"            image_volume \u003d self.db.volume_get(ctx, image_volume.id)"},{"line_number":969,"context_line":"            if image_volume.status !\u003d \u0027available\u0027:"},{"line_number":970,"context_line":"                raise exception.CinderException(_(\u0027Volume is not available.\u0027))"},{"line_number":971,"context_line":""},{"line_number":972,"context_line":"            self.db.volume_admin_metadata_update(ctx.elevated(),"},{"line_number":973,"context_line":"                                                 image_volume.id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a68e63ce","line":970,"in_reply_to":"1a4dcd0f_4fed668d","updated":"2015-08-10 18:41:29.000000000","message":"Done","commit_id":"331c3ad49875e8545d8ad96b5ebf22e3c2fead02"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6f8401bafbe2808c63f8ea60aa6297cad0409be9","unresolved":false,"context_lines":[{"line_number":963,"context_line":""},{"line_number":964,"context_line":"        try:"},{"line_number":965,"context_line":"            self.create_volume(ctx, image_volume.id,"},{"line_number":966,"context_line":"                               {\u0027source_volid\u0027: volume.id},"},{"line_number":967,"context_line":"                               allow_reschedule\u003dFalse)"},{"line_number":968,"context_line":"            image_volume \u003d self.db.volume_get(ctx, image_volume.id)"},{"line_number":969,"context_line":"            if image_volume.status !\u003d \u0027available\u0027:"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a4dcd0f_18ec9491","line":966,"range":{"start_line":966,"start_character":0,"end_line":966,"end_character":31},"updated":"2015-08-13 20:25:27.000000000","message":"From the looks of the current create_volume flow this won\u0027t actually do anything, we need to set the source_volid property on the volume db object up above here to make it work like we are expecting.","commit_id":"9d5d734e8b443fc2c06742c008fe83cce9783ffa"}]}
