)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"We can\u0027t use Nova encryptors directly as it is also used for local"},{"line_number":21,"context_line":"LVM volumes and remote volumes."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I1669a58cbdf2f7bee390888301c468cbe930b11d"},{"line_number":24,"context_line":"Closes-bug: #1485449"},{"line_number":25,"context_line":"Closes-bug: #1482464"},{"line_number":26,"context_line":"Closes-bug: #1465656"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_35037c44","line":23,"updated":"2015-09-14 22:03:20.000000000","message":"This change doesn\u0027t really close any of the bugs listed below. \"Related-bug:\" is the appropriate tag to use in this case.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":20,"context_line":"We can\u0027t use Nova encryptors directly as it is also used for local"},{"line_number":21,"context_line":"LVM volumes and remote volumes."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I1669a58cbdf2f7bee390888301c468cbe930b11d"},{"line_number":24,"context_line":"Closes-bug: #1485449"},{"line_number":25,"context_line":"Closes-bug: #1482464"},{"line_number":26,"context_line":"Closes-bug: #1465656"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_aeb3734c","line":23,"in_reply_to":"ba15a1d1_35037c44","updated":"2015-09-23 02:34:25.000000000","message":"Done","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I1669a58cbdf2f7bee390888301c468cbe930b11d"},{"line_number":24,"context_line":"Closes-bug: #1485449"},{"line_number":25,"context_line":"Closes-bug: #1482464"},{"line_number":26,"context_line":"Closes-bug: #1465656"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_d5cc8037","line":25,"updated":"2015-09-14 22:03:20.000000000","message":"This bug is already marked as closed (fix released).","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I1669a58cbdf2f7bee390888301c468cbe930b11d"},{"line_number":24,"context_line":"Closes-bug: #1485449"},{"line_number":25,"context_line":"Closes-bug: #1482464"},{"line_number":26,"context_line":"Closes-bug: #1465656"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_8eb6af3c","line":25,"in_reply_to":"ba15a1d1_d5cc8037","updated":"2015-09-23 02:34:25.000000000","message":"Hi, Joel, the former patch for this bug prevents the creation of volume from images. This patch is a real fix.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c946cd730eaa9feca7c789a9ff5819c7cba74a0b","unresolved":false,"context_lines":[{"line_number":15,"context_line":"layers."},{"line_number":16,"context_line":"This patch is the first step. It copies encryptors from Nova to"},{"line_number":17,"context_line":"Cinder, and do following changes:"},{"line_number":18,"context_line":"1. Add --dmcypt in end of dev name."},{"line_number":19,"context_line":"2. Return the new path name in attach_volume()."},{"line_number":20,"context_line":"We can\u0027t use Nova encryptors directly as it is also used for local"},{"line_number":21,"context_line":"LVM volumes and remote volumes."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9a1a9d01_f93b7ccf","line":18,"updated":"2015-09-28 17:52:18.000000000","message":"nit: It looks like the name ends with \u0027--encrypt\u0027 per cryptsetup.py","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"11acb631d1b6e5737b1352da984716269e81a6c1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"layers."},{"line_number":16,"context_line":"This patch is the first step. It copies encryptors from Nova to"},{"line_number":17,"context_line":"Cinder, and do following changes:"},{"line_number":18,"context_line":"1. Add --dmcypt in end of dev name."},{"line_number":19,"context_line":"2. Return the new path name in attach_volume()."},{"line_number":20,"context_line":"We can\u0027t use Nova encryptors directly as it is also used for local"},{"line_number":21,"context_line":"LVM volumes and remote volumes."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9a1a9d01_7f46a750","line":18,"in_reply_to":"9a1a9d01_f93b7ccf","updated":"2015-10-02 16:18:15.000000000","message":"Done","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"}],"cinder/tests/unit/volume/encryptors/test_cryptsetup.py":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"3b6016ad1a70b1484b96be6ff035d47e26e06e2d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertEqual(1, mock_execute.call_count)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def test_init_volume_encryption_not_supported(self):"},{"line_number":93,"context_line":"        # Tests that creating a CryptsetupEncryptor fails if there is no"},{"line_number":94,"context_line":"        # device_path key."},{"line_number":95,"context_line":"        type \u003d \u0027unencryptable\u0027"},{"line_number":96,"context_line":"        data \u003d dict(volume_id\u003d\u0027a194699b-aa07-4433-a945-a5d23802043e\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_504ffbbc","line":93,"updated":"2015-09-28 06:52:43.000000000","message":"\"fails\"-\u003e\"will fail\"?","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"11acb631d1b6e5737b1352da984716269e81a6c1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertEqual(1, mock_execute.call_count)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def test_init_volume_encryption_not_supported(self):"},{"line_number":93,"context_line":"        # Tests that creating a CryptsetupEncryptor fails if there is no"},{"line_number":94,"context_line":"        # device_path key."},{"line_number":95,"context_line":"        type \u003d \u0027unencryptable\u0027"},{"line_number":96,"context_line":"        data \u003d dict(volume_id\u003d\u0027a194699b-aa07-4433-a945-a5d23802043e\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_18d1c6fb","line":93,"in_reply_to":"9a1a9d01_504ffbbc","updated":"2015-10-02 16:18:15.000000000","message":"Sorry, I think \u0027fails\u0027 better.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"}],"cinder/volume/encryptors/__init__.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c94b1bc8306f95171244c5453da774ba8313b842","unresolved":false,"context_lines":[{"line_number":43,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":44,"context_line":"            provider \u003d \\"},{"line_number":45,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":46,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":47,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":48,"context_line":"        try:"},{"line_number":49,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_1b7549f8","line":46,"updated":"2015-09-14 22:17:04.000000000","message":"This case shouldn\u0027t be required (the NoOpEncryptor is the default).","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":43,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":44,"context_line":"            provider \u003d \\"},{"line_number":45,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":46,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":47,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":48,"context_line":"        try:"},{"line_number":49,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_1fe8f515","line":46,"in_reply_to":"ba15a1d1_1b7549f8","updated":"2015-09-23 02:34:25.000000000","message":"If there is other additional encryptors, it raises exceptions. So I keep it same as Nova.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c946cd730eaa9feca7c789a9ff5819c7cba74a0b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    encryptor \u003d nop.NoOpEncryptor(connection_info, **kwargs)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    location \u003d kwargs.get(\u0027control_location\u0027, None)"},{"line_number":37,"context_line":"    if location and location.lower() \u003d\u003d \u0027front-end\u0027:  # case insensitive"},{"line_number":38,"context_line":"        provider \u003d kwargs.get(\u0027provider\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        if provider \u003d\u003d \u0027LuksEncryptor\u0027 or \u0027LuksEncryptor\u0027 in provider:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_b607531b","line":37,"updated":"2015-09-28 17:52:18.000000000","message":"\"front-end\" means that Nova is responsible for doing the encryption and decryption of the volume. So this is a little weird: we\u0027re saying Nova is responsible, but we\u0027re going to do some of it in Cinder anyway.\n\nI think there should be a comment about why \u0027front-end\u0027 encryption is being done in Cinder (the \u0027back-end\u0027). It should also mention that the encryptors are all copied from Nova and should be kept in sync with the ones in Nova. That would help other developers with maintainability later.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"11acb631d1b6e5737b1352da984716269e81a6c1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    encryptor \u003d nop.NoOpEncryptor(connection_info, **kwargs)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    location \u003d kwargs.get(\u0027control_location\u0027, None)"},{"line_number":37,"context_line":"    if location and location.lower() \u003d\u003d \u0027front-end\u0027:  # case insensitive"},{"line_number":38,"context_line":"        provider \u003d kwargs.get(\u0027provider\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        if provider \u003d\u003d \u0027LuksEncryptor\u0027 or \u0027LuksEncryptor\u0027 in provider:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_93813950","line":37,"in_reply_to":"9a1a9d01_b607531b","updated":"2015-10-02 16:18:15.000000000","message":"Done","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c946cd730eaa9feca7c789a9ff5819c7cba74a0b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":44,"context_line":"            provider \u003d \\"},{"line_number":45,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":46,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":47,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":48,"context_line":"        try:"},{"line_number":49,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_2209c231","line":46,"updated":"2015-09-28 17:52:18.000000000","message":"Following comments on patch set 4, this case isn\u0027t necessary. If there are additional encryptors, then they *should* raise an exception because Cinder doesn\u0027t know how to handle them.\n\nThis else block would only be executed if the provider name is \"NoOpEncryptor.\" That encryptor only exists to avoid lots of special case handling -- e.g., if there is an encryptor and the encryptor is available, then try to use it.\n\nNova\u0027s code is probably wrong in this case, and I wouldn\u0027t copy this bit.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"b540d8ff7ab12b52d6572564dff51c357c080e13","unresolved":false,"context_lines":[{"line_number":43,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":44,"context_line":"            provider \u003d \\"},{"line_number":45,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":46,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":47,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":48,"context_line":"        try:"},{"line_number":49,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a2fa921_fd9af8c4","line":46,"in_reply_to":"9a1a9d01_13968994","updated":"2015-10-05 16:49:43.000000000","message":"\u003e As currently in cinder database, the encryptor per volume is stored as \"nova.volume.encryptors.cryptsetup\" or \"cryptsetup\".\n\nYes, that\u0027s okay. But no one should be using \"NoOpEncryptor\" so the else case can be eliminated.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"11acb631d1b6e5737b1352da984716269e81a6c1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":44,"context_line":"            provider \u003d \\"},{"line_number":45,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":46,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":47,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":48,"context_line":"        try:"},{"line_number":49,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_13968994","line":46,"in_reply_to":"9a1a9d01_2209c231","updated":"2015-10-02 16:18:15.000000000","message":"I have to add the check.\nAs currently in cinder database, the encryptor per volume is stored as \"nova.volume.encryptors.cryptsetup\" or \"cryptsetup\". I have to change it to cinder.volume.encryptors.cryptsetup.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"631478ad561966e5cee5870cb71921333d5b0dcf","unresolved":false,"context_lines":[{"line_number":47,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":48,"context_line":"            provider \u003d \\"},{"line_number":49,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":50,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":51,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_bd7b207b","line":50,"updated":"2015-10-05 16:50:10.000000000","message":"I still disagree with the existence of this case, as it should never be necessary. But it shouldn\u0027t hurt anything either because the NoOpEncryptor is already set by default (it\u0027s just an unnecessary check).","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"96189167834cc007ecf9b97cfb229c28472f354a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":48,"context_line":"            provider \u003d \\"},{"line_number":49,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":50,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":51,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_36ed49b7","line":50,"in_reply_to":"7a2fa921_23f1ad01","updated":"2015-10-08 18:46:39.000000000","message":"I disagree. If an administrator specifies the \u0027NoOpEncryptor\u0027, then they\u0027re essentially saying \"pretend that we\u0027re encrypting everything but we actually won\u0027t do any encryption at all.\" So an administrator should *never* specify the NoOpEncryptor and it should be an error to do so.\n\nThe NoOpEncryptor exists solely to avoid lots of special cases in the source code. That is, it prevents lots of if...else checks because an encryptor is *always* present. (See the docstring for the NoOpEncryptor class.)","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"2656e93dc2ac82745a1239a8061218fc1e81369e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":48,"context_line":"            provider \u003d \\"},{"line_number":49,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":50,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":51,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_d3a84bde","line":50,"in_reply_to":"7a2fa921_36ed49b7","updated":"2015-10-12 08:49:26.000000000","message":"But the problem is that currently no validation check for provider when encryption-type-create. It means that there may be a type with provider set as NoOpEncryptor, and there are existed volume with the type. \n\nCinder does the check to remain consistent actions with Nova. \n\nBTW, I raised a bug to check the validation.\n\nhttps://bugs.launchpad.net/cinder/+bug/1505113","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"cbc02ceda0df7f5a5a52043e344a4517c1b979d8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"              \u0027CryptsetupEncryptor\u0027 in provider):"},{"line_number":48,"context_line":"            provider \u003d \\"},{"line_number":49,"context_line":"                \u0027cinder.volume.encryptors.cryptsetup.CryptsetupEncryptor\u0027"},{"line_number":50,"context_line":"        elif provider \u003d\u003d \u0027NoOpEncryptor\u0027 or \u0027NoOpEncryptor\u0027 in provider:"},{"line_number":51,"context_line":"            provider \u003d \u0027cinder.volume.encryptors.nop.NoOpEncryptor\u0027"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            encryptor \u003d importutils.import_object(provider, connection_info,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_23f1ad01","line":50,"in_reply_to":"7a2fa921_bd7b207b","updated":"2015-10-08 06:45:30.000000000","message":"Since admin create volume_type_encryption and they may specify provider as \u0027NoOpencryptor\u0027, so for avoiding importing error, this check should be here IMO.","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"}],"cinder/volume/encryptors/base.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"58ec6969bc6d557eae10e1956155a8dc5e36581d","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"},{"line_number":50,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":51,"context_line":"        \"\"\"Hook called immediately prior to attaching a volume.\"\"\""},{"line_number":52,"context_line":"        pass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_bb63fd19","line":51,"updated":"2015-09-17 12:32:34.000000000","message":"Docstring is not consistent with use in dependent patch. (The docstring should include a :return: annotation.)","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"},{"line_number":50,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":51,"context_line":"        \"\"\"Hook called immediately prior to attaching a volume.\"\"\""},{"line_number":52,"context_line":"        pass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_dff11d03","line":51,"in_reply_to":"ba15a1d1_bb63fd19","updated":"2015-09-23 02:34:25.000000000","message":"Done","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c946cd730eaa9feca7c789a9ff5819c7cba74a0b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":51,"context_line":"        \"\"\"Attach a volume."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :return: The attached path."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        return"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_96300fa0","line":53,"updated":"2015-09-28 17:52:18.000000000","message":"I think \"The path of the attached volume that has been decrypted\" would be clearer.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"11acb631d1b6e5737b1352da984716269e81a6c1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":51,"context_line":"        \"\"\"Attach a volume."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :return: The attached path."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        return"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_7886c214","line":53,"in_reply_to":"9a1a9d01_96300fa0","updated":"2015-10-02 16:18:15.000000000","message":"Done","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"}],"cinder/volume/encryptors/cryptsetup.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        super(CryptsetupEncryptor, self).__init__(connection_info, **kwargs)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume, e.g. in"},{"line_number":39,"context_line":"        # the case of libvirt network volume drivers."},{"line_number":40,"context_line":"        data \u003d connection_info[\u0027data\u0027]"},{"line_number":41,"context_line":"        if not data.get(\u0027device_path\u0027):"},{"line_number":42,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_c04da073","line":39,"updated":"2015-09-14 22:03:20.000000000","message":"Is this error case possible? It seems to pertain to Nova rather than Cinder.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        super(CryptsetupEncryptor, self).__init__(connection_info, **kwargs)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume, e.g. in"},{"line_number":39,"context_line":"        # the case of libvirt network volume drivers."},{"line_number":40,"context_line":"        data \u003d connection_info[\u0027data\u0027]"},{"line_number":41,"context_line":"        if not data.get(\u0027device_path\u0027):"},{"line_number":42,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_5fbd0d01","line":39,"in_reply_to":"ba15a1d1_c04da073","updated":"2015-09-23 02:34:25.000000000","message":"Done","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                volume_id\u003dvolume_id,"},{"line_number":45,"context_line":"                volume_type\u003dconnection_info[\u0027driver_volume_type\u0027])"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # the device\u0027s path as given to libvirt -- e.g., /dev/disk/by-path/..."},{"line_number":48,"context_line":"        self.symlink_path \u003d connection_info[\u0027data\u0027][\u0027device_path\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        # a unique name for the volume -- e.g., the iSCSI participant name"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_157f58ab","line":47,"updated":"2015-09-14 22:03:20.000000000","message":"nit: reference to libvirt that isn\u0027t relevant in this context","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                volume_id\u003dvolume_id,"},{"line_number":45,"context_line":"                volume_type\u003dconnection_info[\u0027driver_volume_type\u0027])"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # the device\u0027s path as given to libvirt -- e.g., /dev/disk/by-path/..."},{"line_number":48,"context_line":"        self.symlink_path \u003d connection_info[\u0027data\u0027][\u0027device_path\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        # a unique name for the volume -- e.g., the iSCSI participant name"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_7fba510c","line":47,"in_reply_to":"ba15a1d1_157f58ab","updated":"2015-09-23 02:34:25.000000000","message":"Done","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                volume_type\u003dconnection_info[\u0027driver_volume_type\u0027])"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # the device\u0027s path as given to libvirt -- e.g., /dev/disk/by-path/..."},{"line_number":48,"context_line":"        self.symlink_path \u003d connection_info[\u0027data\u0027][\u0027device_path\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        # a unique name for the volume -- e.g., the iSCSI participant name"},{"line_number":51,"context_line":"        self.dev_name \u003d self.symlink_path.split(\u0027/\u0027)[-1] + \u0027--encrypt\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_20e33ca5","line":48,"updated":"2015-09-14 22:03:20.000000000","message":"symlink_path isn\u0027t used outside this function -- there\u0027s no need to save it as an instance variable","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      check_exit_code\u003dTrue, run_as_root\u003dTrue)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Shadows the device and passes an unencrypted version."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        Transparent disk encryption is achieved by mounting the volume via"},{"line_number":87,"context_line":"        dm-crypt and passing the resulting device to the instance. The"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_4040b0a5","line":84,"updated":"2015-09-14 22:03:20.000000000","message":"This comment appears to relate to Nova rather than Cinder. (The Nova implementation symlinks to (\"shadows\") the volume\u0027s path.)","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      check_exit_code\u003dTrue, run_as_root\u003dTrue)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":84,"context_line":"        \"\"\"Shadows the device and passes an unencrypted version."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        Transparent disk encryption is achieved by mounting the volume via"},{"line_number":87,"context_line":"        dm-crypt and passing the resulting device to the instance. The"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_832692b8","line":84,"in_reply_to":"ba15a1d1_4040b0a5","updated":"2015-09-23 02:34:25.000000000","message":"The comments are updated.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c946cd730eaa9feca7c789a9ff5819c7cba74a0b","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if not data or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_b691939b","line":40,"updated":"2015-09-28 17:52:18.000000000","message":"I think that the preferred way to express the first condition is\n\n  if data is not None ...","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d11846d8bf0eb054fba6bafe1f33709c9ae68eed","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if not data or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_ffadd79b","line":40,"in_reply_to":"9a1a9d01_58af3e7d","updated":"2015-10-02 16:23:34.000000000","message":"In fact, it is \u0027data is None\u0027.","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"11acb631d1b6e5737b1352da984716269e81a6c1","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if not data or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_58af3e7d","line":40,"in_reply_to":"9a1a9d01_b691939b","updated":"2015-10-02 16:18:15.000000000","message":"Done","commit_id":"3466acf1d4230bcbc7c24f1445fb4bba28e15c9e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"631478ad561966e5cee5870cb71921333d5b0dcf","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if data is None or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_5dc52c59","line":40,"updated":"2015-10-05 16:50:10.000000000","message":"If data is None, then data.get(\u0027volume_id\u0027) will fail with an AttributeError.","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"2656e93dc2ac82745a1239a8061218fc1e81369e","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if data is None or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_53e3db33","line":40,"in_reply_to":"7a2fa921_5dc52c59","updated":"2015-10-12 08:49:26.000000000","message":"Hi, Joel, \n\nThis is \"or\". If \"data is None\" true, it will not check data.get().\n\nThe error is raised when \n\n1. no data; or\n\n2. no device_path","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"afbb1b040c07ea8e3556107a2206e3449a98a6a9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if data is None or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"},{"line_number":44,"context_line":"                volume_type\u003dconnection_info[\u0027driver_volume_type\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a2ca52d_173c6f92","line":41,"updated":"2015-10-13 12:57:14.000000000","message":"This line raises an AttributeError when data is None.\n\n  \u003e\u003e\u003e data \u003d None\n  \u003e\u003e\u003e if data is None or not data.get(\u0027device_path\u0027):\n  ...   volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)\n  ... \n  Traceback (most recent call last):\n    File \"\u003cstdin\u003e\", line 2, in \u003cmodule\u003e\n  AttributeError: \u0027NoneType\u0027 object has no attribute \u0027get\u0027","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d84d95308425406e71e143bdde9cab648065c80f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # Fail if no device_path was set when connecting the volume."},{"line_number":39,"context_line":"        data \u003d connection_info.get(\u0027data\u0027)"},{"line_number":40,"context_line":"        if data is None or not data.get(\u0027device_path\u0027):"},{"line_number":41,"context_line":"            volume_id \u003d data.get(\u0027volume_id\u0027) or connection_info.get(\u0027serial\u0027)"},{"line_number":42,"context_line":"            raise exception.VolumeEncryptionNotSupported("},{"line_number":43,"context_line":"                volume_id\u003dvolume_id,"},{"line_number":44,"context_line":"                volume_type\u003dconnection_info[\u0027driver_volume_type\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a2ca52d_18e8007c","line":41,"in_reply_to":"5a2ca52d_173c6f92","updated":"2015-10-30 02:02:23.000000000","message":"Joel, I removed \"data is None\" part, as I think it is not responsibility to check it here.","commit_id":"2016ed96865b81d2b81ffefb120888f31306e683"}],"cinder/volume/encryptors/luks.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"004b2c56733f769aca2cf457c7c54aac94f79022","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    try:"},{"line_number":36,"context_line":"        # check to see if the device uses LUKS: exit status is 0"},{"line_number":37,"context_line":"        # if the device is a LUKS partition and non-zero if not"},{"line_number":38,"context_line":"        utils.execute(\u0027cryptsetup\u0027, \u0027isLuks\u0027, \u0027--verbose\u0027, device,"},{"line_number":39,"context_line":"                      run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":40,"context_line":"        return True"},{"line_number":41,"context_line":"    except processutils.ProcessExecutionError as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_881895d4","line":38,"updated":"2015-09-17 19:10:01.000000000","message":"I don\u0027t see cryptsetup in rootwrap.d/volume.filters.  Configuration needs to be added for this to run as root.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    try:"},{"line_number":36,"context_line":"        # check to see if the device uses LUKS: exit status is 0"},{"line_number":37,"context_line":"        # if the device is a LUKS partition and non-zero if not"},{"line_number":38,"context_line":"        utils.execute(\u0027cryptsetup\u0027, \u0027isLuks\u0027, \u0027--verbose\u0027, device,"},{"line_number":39,"context_line":"                      run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":40,"context_line":"        return True"},{"line_number":41,"context_line":"    except processutils.ProcessExecutionError as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_fff661f8","line":38,"in_reply_to":"ba15a1d1_881895d4","updated":"2015-09-23 02:34:25.000000000","message":"Oh, I added it in the second patch. OK, I will move it to this patch.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                      run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":91,"context_line":"        \"\"\"Shadows the device and passes an unencrypted version."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        Transparent disk encryption is achieved by mounting the volume via"},{"line_number":94,"context_line":"        dm-crypt and passing the resulting device to the instance. The"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_00fdd839","line":91,"updated":"2015-09-14 22:03:20.000000000","message":"See comment on cryptsetup.py","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                      run_as_root\u003dTrue, check_exit_code\u003dTrue)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def attach_volume(self, context, **kwargs):"},{"line_number":91,"context_line":"        \"\"\"Shadows the device and passes an unencrypted version."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        Transparent disk encryption is achieved by mounting the volume via"},{"line_number":94,"context_line":"        dm-crypt and passing the resulting device to the instance. The"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_233d46bb","line":91,"in_reply_to":"ba15a1d1_00fdd839","updated":"2015-09-23 02:34:25.000000000","message":"Done","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8d7987dfb6ae38f5497a972f5091127b703a8e1e","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        key \u003d self._get_key(context).get_encoded()"},{"line_number":100,"context_line":"        # LUKS uses a passphrase rather than a raw key -- convert to string"},{"line_number":101,"context_line":"        passphrase \u003d \u0027\u0027.join(hex(x).replace(\u00270x\u0027, \u0027\u0027) for x in key)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            self._open_volume(passphrase, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_9baab9d3","line":101,"updated":"2015-09-14 22:03:20.000000000","message":"Should reuse _get_passphrase method defined in Cryptsetup class.","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5b403392de13be2b6100112ae58cdb1421c9b312","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        key \u003d self._get_key(context).get_encoded()"},{"line_number":100,"context_line":"        # LUKS uses a passphrase rather than a raw key -- convert to string"},{"line_number":101,"context_line":"        passphrase \u003d \u0027\u0027.join(hex(x).replace(\u00270x\u0027, \u0027\u0027) for x in key)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        try:"},{"line_number":104,"context_line":"            self._open_volume(passphrase, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_63a81edc","line":101,"in_reply_to":"ba15a1d1_9baab9d3","updated":"2015-09-23 02:34:25.000000000","message":"Done","commit_id":"d29ff9cb242acc4db9b4a6272998c780ad9bd456"}]}
