)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15524,"name":"dane-fichter","email":"dane.fichter@jhuapl.edu","username":"dane-fichter"},"change_message_id":"b0f9ba0cfa93b093ba13094ad5c6aa0c48a987f3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     lisali \u003cxiaoyan.li@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-08-25 07:11:04 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Data transformation betweeen encrypted volumes and images"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_45ad4d87","line":7,"updated":"2015-08-26 18:43:38.000000000","message":"Should describe what the patch is doing, e.g. \u0027Fix transfer of data between images and encrypted volumes\u0027","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"006f25e4545fbccf7fd607982c89774482a6963b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     lisali \u003cxiaoyan.li@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-08-25 07:11:04 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Data transformation betweeen encrypted volumes and images"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_33a41556","line":7,"in_reply_to":"da20952f_45ad4d87","updated":"2015-08-27 07:41:13.000000000","message":"Done","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15524,"name":"dane-fichter","email":"dane.fichter@jhuapl.edu","username":"dane-fichter"},"change_message_id":"b0f9ba0cfa93b093ba13094ad5c6aa0c48a987f3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"},{"line_number":11,"context_line":"the encrypted data to image. As a result, Nova can\u0027t use such volumes or"},{"line_number":12,"context_line":"images."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch is to implement two functions:"},{"line_number":15,"context_line":"1. When creating an encrypted volume from an image, it encryptes the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_a5f54984","line":12,"updated":"2015-08-26 18:43:38.000000000","message":"There are some grammar/clarity issues here. I\u0027d say something like:\n\nCurrently, when creating an encrypted volume from an image, Cinder writes raw data to the encrypted volume. When Cinder uploads an encrypted volume to an image, it writes encrypted data to the image. As a result, Nova cannot use these images or volumes.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"006f25e4545fbccf7fd607982c89774482a6963b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"},{"line_number":11,"context_line":"the encrypted data to image. As a result, Nova can\u0027t use such volumes or"},{"line_number":12,"context_line":"images."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch is to implement two functions:"},{"line_number":15,"context_line":"1. When creating an encrypted volume from an image, it encryptes the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_13b6b18a","line":12,"in_reply_to":"da20952f_a5f54984","updated":"2015-08-27 07:41:13.000000000","message":"Done","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15524,"name":"dane-fichter","email":"dane.fichter@jhuapl.edu","username":"dane-fichter"},"change_message_id":"b0f9ba0cfa93b093ba13094ad5c6aa0c48a987f3","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch is to implement two functions:"},{"line_number":15,"context_line":"1. When creating an encrypted volume from an image, it encryptes the"},{"line_number":16,"context_line":"data and writes to the volume."},{"line_number":17,"context_line":"2. When uploading encrypted volume to images, it de-encryptes the data"},{"line_number":18,"context_line":"and uploads to images."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_654651c1","line":16,"updated":"2015-08-26 18:43:38.000000000","message":"encryptes \u003d\u003e encrypts","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"006f25e4545fbccf7fd607982c89774482a6963b","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch is to implement two functions:"},{"line_number":15,"context_line":"1. When creating an encrypted volume from an image, it encryptes the"},{"line_number":16,"context_line":"data and writes to the volume."},{"line_number":17,"context_line":"2. When uploading encrypted volume to images, it de-encryptes the data"},{"line_number":18,"context_line":"and uploads to images."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_d3b0398e","line":16,"in_reply_to":"da20952f_654651c1","updated":"2015-08-27 07:41:13.000000000","message":"Done","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15524,"name":"dane-fichter","email":"dane.fichter@jhuapl.edu","username":"dane-fichter"},"change_message_id":"b0f9ba0cfa93b093ba13094ad5c6aa0c48a987f3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"1. When creating an encrypted volume from an image, it encryptes the"},{"line_number":16,"context_line":"data and writes to the volume."},{"line_number":17,"context_line":"2. When uploading encrypted volume to images, it de-encryptes the data"},{"line_number":18,"context_line":"and uploads to images."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I213459193550198c570615e381797db5e08e2cce"},{"line_number":21,"context_line":"Implements: bp encrypt-volume-with-image"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_057995fc","line":18,"updated":"2015-08-26 18:43:38.000000000","message":"de-encryptes \u003d\u003e decrypts","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"006f25e4545fbccf7fd607982c89774482a6963b","unresolved":false,"context_lines":[{"line_number":15,"context_line":"1. When creating an encrypted volume from an image, it encryptes the"},{"line_number":16,"context_line":"data and writes to the volume."},{"line_number":17,"context_line":"2. When uploading encrypted volume to images, it de-encryptes the data"},{"line_number":18,"context_line":"and uploads to images."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I213459193550198c570615e381797db5e08e2cce"},{"line_number":21,"context_line":"Implements: bp encrypt-volume-with-image"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da20952f_93aac118","line":18,"in_reply_to":"da20952f_057995fc","updated":"2015-08-27 07:41:13.000000000","message":"Done","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"a62d2639262af04dc6401dcc65f17f8deb922cbf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     lisali \u003cxiaoyan.li@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-08-27 06:24:45 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Data transformation betweeen encrypted volumes and images"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_dbb6073d","line":7,"updated":"2015-08-27 06:39:21.000000000","message":"The first line should be limited to 50 characters","commit_id":"75805537a29e6ec066388ca879cec7bf27f7af58"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"60ffbec96aab0a3814546112f77365e5afc9246b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     lisali \u003cxiaoyan.li@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-08-27 06:24:45 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Data transformation betweeen encrypted volumes and images"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_a9942937","line":7,"in_reply_to":"da20952f_dbb6073d","updated":"2015-08-27 07:42:20.000000000","message":"Done.\nIt is difficult.","commit_id":"75805537a29e6ec066388ca879cec7bf27f7af58"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"a62d2639262af04dc6401dcc65f17f8deb922cbf","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"},{"line_number":11,"context_line":"the encrypted data to image. As a result, Nova can\u0027t use such volumes or"},{"line_number":12,"context_line":"images."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch is to implement two functions:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_7b37bbb0","line":11,"updated":"2015-08-27 06:39:21.000000000","message":"Subsequent lines should be wrapped at 72 characters.","commit_id":"75805537a29e6ec066388ca879cec7bf27f7af58"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"60ffbec96aab0a3814546112f77365e5afc9246b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently when creating an encrypted volume with image, it writes raw data"},{"line_number":10,"context_line":"to encrypted volume; and uploading an encrypted volume to image, it writes"},{"line_number":11,"context_line":"the encrypted data to image. As a result, Nova can\u0027t use such volumes or"},{"line_number":12,"context_line":"images."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch is to implement two functions:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_4999cd6d","line":11,"in_reply_to":"da20952f_7b37bbb0","updated":"2015-08-27 07:42:20.000000000","message":"Done. Thank you. Will keep it in mind.","commit_id":"75805537a29e6ec066388ca879cec7bf27f7af58"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"573eb2a2798e32bf91f72b36c1cc66b3377fa5a9","unresolved":false,"context_lines":[{"line_number":17,"context_line":"2. When uploading encrypted volume to images, it decrypts the data"},{"line_number":18,"context_line":"and uploads to images."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Depends-On: I1669a58cbdf2f7bee390888301c468cbe930b11d"},{"line_number":21,"context_line":"Change-Id: I213459193550198c570615e381797db5e08e2cce"},{"line_number":22,"context_line":"Partial-implements: bp encrypt-volume-with-image"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"da20952f_e4f9e84e","line":20,"updated":"2015-08-27 08:09:44.000000000","message":"no need of Depends-On, if you put this patch on top of that depend on one on same branch, gerrit will handle the dependency.","commit_id":"9a510210c1d29a95fadf5d7866edf8f6891d13db"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"b038710cf00eb310e383963886055b5ab500d560","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Change-Id: I213459193550198c570615e381797db5e08e2cce"},{"line_number":21,"context_line":"Implements: blueprint improve-encrypted-volume"},{"line_number":22,"context_line":"Closes-bug: #1482464"},{"line_number":23,"context_line":"Closes-bug: #1465656"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"fa7ab95a_3f07f282","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":20},"updated":"2016-08-30 12:55:00.000000000","message":"This one is marked as duplicate of the bug above. It\u0027s not a big deal - just noting.","commit_id":"70b05dbe7ff9c33f981f2cca5687c228c2411894"}],"cinder/exception.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":993,"context_line":""},{"line_number":994,"context_line":"class VolumeEncryptionNotSupported(Invalid):"},{"line_number":995,"context_line":"    message \u003d _(\"Volume encryption is not supported for %(volume_type)s \""},{"line_number":996,"context_line":"                \"volume %(volume_id)s\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_c00beed3","line":996,"updated":"2015-08-26 06:05:25.000000000","message":"will this be better ? \"volume, volume id: %(volume_id)s.\"","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"}],"cinder/tests/unit/test_volume.py":[{"author":{"_account_id":15524,"name":"dane-fichter","email":"dane.fichter@jhuapl.edu","username":"dane-fichter"},"change_message_id":"8e61a685122bfcb5bc5a969b17cb00a18e51ed7b","unresolved":false,"context_lines":[{"line_number":5577,"context_line":""},{"line_number":5578,"context_line":"        with mock.patch.object(self.volume.driver,"},{"line_number":5579,"context_line":"                               \u0027copy_encrypted_volume_to_image\u0027) as \\"},{"line_number":5580,"context_line":"                mock_copy_encrypted_volume:"},{"line_number":5581,"context_line":"            self.volume.copy_volume_to_image(self.context,"},{"line_number":5582,"context_line":"                                             self.volume_id,"},{"line_number":5583,"context_line":"                                             self.image_meta)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_98739fb1","line":5580,"updated":"2015-08-27 13:49:06.000000000","message":"Perhaps it\u0027d be better to mock this before the function declaration, so you can avoid the \\ line continuation, which seems to be frowned upon in OpenStack for some reason.","commit_id":"53d03d665e249d48e75c83f5b16dbe39ada180bb"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"a48ed19b10911e36d8d0f516bb847fedfe57c16b","unresolved":false,"context_lines":[{"line_number":5577,"context_line":""},{"line_number":5578,"context_line":"        with mock.patch.object(self.volume.driver,"},{"line_number":5579,"context_line":"                               \u0027copy_encrypted_volume_to_image\u0027) as \\"},{"line_number":5580,"context_line":"                mock_copy_encrypted_volume:"},{"line_number":5581,"context_line":"            self.volume.copy_volume_to_image(self.context,"},{"line_number":5582,"context_line":"                                             self.volume_id,"},{"line_number":5583,"context_line":"                                             self.image_meta)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_fd7944fd","line":5580,"in_reply_to":"da20952f_98739fb1","updated":"2015-08-28 05:34:08.000000000","message":"Dane, I try to put it with @mock before the function, it fails. As self.volume.driver is not a specific class.\nMeanwhile, I failed to use parentheses to avoid \u0027\\\u0027.","commit_id":"53d03d665e249d48e75c83f5b16dbe39ada180bb"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"79ab856f118e58ddbf4d933a280b518620c884fc","unresolved":false,"context_lines":[{"line_number":5575,"context_line":"        volume \u003d db.volume_get(self.context, self.volume_id)"},{"line_number":5576,"context_line":"        mock_volume_get.return_value \u003d volume"},{"line_number":5577,"context_line":"        with mock.patch.object(self.volume.driver,"},{"line_number":5578,"context_line":"                               \u0027copy_encrypted_volume_to_image\u0027) as \\"},{"line_number":5579,"context_line":"                mock_copy_encrypted_volume:"},{"line_number":5580,"context_line":"            self.volume.copy_volume_to_image(self.context,"},{"line_number":5581,"context_line":"                                             self.volume_id,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_fdee248a","line":5578,"updated":"2015-08-28 05:36:12.000000000","message":"Any suggestions to avoid \u0027\\\u0027 here?\nIt failed to put it before the function. And failed to use parentheses.","commit_id":"1117517eb969ff24eb004389986ce42eb4a654f6"},{"author":{"_account_id":15524,"name":"dane-fichter","email":"dane.fichter@jhuapl.edu","username":"dane-fichter"},"change_message_id":"f54925d8aaa86cab7cec4da96abb8b15f1b0191c","unresolved":false,"context_lines":[{"line_number":5575,"context_line":"        volume \u003d db.volume_get(self.context, self.volume_id)"},{"line_number":5576,"context_line":"        mock_volume_get.return_value \u003d volume"},{"line_number":5577,"context_line":"        with mock.patch.object(self.volume.driver,"},{"line_number":5578,"context_line":"                               \u0027copy_encrypted_volume_to_image\u0027) as \\"},{"line_number":5579,"context_line":"                mock_copy_encrypted_volume:"},{"line_number":5580,"context_line":"            self.volume.copy_volume_to_image(self.context,"},{"line_number":5581,"context_line":"                                             self.volume_id,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_80c8c623","line":5578,"in_reply_to":"da20952f_fdee248a","updated":"2015-08-28 14:19:09.000000000","message":"Done","commit_id":"1117517eb969ff24eb004389986ce42eb4a654f6"}],"cinder/tests/unit/volume/flows/test_create_volume_flow.py":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"3804c1f574662ee7de36ecd9a1720b8d3f894750","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        volume_attrs \u003d {\u0027encryption_key_id\u0027: \u00271\u0027, }"},{"line_number":405,"context_line":"        volume \u003d fake_volume.fake_db_volume(**volume_attrs)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        self.assertEqual(volume[\u0027encryption_key_id\u0027], \u00271\u0027)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        fake_image_service \u003d fake_image.FakeImageService()"},{"line_number":410,"context_line":"        image_id \u003d 1"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a26ad4f_ebe3a331","line":407,"updated":"2015-10-30 13:26:49.000000000","message":"The expected arg must be the first arg:\nself.assertEqual( \u00271\u0027,volume[\u0027encryption_key_id\u0027])","commit_id":"038dd68dbf084b2a2f939b41775dbff8a74e30eb"}],"cinder/volume/driver.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        finally:"},{"line_number":628,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":631,"context_line":"                                       image_service, image_id):"},{"line_number":632,"context_line":"        \"\"\"Fetch the image and write it to the encrypted volume.\"\"\""},{"line_number":633,"context_line":"        LOG.debug(\u0027copy_image_to_encrypted_volume %s.\u0027, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_c008ce82","line":630,"updated":"2015-08-26 06:05:25.000000000","message":"this method is similar with copy_image_to_volume, maybe we can passing a parameter \u0027encrypted\u003dTrue/False\u0027 to copy_image_to_volume and modify copy_image_to_volume to support this parameter.\n\nanyway, this is not my concern. both are okay.\n\n\n------------------\nafter reviewing create_volume.py \n\nwe can just check volume.get(\u0027encryption_key_id\u0027) to check if this volume is an encryptied volume, so no extra parameter need for copy_image_to_encrypted_volume at all.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"9941ca37d9c0f830c3a5f8c5313c8f9266388f82","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        finally:"},{"line_number":628,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":631,"context_line":"                                       image_service, image_id):"},{"line_number":632,"context_line":"        \"\"\"Fetch the image and write it to the encrypted volume.\"\"\""},{"line_number":633,"context_line":"        LOG.debug(\u0027copy_image_to_encrypted_volume %s.\u0027, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_f309bd32","line":630,"in_reply_to":"fa1b9901_61dea16e","updated":"2015-08-27 02:43:02.000000000","message":"get it, agreed. I don\u0027t have that view, so sorry for wrong direction.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        finally:"},{"line_number":628,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":631,"context_line":"                                       image_service, image_id):"},{"line_number":632,"context_line":"        \"\"\"Fetch the image and write it to the encrypted volume.\"\"\""},{"line_number":633,"context_line":"        LOG.debug(\u0027copy_image_to_encrypted_volume %s.\u0027, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_61dea16e","line":630,"in_reply_to":"fa1b9901_c008ce82","updated":"2015-08-26 08:41:13.000000000","message":"I added the new function to prevent mis-usage of copy_image_to_volume. Currently lots of drivers completes copy_image_to_volume, we have to update one by one.\nSecondly, it is better to extend. For example, if we need to copy encrypted image to encrypted volume.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":638,"context_line":"                                                          enforce_multipath)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":641,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":642,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":643,"context_line":"        try:"},{"line_number":644,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_00dec610","line":641,"updated":"2015-08-26 06:05:25.000000000","message":"here I think checking if local_path valid first , it would be better to pass a bad patch (maybe None or even raise a attrError) to _attach_volume_encryptor and raise exception then doing _detach_volume.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":638,"context_line":"                                                          enforce_multipath)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":641,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":642,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":643,"context_line":"        try:"},{"line_number":644,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_a13d998f","line":641,"in_reply_to":"fa1b9901_00dec610","updated":"2015-08-26 08:41:13.000000000","message":"I think it is the responsibility of function _attach_volume.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":644,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"},{"line_number":645,"context_line":"                                                       connection_info)"},{"line_number":646,"context_line":"        except Exception:"},{"line_number":647,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":648,"context_line":"            raise"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_80d2d6fe","line":647,"updated":"2015-08-26 06:05:25.000000000","message":"hmmm. I think it should be _detach_volume_encryptor ?","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":644,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"},{"line_number":645,"context_line":"                                                       connection_info)"},{"line_number":646,"context_line":"        except Exception:"},{"line_number":647,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":648,"context_line":"            raise"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_61730181","line":647,"in_reply_to":"fa1b9901_80d2d6fe","updated":"2015-08-26 08:41:13.000000000","message":"As _attach_volume_encryptor fails, I think only need to _detach_volume.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"},{"line_number":695,"context_line":"                                                       connection_info)"},{"line_number":696,"context_line":"        except Exception:"},{"line_number":697,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":698,"context_line":"            raise"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_601a22c8","line":697,"updated":"2015-08-26 06:05:25.000000000","message":"should be detach_volume_encryptor ?","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"},{"line_number":695,"context_line":"                                                       connection_info)"},{"line_number":696,"context_line":"        except Exception:"},{"line_number":697,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":698,"context_line":"            raise"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_010b25d7","line":697,"in_reply_to":"fa1b9901_601a22c8","updated":"2015-08-26 08:41:13.000000000","message":"Same as above.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"759b403fe666f1968489f6f369131401123a5b3c","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        properties \u003d utils.brick_get_connector_properties(use_multipath,"},{"line_number":666,"context_line":"                                                          enforce_multipath)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":669,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":670,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":671,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_eb04f04a","line":668,"updated":"2015-08-28 21:26:26.000000000","message":"The following code is essentially identical to that in lvm.py. It would be preferable to add a helper method to eliminate the duplication. (lvm.py can call the helper method directly without the above setup.)","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d930d38f97087dbf11a097505fac14a6dfc13f72","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        properties \u003d utils.brick_get_connector_properties(use_multipath,"},{"line_number":666,"context_line":"                                                          enforce_multipath)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":669,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":670,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":671,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_a62ef440","line":668,"in_reply_to":"da20952f_eb04f04a","updated":"2015-09-06 03:57:21.000000000","message":"Use nested \"try... finally\".","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"759b403fe666f1968489f6f369131401123a5b3c","unresolved":false,"context_lines":[{"line_number":673,"context_line":"                                                       connection_info)"},{"line_number":674,"context_line":"        except Exception:"},{"line_number":675,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":676,"context_line":"            raise"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        try:"},{"line_number":679,"context_line":"            image_utils.fetch_to_raw(context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_ab0118b1","line":676,"updated":"2015-08-28 21:26:26.000000000","message":"Should be finally block -- i.e.,\n\n  try:\n    local_path \u003d ...\n  finally:\n    self._detach_volume(context, attach_info, volume, properties)\n\nThe exception will propagate after the volume is detached.","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d930d38f97087dbf11a097505fac14a6dfc13f72","unresolved":false,"context_lines":[{"line_number":673,"context_line":"                                                       connection_info)"},{"line_number":674,"context_line":"        except Exception:"},{"line_number":675,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":676,"context_line":"            raise"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        try:"},{"line_number":679,"context_line":"            image_utils.fetch_to_raw(context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_c631a8a3","line":676,"in_reply_to":"da20952f_ab0118b1","updated":"2015-09-06 03:57:21.000000000","message":"Use nested \"try... finally\"","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"759b403fe666f1968489f6f369131401123a5b3c","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        finally:"},{"line_number":686,"context_line":"            self._detach_volume_encryptor(context, volume,"},{"line_number":687,"context_line":"                                          connection_info)"},{"line_number":688,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def copy_volume_to_image(self, context, volume, image_service, image_meta):"},{"line_number":691,"context_line":"        \"\"\"Copy the volume to the specified image.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_8ba8d48e","line":688,"updated":"2015-08-28 21:26:26.000000000","message":"Oh, I see what you\u0027re doing. Handling the exception above means that the volume is *not* detached unless there is an exception.\n\nNested try...finally blocks would be easier to follow and less likely for someone to screw up later. :-)","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d930d38f97087dbf11a097505fac14a6dfc13f72","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        finally:"},{"line_number":686,"context_line":"            self._detach_volume_encryptor(context, volume,"},{"line_number":687,"context_line":"                                          connection_info)"},{"line_number":688,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def copy_volume_to_image(self, context, volume, image_service, image_meta):"},{"line_number":691,"context_line":"        \"\"\"Copy the volume to the specified image.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_2623c457","line":688,"in_reply_to":"da20952f_8ba8d48e","updated":"2015-09-06 03:57:21.000000000","message":"Done","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"759b403fe666f1968489f6f369131401123a5b3c","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        properties \u003d utils.brick_get_connector_properties(use_multipath,"},{"line_number":716,"context_line":"                                                          enforce_multipath)"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":719,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":720,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":721,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_abfa7841","line":718,"updated":"2015-08-28 21:26:26.000000000","message":"Ditto. The following code is essentially duplicated in lvm.py","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d930d38f97087dbf11a097505fac14a6dfc13f72","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        properties \u003d utils.brick_get_connector_properties(use_multipath,"},{"line_number":716,"context_line":"                                                          enforce_multipath)"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":719,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":720,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":721,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_461ef80c","line":718,"in_reply_to":"da20952f_abfa7841","updated":"2015-09-06 03:57:21.000000000","message":"Use nested \"try... finally\"","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"759b403fe666f1968489f6f369131401123a5b3c","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        finally:"},{"line_number":734,"context_line":"            self._detach_volume_encryptor(context, volume,"},{"line_number":735,"context_line":"                                          connection_info)"},{"line_number":736,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"    def get_filter_function(self):"},{"line_number":739,"context_line":"        \"\"\"Get filter_function string."}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_0b54c450","line":736,"updated":"2015-08-28 21:26:26.000000000","message":"See note above regarding nested try...finally blocks.","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d930d38f97087dbf11a097505fac14a6dfc13f72","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        finally:"},{"line_number":734,"context_line":"            self._detach_volume_encryptor(context, volume,"},{"line_number":735,"context_line":"                                          connection_info)"},{"line_number":736,"context_line":"            self._detach_volume(context, attach_info, volume, properties)"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"    def get_filter_function(self):"},{"line_number":739,"context_line":"        \"\"\"Get filter_function string."}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_e6186c20","line":736,"in_reply_to":"da20952f_0b54c450","updated":"2015-09-06 03:57:21.000000000","message":"Use nested \"try... finally\".","commit_id":"05db9a945348d5a4a6a3dda7412371e79db02f25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":848,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":849,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":850,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":851,"context_line":"        try:"},{"line_number":852,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"},{"line_number":853,"context_line":"                                                       connection_info)"},{"line_number":854,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_bb045d7e","line":851,"updated":"2015-09-14 22:32:38.000000000","message":"The preceding two lines should appear in the try block. A KeyError would prevent the finally block from executing.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0131874ec6e6c2352aec357dbe2c2d8ac92e347b","unresolved":false,"context_lines":[{"line_number":848,"context_line":"        attach_info, volume \u003d self._attach_volume(context, volume, properties)"},{"line_number":849,"context_line":"        local_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":850,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"},{"line_number":851,"context_line":"        try:"},{"line_number":852,"context_line":"            local_path \u003d self._attach_volume_encryptor(context, volume,"},{"line_number":853,"context_line":"                                                       connection_info)"},{"line_number":854,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_9559c137","line":851,"in_reply_to":"ba15a1d1_bb045d7e","updated":"2015-09-23 15:49:42.000000000","message":"Done","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def copy_encrypted_volume_to_image(self, context, volume,"},{"line_number":885,"context_line":"                                       image_service, image_meta):"},{"line_number":886,"context_line":"        \"\"\"Copy the encrypted volume to the specified image.\"\"\""},{"line_number":887,"context_line":"        LOG.debug(\u0027copy_encrypted_volume_to_image %s.\u0027, volume[\u0027id\u0027])"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        use_multipath \u003d self.configuration.use_multipath_for_image_xfer"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_9b9e3955","line":886,"updated":"2015-09-14 22:32:38.000000000","message":"This function is problematic: it decrypts a volume and transfers the (plaintext) data to an image, and thus compromises the confidentiality of the data.\n\nThere may be use cases where such functionality is useful, but I suggest that either 1) a spec be written for the Mitaka development cycle that outlines such use cases and promote discussion of the security implications or 2) support for copying a volume to an image be eliminated.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"cca025750e76caf633a01419c36ffa55deee3010","unresolved":false,"context_lines":[{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def copy_encrypted_volume_to_image(self, context, volume,"},{"line_number":885,"context_line":"                                       image_service, image_meta):"},{"line_number":886,"context_line":"        \"\"\"Copy the encrypted volume to the specified image.\"\"\""},{"line_number":887,"context_line":"        LOG.debug(\u0027copy_encrypted_volume_to_image %s.\u0027, volume[\u0027id\u0027])"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        use_multipath \u003d self.configuration.use_multipath_for_image_xfer"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_bc309702","line":886,"in_reply_to":"ba15a1d1_5a6cb834","updated":"2015-09-28 16:48:03.000000000","message":"I\u0027m okay with that approach. My primary concern is that users won\u0027t know the security implications of this operation unless it\u0027s discussed in more detail.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"84e4f94d181f42317bfd06b579b62149d35a545c","unresolved":false,"context_lines":[{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def copy_encrypted_volume_to_image(self, context, volume,"},{"line_number":885,"context_line":"                                       image_service, image_meta):"},{"line_number":886,"context_line":"        \"\"\"Copy the encrypted volume to the specified image.\"\"\""},{"line_number":887,"context_line":"        LOG.debug(\u0027copy_encrypted_volume_to_image %s.\u0027, volume[\u0027id\u0027])"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        use_multipath \u003d self.configuration.use_multipath_for_image_xfer"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_5a6cb834","line":886,"in_reply_to":"ba15a1d1_9b9e3955","updated":"2015-09-23 14:33:59.000000000","message":"OK, I will prevent this function in Liberty and later discuss it in Mitaka. How do you think?","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":10439,"name":"Xi Yang","email":"yang.xi@99cloud.net","username":"phenom"},"change_message_id":"314de6a323f1d6fa31352975277fefe42d605f05","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                volume_type\u003dvolume[\u0027volume_type_id\u0027])"},{"line_number":851,"context_line":"        device_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        try:"},{"line_number":854,"context_line":"            local_path \u003d self._attach_volume_encryptor(context,"},{"line_number":855,"context_line":"                                                       volume,"},{"line_number":856,"context_line":"                                                       device_path)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a29b11f_b2da53e8","line":853,"updated":"2015-10-25 16:03:00.000000000","message":"Could we log the exception msgs in these two try blocks? It will be easy to triage when error happens.","commit_id":"4580e107692150fb03cae893a6d21acc4577dec3"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"94e07b6d82fc8c04ee2a5f1a23b34820677109e6","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                volume_type\u003dvolume[\u0027volume_type_id\u0027])"},{"line_number":851,"context_line":"        device_path \u003d attach_info[\u0027device\u0027][\u0027path\u0027]"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        try:"},{"line_number":854,"context_line":"            local_path \u003d self._attach_volume_encryptor(context,"},{"line_number":855,"context_line":"                                                       volume,"},{"line_number":856,"context_line":"                                                       device_path)"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a26ad4f_281d33bd","line":853,"in_reply_to":"3a29b11f_b2da53e8","updated":"2015-10-30 02:51:32.000000000","message":"Hi Xi, \nIf there are exceptions, they will be recorded and raised. I don\u0027t think it needs to log again. \nLike line 880 in this file.","commit_id":"4580e107692150fb03cae893a6d21acc4577dec3"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"947f8c59d35c31c9d2ef9f7768537da4147605e8","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        self._stats \u003d data"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"    def copy_image_to_volume_full(self, context, volume,"},{"line_number":755,"context_line":"                                  image_service, image_id):"},{"line_number":756,"context_line":"        \"\"\"Fetch the image and write it to unencrypted/encrypted volume.\"\"\""},{"line_number":757,"context_line":"        if volume.encryption_key_id:"},{"line_number":758,"context_line":"            self.copy_image_to_encrypted_volume(context,"}],"source_content_type":"text/x-python","patch_set":27,"id":"7aa08908_f01deebe","line":755,"updated":"2016-06-13 20:48:43.000000000","message":"Wouldn\u0027t it be less disruptive to add a parameter to copy_image_to_volume rather than changing the driver API to have this method as the primary method for this operation?\n\nWhy does this change justify a new method for all drivers?\n\nI think this is the wrong thing to do, but it needs to be documented in the commit message if there is a good reason to do it.","commit_id":"51d66a141a7f67e131c6e79d7bbcf2fe8d49d5bc"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"1a70a740d5085fc97cc7c980b7aa81704c4b2ba7","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        self._stats \u003d data"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"    def copy_image_to_volume_full(self, context, volume,"},{"line_number":755,"context_line":"                                  image_service, image_id):"},{"line_number":756,"context_line":"        \"\"\"Fetch the image and write it to unencrypted/encrypted volume.\"\"\""},{"line_number":757,"context_line":"        if volume.encryption_key_id:"},{"line_number":758,"context_line":"            self.copy_image_to_encrypted_volume(context,"}],"source_content_type":"text/x-python","patch_set":27,"id":"7aa08908_9797398f","line":755,"in_reply_to":"7aa08908_f01deebe","updated":"2016-06-14 01:44:00.000000000","message":"If currently we just ad da parameter to copy_image_to_volume, it means that we have to update the interfaces and functionalities in all drivers which implements copy_image_to_volume. \n\nAs a result I add this new interface, so that current copy_image_to_volume works well in all drivers, and for copy_image_to_encrypted volume it uses the default implementations.","commit_id":"51d66a141a7f67e131c6e79d7bbcf2fe8d49d5bc"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a8cfbd895e98a0100bfb6965ed6eac3052ddd198","unresolved":false,"context_lines":[{"line_number":762,"context_line":"            data[\"pools\"].append(single_pool)"},{"line_number":763,"context_line":"        self._stats \u003d data"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"    def copy_image_to_volume_full(self, context, volume,"},{"line_number":766,"context_line":"                                  image_service, image_id):"},{"line_number":767,"context_line":"        \"\"\"Fetch the image and write it to unencrypted/encrypted volume.\"\"\""},{"line_number":768,"context_line":"        if volume.encryption_key_id:"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_18d9ea22","line":765,"range":{"start_line":765,"start_character":8,"end_line":765,"end_character":33},"updated":"2016-08-04 15:50:14.000000000","message":"Why change the method name here?","commit_id":"eda8e9d3d9ec2eadf54b4edec766e782e8f8f5a9"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"73677036883fbc50f25050e597279310906f42bb","unresolved":false,"context_lines":[{"line_number":762,"context_line":"            data[\"pools\"].append(single_pool)"},{"line_number":763,"context_line":"        self._stats \u003d data"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"    def copy_image_to_volume_full(self, context, volume,"},{"line_number":766,"context_line":"                                  image_service, image_id):"},{"line_number":767,"context_line":"        \"\"\"Fetch the image and write it to unencrypted/encrypted volume.\"\"\""},{"line_number":768,"context_line":"        if volume.encryption_key_id:"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_5a42213f","line":765,"range":{"start_line":765,"start_character":8,"end_line":765,"end_character":33},"in_reply_to":"bacf61ea_18d9ea22","updated":"2016-08-05 01:30:43.000000000","message":"The function is removed.","commit_id":"eda8e9d3d9ec2eadf54b4edec766e782e8f8f5a9"}],"cinder/volume/drivers/lvm.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        return \"/dev/mapper/%s-%s\" % (escaped_group, escaped_name)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":438,"context_line":"                                       image_service, image_id):"},{"line_number":439,"context_line":"        \"\"\"Fetch the image from image_service and write it to the volume.\"\"\""},{"line_number":440,"context_line":"        local_path \u003d self.local_path(volume)"},{"line_number":441,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_5b0ae127","line":438,"updated":"2015-09-14 22:32:38.000000000","message":"This method essentially duplicates some of the functionality of driver:copy_image_to_encrypted_volume.\n\nI suggest creating a helper method in driver:copy_image_to_encrypted_volume and putting all the shared code there. The LVM driver can then call that method directly.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0131874ec6e6c2352aec357dbe2c2d8ac92e347b","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        return \"/dev/mapper/%s-%s\" % (escaped_group, escaped_name)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":438,"context_line":"                                       image_service, image_id):"},{"line_number":439,"context_line":"        \"\"\"Fetch the image from image_service and write it to the volume.\"\"\""},{"line_number":440,"context_line":"        local_path \u003d self.local_path(volume)"},{"line_number":441,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_0b183474","line":438,"in_reply_to":"ba15a1d1_5b0ae127","updated":"2015-09-23 15:49:42.000000000","message":"Done","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":461,"context_line":"                                 size\u003dvolume[\u0027size\u0027])"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    def copy_encrypted_volume_to_image(self, context, volume,"},{"line_number":464,"context_line":"                                       image_service, image_meta):"},{"line_number":465,"context_line":"        \"\"\"Copy the encrypted volume to the specified image.\"\"\""},{"line_number":466,"context_line":"        local_path \u003d self.local_path(volume)"},{"line_number":467,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_fb589558","line":464,"updated":"2015-09-14 22:32:38.000000000","message":"See comment on cinder/volume/driver.py","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0131874ec6e6c2352aec357dbe2c2d8ac92e347b","unresolved":false,"context_lines":[{"line_number":461,"context_line":"                                 size\u003dvolume[\u0027size\u0027])"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    def copy_encrypted_volume_to_image(self, context, volume,"},{"line_number":464,"context_line":"                                       image_service, image_meta):"},{"line_number":465,"context_line":"        \"\"\"Copy the encrypted volume to the specified image.\"\"\""},{"line_number":466,"context_line":"        local_path \u003d self.local_path(volume)"},{"line_number":467,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: local_path, }, }"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_cb2c7c9b","line":464,"in_reply_to":"ba15a1d1_fb589558","updated":"2015-09-23 15:49:42.000000000","message":"Removed it.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"09d9684ad8a91d8847ac3f49a07cd4a364855c01","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        return \"/dev/mapper/%s-%s\" % (escaped_group, escaped_name)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":439,"context_line":"                                       image_service, image_id):"},{"line_number":440,"context_line":"        \"\"\"Fetch the image from image_service and write it to the volume.\"\"\""},{"line_number":441,"context_line":"        device_path \u003d self.local_path(volume)"},{"line_number":442,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_c5548b22","line":439,"updated":"2015-09-28 20:03:45.000000000","message":"See comment on patch set 13 about creating a new method for code shared between this method and driver:copy_image_to_encrypted volume. I can\u0027t see any reason to duplicate the code.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"98e90aeb5b0afcd27b2f618a0c59e63bb3865179","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        return \"/dev/mapper/%s-%s\" % (escaped_group, escaped_name)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":439,"context_line":"                                       image_service, image_id):"},{"line_number":440,"context_line":"        \"\"\"Fetch the image from image_service and write it to the volume.\"\"\""},{"line_number":441,"context_line":"        device_path \u003d self.local_path(volume)"},{"line_number":442,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a26ad4f_0edaa878","line":439,"in_reply_to":"1a26ad4f_932118a2","updated":"2015-10-30 17:28:14.000000000","message":"Thanks!","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"94592f2210c90dd62984c358b4005990a0552778","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        return \"/dev/mapper/%s-%s\" % (escaped_group, escaped_name)"},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"    def copy_image_to_encrypted_volume(self, context, volume,"},{"line_number":439,"context_line":"                                       image_service, image_id):"},{"line_number":440,"context_line":"        \"\"\"Fetch the image from image_service and write it to the volume.\"\"\""},{"line_number":441,"context_line":"        device_path \u003d self.local_path(volume)"},{"line_number":442,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a26ad4f_932118a2","line":439,"in_reply_to":"9a1a9d01_c5548b22","updated":"2015-10-30 02:51:21.000000000","message":"I create a new method _copy_image_to_encrypted_device to de-duplicate the code.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"}],"cinder/volume/encryptors/__init__.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 The Johns Hopkins University/Applied Physics Laboratory"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_e0d2b2d0","line":1,"updated":"2015-08-26 06:05:25.000000000","message":"is this correct?","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 The Johns Hopkins University/Applied Physics Laboratory"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_211749ef","line":1,"in_reply_to":"fa1b9901_e0d2b2d0","updated":"2015-08-26 08:41:13.000000000","message":"This is from Nova, so I keep it. \nDo you have any suggestions?","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"}],"cinder/volume/encryptors/base.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 The Johns Hopkins University/Applied Physics Laboratory"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_6000e202","line":1,"updated":"2015-08-26 06:05:25.000000000","message":"ditto","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 The Johns Hopkins University/Applied Physics Laboratory"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_01d9e556","line":1,"in_reply_to":"fa1b9901_6000e202","updated":"2015-08-26 08:41:13.000000000","message":"Same as __init__.py.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"}],"cinder/volume/flows/manager/create_volume.py":[{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"58e31eafad6c8466a81abe6380d8bfef44e7cfc5","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        except exception.CinderException as ex:"},{"line_number":449,"context_line":"            LOG.exception(_LE(\"Failed fetching snapshot %(snapshot_id)s \""},{"line_number":450,"context_line":"                              \"bootable\""},{"line_number":451,"context_line":"                              \" flag using the provided glance snapshot \""},{"line_number":452,"context_line":"                              \"%(snapshot_ref_id)s volume reference\"),"},{"line_number":453,"context_line":"                          {\u0027snapshot_id\u0027: snapshot_id,"},{"line_number":454,"context_line":"                           \u0027snapshot_ref_id\u0027: snapshot.volume_id})"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_1d1a8ec6","line":451,"updated":"2015-09-06 07:31:34.000000000","message":"Should have a dot at end of message.","commit_id":"a5de93a1460c0b40d00abe2548953916e6a83443"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"7bf837c276a92625fbf7728a48578af9810910d0","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        except exception.CinderException as ex:"},{"line_number":449,"context_line":"            LOG.exception(_LE(\"Failed fetching snapshot %(snapshot_id)s \""},{"line_number":450,"context_line":"                              \"bootable\""},{"line_number":451,"context_line":"                              \" flag using the provided glance snapshot \""},{"line_number":452,"context_line":"                              \"%(snapshot_ref_id)s volume reference\"),"},{"line_number":453,"context_line":"                          {\u0027snapshot_id\u0027: snapshot_id,"},{"line_number":454,"context_line":"                           \u0027snapshot_ref_id\u0027: snapshot.volume_id})"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_3d575259","line":451,"in_reply_to":"da20952f_1d1a8ec6","updated":"2015-09-06 07:35:58.000000000","message":"Hi Lallana, \nThis is not updated in the patch. If I have next patch, I can update it.","commit_id":"a5de93a1460c0b40d00abe2548953916e6a83443"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                              image_id, image_location, image_service):"},{"line_number":511,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":512,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume"},{"line_number":513,"context_line":"        if volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":514,"context_line":"            copy_image_to_volume \u003d self.driver.copy_image_to_encrypted_volume"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_ed345cdf","line":513,"updated":"2015-09-14 22:32:38.000000000","message":"I think it would be cleaner to embed this check in driver.copy_image_to_volume, which can handled the encrypted vs. unencrypted cases. (This change seems like there\u0027s a leaky abstraction for the driver.)","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"cca025750e76caf633a01419c36ffa55deee3010","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                              image_id, image_location, image_service):"},{"line_number":511,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":512,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume"},{"line_number":513,"context_line":"        if volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":514,"context_line":"            copy_image_to_volume \u003d self.driver.copy_image_to_encrypted_volume"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_273794e4","line":513,"in_reply_to":"ba15a1d1_c63791fd","updated":"2015-09-28 16:48:03.000000000","message":"Okay, I see your point here.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0131874ec6e6c2352aec357dbe2c2d8ac92e347b","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                              image_id, image_location, image_service):"},{"line_number":511,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":512,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume"},{"line_number":513,"context_line":"        if volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":514,"context_line":"            copy_image_to_volume \u003d self.driver.copy_image_to_encrypted_volume"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_c63791fd","line":513,"in_reply_to":"ba15a1d1_ed345cdf","updated":"2015-09-23 15:49:42.000000000","message":"Currently situation is that most of drivers implements copy_image_to_volume by themselves. I have to update them one by one if putting encrypted vs unencrypted together in copy_image_to_volume.  \n\nWith splitting into two functions here, at first encryption is related to cinder volume and it is reasonable. And secondly I implement the default copy_image_to_encrypted_volume, which attaches volume at first with driver.attach_volume and then attach encryptor layer, copy data.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        # Create the volume from an image."},{"line_number":697,"context_line":"        #"},{"line_number":698,"context_line":"        # If the volume is encrypted, can\u0027t create from image cache"},{"line_number":699,"context_line":"        # or cloned from the image directly."},{"line_number":700,"context_line":"        # If the volume is not encrypted:"},{"line_number":701,"context_line":"        # First see if the driver can clone the image directly."},{"line_number":702,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_2d69f4be","line":699,"updated":"2015-09-14 22:32:38.000000000","message":"Out of curiosity, why can\u0027t the image cache be used or clone the image directly?","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0131874ec6e6c2352aec357dbe2c2d8ac92e347b","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        # Create the volume from an image."},{"line_number":697,"context_line":"        #"},{"line_number":698,"context_line":"        # If the volume is encrypted, can\u0027t create from image cache"},{"line_number":699,"context_line":"        # or cloned from the image directly."},{"line_number":700,"context_line":"        # If the volume is not encrypted:"},{"line_number":701,"context_line":"        # First see if the driver can clone the image directly."},{"line_number":702,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_c60b11d5","line":699,"in_reply_to":"ba15a1d1_2d69f4be","updated":"2015-09-23 15:49:42.000000000","message":"such driver.clone_image/create_cloned_volume: copy volume in backend, not though cinder volume node, as a result no encryption/decryption and leads data mess.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"09d9684ad8a91d8847ac3f49a07cd4a364855c01","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                              image_id, image_location, image_service):"},{"line_number":511,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":512,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume"},{"line_number":513,"context_line":"        if volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":514,"context_line":"            copy_image_to_volume \u003d self.driver.copy_image_to_encrypted_volume"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_e5cbcf51","line":513,"updated":"2015-09-28 20:03:45.000000000","message":"Looking at this code again (and reviewing the comments on patch set 13), I still think that this check belongs in copy_image_to_volume.\n\n\"Currently situation is that most of drivers implements copy_image_to_volume by themselves. I have to update them one by one if putting encrypted vs unencrypted together in copy_image_to_volume.\"\n\nThat\u0027s not really any different than adding a copy_image_to_encrypted_volume to each driver. In addition, the next line will fail for drivers that do *not* define this method.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"fc8ef7382834cb47d8b064517519aec47ab31316","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                              image_id, image_location, image_service):"},{"line_number":511,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":512,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume"},{"line_number":513,"context_line":"        if volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":514,"context_line":"            copy_image_to_volume \u003d self.driver.copy_image_to_encrypted_volume"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a2ca52d_97863fb8","line":513,"in_reply_to":"7a2fa921_6f9efc08","updated":"2015-10-14 13:20:20.000000000","message":"Okay","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"c8c742e80b075aeaac8b23d146b71d45468bffd0","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                              image_id, image_location, image_service):"},{"line_number":511,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":512,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume"},{"line_number":513,"context_line":"        if volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":514,"context_line":"            copy_image_to_volume \u003d self.driver.copy_image_to_encrypted_volume"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a2fa921_6f9efc08","line":513,"in_reply_to":"9a1a9d01_e5cbcf51","updated":"2015-10-13 06:32:26.000000000","message":"The method copy_image_to_encrypted_volume is added to BaseVD class, and no need to add into every driver.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"09d9684ad8a91d8847ac3f49a07cd4a364855c01","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        cloned \u003d False"},{"line_number":707,"context_line":"        model_update \u003d None"},{"line_number":708,"context_line":"        should_create_cache_entry \u003d False"},{"line_number":709,"context_line":"        if not volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":710,"context_line":"            model_update, cloned \u003d self.driver.clone_image(context,"},{"line_number":711,"context_line":"                                                           volume_ref,"},{"line_number":712,"context_line":"                                                           image_location,"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_c58fabca","line":709,"updated":"2015-09-28 20:03:45.000000000","message":"I understand this check but not the following lines of code that were *added* (not just indented). Would you please explain them in more detail and why their addition is necessary?","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"98e90aeb5b0afcd27b2f618a0c59e63bb3865179","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        cloned \u003d False"},{"line_number":707,"context_line":"        model_update \u003d None"},{"line_number":708,"context_line":"        should_create_cache_entry \u003d False"},{"line_number":709,"context_line":"        if not volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":710,"context_line":"            model_update, cloned \u003d self.driver.clone_image(context,"},{"line_number":711,"context_line":"                                                           volume_ref,"},{"line_number":712,"context_line":"                                                           image_location,"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a26ad4f_2ef444f0","line":709,"in_reply_to":"1a26ad4f_0808772b","updated":"2015-10-30 17:28:14.000000000","message":"Thanks for the explanation.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"94592f2210c90dd62984c358b4005990a0552778","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        cloned \u003d False"},{"line_number":707,"context_line":"        model_update \u003d None"},{"line_number":708,"context_line":"        should_create_cache_entry \u003d False"},{"line_number":709,"context_line":"        if not volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":710,"context_line":"            model_update, cloned \u003d self.driver.clone_image(context,"},{"line_number":711,"context_line":"                                                           volume_ref,"},{"line_number":712,"context_line":"                                                           image_location,"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a26ad4f_0808772b","line":709,"in_reply_to":"5a2ca52d_77028340","updated":"2015-10-30 02:51:21.000000000","message":"They are related. \nFor example, a normal cinder volume(A) is created from an image. And then create another normal volume(B), with the optimizations the new volume(B) is created from the former volume(A). That means data are copied from former volume(A), and written into new volume(B). \n\nIf creating an encrypted volume(C), with the optimization the data read from volume B, needs to encrypt, and then write to volume C. \n\nAs I don\u0027t want to import the encryption/decryption in creating from volumes. The optimizations are disabled for encrypted volumes.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"fc8ef7382834cb47d8b064517519aec47ab31316","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        cloned \u003d False"},{"line_number":707,"context_line":"        model_update \u003d None"},{"line_number":708,"context_line":"        should_create_cache_entry \u003d False"},{"line_number":709,"context_line":"        if not volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":710,"context_line":"            model_update, cloned \u003d self.driver.clone_image(context,"},{"line_number":711,"context_line":"                                                           volume_ref,"},{"line_number":712,"context_line":"                                                           image_location,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a2ca52d_77028340","line":709,"in_reply_to":"7a2fa921_2f3fa426","updated":"2015-10-14 13:20:20.000000000","message":"If I\u0027m understanding correctly, these optimizations should be part of a separate change because they don\u0027t relate to encrypted images or volumes.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"c8c742e80b075aeaac8b23d146b71d45468bffd0","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        cloned \u003d False"},{"line_number":707,"context_line":"        model_update \u003d None"},{"line_number":708,"context_line":"        should_create_cache_entry \u003d False"},{"line_number":709,"context_line":"        if not volume_ref.get(\u0027encryption_key_id\u0027):"},{"line_number":710,"context_line":"            model_update, cloned \u003d self.driver.clone_image(context,"},{"line_number":711,"context_line":"                                                           volume_ref,"},{"line_number":712,"context_line":"                                                           image_location,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a2fa921_2f3fa426","line":709,"in_reply_to":"9a1a9d01_c58fabca","updated":"2015-10-13 06:32:26.000000000","message":"The following *added* is not new, this part is skipped when a volume is encrypted, and uses default behavior of creating volume from image.\n\nThe following *add* part does the following optimizations:\n\n1. clone_image(): Driver copies image data to volume directly. For example, if image and volumes are in same backend storage.\n\n2. _clone_image_volume(): if allowing direct url which image is a cinder volume, it calls driver.create_cloned_volume() to create a cloned volume.\n\n3. _create_from_image_cache(): it finds out the latest volume which was created from the image, and use this volume to create new volume. \n\nThe methods clone_image() and create_cloned_volume()  are copied data in driver, and don\u0027t differentiate encrypted and unencrypted data. \n\nThis part will be considered whether can be improved later.","commit_id":"6601f4a59200ed638f5800880a981a62ad193607"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a8cfbd895e98a0100bfb6965ed6eac3052ddd198","unresolved":false,"context_lines":[{"line_number":512,"context_line":"    def _copy_image_to_volume(self, context, volume_ref,"},{"line_number":513,"context_line":"                              image_id, image_location, image_service):"},{"line_number":514,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":515,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume_full"},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"},{"line_number":517,"context_line":"        LOG.debug(\"Attempting download of %(image_id)s (%(image_location)s)\""},{"line_number":518,"context_line":"                  \" to volume %(volume_id)s.\","}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_780e268d","line":515,"range":{"start_line":515,"start_character":8,"end_line":515,"end_character":68},"updated":"2016-08-04 15:50:14.000000000","message":"Please don\u0027t do this, I know it was there already but there\u0027s no real value in copying a method into a named variable that I can see here.  All it does is create an unnecessary abstraction.","commit_id":"eda8e9d3d9ec2eadf54b4edec766e782e8f8f5a9"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"73677036883fbc50f25050e597279310906f42bb","unresolved":false,"context_lines":[{"line_number":512,"context_line":"    def _copy_image_to_volume(self, context, volume_ref,"},{"line_number":513,"context_line":"                              image_id, image_location, image_service):"},{"line_number":514,"context_line":"        \"\"\"Downloads Glance image to the specified volume.\"\"\""},{"line_number":515,"context_line":"        copy_image_to_volume \u003d self.driver.copy_image_to_volume_full"},{"line_number":516,"context_line":"        volume_id \u003d volume_ref[\u0027id\u0027]"},{"line_number":517,"context_line":"        LOG.debug(\"Attempting download of %(image_id)s (%(image_location)s)\""},{"line_number":518,"context_line":"                  \" to volume %(volume_id)s.\","}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_5a6981bd","line":515,"range":{"start_line":515,"start_character":8,"end_line":515,"end_character":68},"in_reply_to":"bacf61ea_780e268d","updated":"2016-08-05 01:30:43.000000000","message":"I agree, and removed it.","commit_id":"eda8e9d3d9ec2eadf54b4edec766e782e8f8f5a9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a8cfbd895e98a0100bfb6965ed6eac3052ddd198","unresolved":false,"context_lines":[{"line_number":519,"context_line":"                  {\u0027image_id\u0027: image_id, \u0027volume_id\u0027: volume_id,"},{"line_number":520,"context_line":"                   \u0027image_location\u0027: image_location})"},{"line_number":521,"context_line":"        try:"},{"line_number":522,"context_line":"            copy_image_to_volume(context, volume_ref, image_service, image_id)"},{"line_number":523,"context_line":"        except processutils.ProcessExecutionError as ex:"},{"line_number":524,"context_line":"            LOG.exception(_LE(\"Failed to copy image %(image_id)s to volume: \""},{"line_number":525,"context_line":"                              \"%(volume_id)s\"),"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_d8559250","line":522,"range":{"start_line":522,"start_character":11,"end_line":522,"end_character":78},"updated":"2016-08-04 15:50:14.000000000","message":"I see no reason why this shouldn\u0027t just be \"self.driver.copy_image_to_volume\" (after you switch it back from _full that is :) )","commit_id":"eda8e9d3d9ec2eadf54b4edec766e782e8f8f5a9"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"73677036883fbc50f25050e597279310906f42bb","unresolved":false,"context_lines":[{"line_number":519,"context_line":"                  {\u0027image_id\u0027: image_id, \u0027volume_id\u0027: volume_id,"},{"line_number":520,"context_line":"                   \u0027image_location\u0027: image_location})"},{"line_number":521,"context_line":"        try:"},{"line_number":522,"context_line":"            copy_image_to_volume(context, volume_ref, image_service, image_id)"},{"line_number":523,"context_line":"        except processutils.ProcessExecutionError as ex:"},{"line_number":524,"context_line":"            LOG.exception(_LE(\"Failed to copy image %(image_id)s to volume: \""},{"line_number":525,"context_line":"                              \"%(volume_id)s\"),"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_3a664ded","line":522,"range":{"start_line":522,"start_character":11,"end_line":522,"end_character":78},"in_reply_to":"bacf61ea_d8559250","updated":"2016-08-05 01:30:43.000000000","message":"Done","commit_id":"eda8e9d3d9ec2eadf54b4edec766e782e8f8f5a9"}],"cinder/volume/manager.py":[{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"a5c6f5a5518eae63f5c0716b99481bf8e5297615","unresolved":false,"context_lines":[{"line_number":960,"context_line":"            image_service, image_id \u003d \\"},{"line_number":961,"context_line":"                glance.get_remote_image_service(context, image_meta[\u0027id\u0027])"},{"line_number":962,"context_line":""},{"line_number":963,"context_line":"            if volume[\u0027encryption_key_id\u0027]:"},{"line_number":964,"context_line":"                self.driver.copy_encrypted_volume_to_image(context, volume,"},{"line_number":965,"context_line":"                                                           image_service,"},{"line_number":966,"context_line":"                                                           image_meta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_dba6830e","line":963,"updated":"2015-08-26 06:05:25.000000000","message":"I would prefer using if volume.get(\u0027encryption_key_id\u0027):","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"9941ca37d9c0f830c3a5f8c5313c8f9266388f82","unresolved":false,"context_lines":[{"line_number":960,"context_line":"            image_service, image_id \u003d \\"},{"line_number":961,"context_line":"                glance.get_remote_image_service(context, image_meta[\u0027id\u0027])"},{"line_number":962,"context_line":""},{"line_number":963,"context_line":"            if volume[\u0027encryption_key_id\u0027]:"},{"line_number":964,"context_line":"                self.driver.copy_encrypted_volume_to_image(context, volume,"},{"line_number":965,"context_line":"                                                           image_service,"},{"line_number":966,"context_line":"                                                           image_meta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_53bc296c","line":963,"in_reply_to":"fa1b9901_61cf817f","updated":"2015-08-27 02:43:02.000000000","message":"to avoid keyError, I am not sure if encryption_key_id always in volume, but if you are 100% sure, I think your code is okay.","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"31446bc290bf379daf04e405c438e0d6acc5ed64","unresolved":false,"context_lines":[{"line_number":960,"context_line":"            image_service, image_id \u003d \\"},{"line_number":961,"context_line":"                glance.get_remote_image_service(context, image_meta[\u0027id\u0027])"},{"line_number":962,"context_line":""},{"line_number":963,"context_line":"            if volume[\u0027encryption_key_id\u0027]:"},{"line_number":964,"context_line":"                self.driver.copy_encrypted_volume_to_image(context, volume,"},{"line_number":965,"context_line":"                                                           image_service,"},{"line_number":966,"context_line":"                                                           image_meta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_61cf817f","line":963,"in_reply_to":"fa1b9901_dba6830e","updated":"2015-08-26 08:41:13.000000000","message":"May I know why?","commit_id":"6b31c8e0be107b64db96ca143865bcdfb7b2abf7"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f11b020dd89a6d101bfe3e74c65c037848eeb42c","unresolved":false,"context_lines":[{"line_number":1187,"context_line":"            if volume.get(\u0027encryption_key_id\u0027):"},{"line_number":1188,"context_line":"                self.driver.copy_encrypted_volume_to_image(context, volume,"},{"line_number":1189,"context_line":"                                                           image_service,"},{"line_number":1190,"context_line":"                                                           image_meta)"},{"line_number":1191,"context_line":"            elif (self.driver.configuration.image_upload_use_cinder_backend"},{"line_number":1192,"context_line":"                  and self._clone_image_volume_and_add_location("},{"line_number":1193,"context_line":"                      context, volume, image_service, image_meta)):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_4dad48e8","line":1190,"updated":"2015-09-14 22:32:38.000000000","message":"This method should be internal to the driver. I don\u0027t think it should be invoked directly here.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0131874ec6e6c2352aec357dbe2c2d8ac92e347b","unresolved":false,"context_lines":[{"line_number":1187,"context_line":"            if volume.get(\u0027encryption_key_id\u0027):"},{"line_number":1188,"context_line":"                self.driver.copy_encrypted_volume_to_image(context, volume,"},{"line_number":1189,"context_line":"                                                           image_service,"},{"line_number":1190,"context_line":"                                                           image_meta)"},{"line_number":1191,"context_line":"            elif (self.driver.configuration.image_upload_use_cinder_backend"},{"line_number":1192,"context_line":"                  and self._clone_image_volume_and_add_location("},{"line_number":1193,"context_line":"                      context, volume, image_service, image_meta)):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba15a1d1_6ba210fe","line":1190,"in_reply_to":"ba15a1d1_4dad48e8","updated":"2015-09-23 15:49:42.000000000","message":"The function is removed.","commit_id":"7c2a20b5178b060dc98ff869730ca07879b29a25"}]}
