)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"34519e742dcaff29b0d35185c5c7c5c7edde4841","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     b64a9971 (Merge \"Add supported_instances to get_available_resource to all virt drivers\")"},{"line_number":2,"context_line":"Author:     Joe Gordon \u003cjoe.gordon0@gmail.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2013-08-15 15:44:14 -0400"},{"line_number":4,"context_line":"Commit:     Dan Genin \u003cDaniel.Genin@jhuapl.edu\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-08-25 18:38:14 -0400"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAASn%2F%2F3bY%3D","line":2,"updated":"2013-08-28 17:28:17.000000000","message":"I don\u0027t think I wrote this","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"97aa555ad991ecd509c8d71f29e2d1a637f6b0a7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     b64a9971 (Merge \"Add supported_instances to get_available_resource to all virt drivers\")"},{"line_number":2,"context_line":"Author:     Joe Gordon \u003cjoe.gordon0@gmail.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2013-08-15 15:44:14 -0400"},{"line_number":4,"context_line":"Commit:     Dan Genin \u003cDaniel.Genin@jhuapl.edu\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-08-25 18:38:14 -0400"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAASn%2F%2F3KI%3D","line":2,"in_reply_to":"AAAASn%2F%2F3bY%3D","updated":"2013-08-28 19:56:02.000000000","message":"Will fix.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dan Genin \u003cDaniel.Genin@jhuapl.edu\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-08-25 18:38:14 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds ephemeral storage encryption"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds ephemeral storage encryption for LVM back-end instances."},{"line_number":10,"context_line":"Encryption is implemented by passing all data written to and read from"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAASn%2F%2FzNk%3D","line":7,"updated":"2013-08-29 13:24:49.000000000","message":"I think that this summary should mention LVM explicitly.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"34519e742dcaff29b0d35185c5c7c5c7edde4841","unresolved":false,"context_lines":[{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"When fully functional, the proposed code will provide data-at-rest"},{"line_number":16,"context_line":"security for all ephemeral storage drives, preventing access to data"},{"line_number":17,"context_line":"while the instance is suspended or shut down, or if the compute host is"},{"line_number":18,"context_line":"shut down while instances are running."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAASn%2F%2F3Zw%3D","line":15,"updated":"2013-08-28 17:28:17.000000000","message":"What does this mean, when fully functional? Is this only a partial implementation?","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"97aa555ad991ecd509c8d71f29e2d1a637f6b0a7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"When fully functional, the proposed code will provide data-at-rest"},{"line_number":16,"context_line":"security for all ephemeral storage drives, preventing access to data"},{"line_number":17,"context_line":"while the instance is suspended or shut down, or if the compute host is"},{"line_number":18,"context_line":"shut down while instances are running."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAASn%2F%2F3Jg%3D","line":15,"in_reply_to":"AAAASn%2F%2F3Zw%3D","updated":"2013-08-28 19:56:02.000000000","message":"Sorry, this was left over from a previous partial implementation. This last patch is fully functional.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"a20ad1155ec357d16550c6c260111386c2b0fe7a","unresolved":false,"context_lines":[{"line_number":15,"context_line":"The proposed code will provide data-at-rest security for all ephemeral"},{"line_number":16,"context_line":"storage drives, preventing access to data while an instance is"},{"line_number":17,"context_line":"shut down, or in case the compute host is shut down while an instance is"},{"line_number":18,"context_line":"running."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint encrypt-ephemeral-storage"},{"line_number":21,"context_line":"Change-Id: I871af4018f99ddfcc8408708bdaaf480088ac477"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"AAAASn%2F%2FOIs%3D","line":18,"updated":"2013-09-09 19:05:40.000000000","message":"to make things easier for people to use this, can you mention the config changes needed to enable this here.\n\nAlso as this an awesome feature lets add a docImpact flag to make sure we tell people about it","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"f52118a605c92479f3b60e71c18c5e0f0b6a3a86","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint encrypt-ephemeral-storage"},{"line_number":28,"context_line":"Change-Id: I871af4018f99ddfcc8408708bdaaf480088ac477"},{"line_number":29,"context_line":"docImpact"},{"line_number":30,"context_line":"SecurityImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"AAAAS3%2F%2FpfY%3D","line":29,"updated":"2013-09-23 13:15:21.000000000","message":"I think this tag is supposed to be \"DocImpact\" (see https://wiki.openstack.org/wiki/Documentation/DocImpact), but I\u0027m not sure if the capitalization matters or not.","commit_id":"ef19390eeb322585d7cf5eb3bcd1085065683355"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"ac1807d02a61fb62977f434834a3683aaf499cf3","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint encrypt-ephemeral-storage"},{"line_number":28,"context_line":"Change-Id: I871af4018f99ddfcc8408708bdaaf480088ac477"},{"line_number":29,"context_line":"docImpact"},{"line_number":30,"context_line":"SecurityImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":54,"id":"AAAAUH%2F%2F21I%3D","line":29,"updated":"2014-01-07 16:06:45.000000000","message":"I think this should be DocImpact (initial capital D).  I\u0027m not sure that the thing(s) that search for this are case-sensitive but better to be consistent.","commit_id":"9dfd895ceac51d9c474f2049b9487c7058e28506"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"536e06640ae3c98fe0cea6d4ba28db312e45a09d","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements: blueprint encrypt-ephemeral-storage"},{"line_number":28,"context_line":"Change-Id: I871af4018f99ddfcc8408708bdaaf480088ac477"},{"line_number":29,"context_line":"docImpact"},{"line_number":30,"context_line":"SecurityImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":54,"id":"AAAAUH%2F%2F2xI%3D","line":29,"in_reply_to":"AAAAUH%2F%2F21I%3D","updated":"2014-01-07 16:22:22.000000000","message":"Done","commit_id":"9dfd895ceac51d9c474f2049b9487c7058e28506"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"a5c042c87075767bdae614b3cdf5c7e7e552bafc","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds ephemeral storage encryption for LVM back-end instances."},{"line_number":10,"context_line":"Encryption is implemented by passing all data written to and read from"},{"line_number":11,"context_line":"the logical volumes through a dm-crypt layer. Most instance operations"},{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The proposed code provides data-at-rest security for all ephemeral"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2FynY%3D","line":12,"updated":"2014-01-08 12:41:16.000000000","message":"Which operations are *not* supported (other than encrypted snapshots)? This information is probably more important to document.","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"044f6976bc64bf5d21ec9d1164401be645c37b70","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds ephemeral storage encryption for LVM back-end instances."},{"line_number":10,"context_line":"Encryption is implemented by passing all data written to and read from"},{"line_number":11,"context_line":"the logical volumes through a dm-crypt layer. Most instance operations"},{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The proposed code provides data-at-rest security for all ephemeral"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2FlCE%3D","line":12,"in_reply_to":"AAAAUH%2F%2FynY%3D","updated":"2014-01-10 20:24:43.000000000","message":"There are at least two that I am aware of.\n\n1. VM migration is unlikely to work but hasn\u0027t been tested yet.\n2. VM resuce doesn\u0027t work.","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"a5c042c87075767bdae614b3cdf5c7e7e552bafc","unresolved":false,"context_lines":[{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The proposed code provides data-at-rest security for all ephemeral"},{"line_number":16,"context_line":"storage drives, preventing access to data while an instance is"},{"line_number":17,"context_line":"shut down, or in case the compute host is shut down while an instance is"},{"line_number":18,"context_line":"running."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2Fyns%3D","line":15,"updated":"2014-01-08 12:41:16.000000000","message":"Not *all* ephemeral storage drives. This patch supports only the LVM backend.","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"ad01c7f7d0fa36ce859f280c1f97c48bfbe949b2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The proposed code provides data-at-rest security for all ephemeral"},{"line_number":16,"context_line":"storage drives, preventing access to data while an instance is"},{"line_number":17,"context_line":"shut down, or in case the compute host is shut down while an instance is"},{"line_number":18,"context_line":"running."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2FWLY%3D","line":15,"in_reply_to":"AAAAUH%2F%2FlDo%3D","updated":"2014-01-14 19:42:25.000000000","message":"Okay. Your clarification makes sense.","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"044f6976bc64bf5d21ec9d1164401be645c37b70","unresolved":false,"context_lines":[{"line_number":12,"context_line":"such as pause/continue, suspend/resume, reboot, etc. are supported."},{"line_number":13,"context_line":"Snapshots are also supported but are not encrypted at present."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The proposed code provides data-at-rest security for all ephemeral"},{"line_number":16,"context_line":"storage drives, preventing access to data while an instance is"},{"line_number":17,"context_line":"shut down, or in case the compute host is shut down while an instance is"},{"line_number":18,"context_line":"running."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2FlDo%3D","line":15,"in_reply_to":"AAAAUH%2F%2Fyns%3D","updated":"2014-01-10 20:24:43.000000000","message":"By all, here, I mean that all ephemeral storage components, e.g., swap, disk.local, etc., are encrypted, not just the root disk. I tried to emphasize this by using \"drives\" rather than \"backends\" but, perhaps, another word like \"components\" would further reduce the potential for confusion.","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"a5c042c87075767bdae614b3cdf5c7e7e552bafc","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Options controlling the encryption state, cipher and key size are"},{"line_number":21,"context_line":"specified in the \"ephemeral_storage_encryption\" options group. The boolean"},{"line_number":22,"context_line":"\"enabled\" option turn encryption on and off and the \"cipher\" and \"key_size\""},{"line_number":23,"context_line":"options specify the cipher and key size, respectively."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Note: depends on cryptsetup being installed."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2FynU%3D","line":22,"updated":"2014-01-08 12:41:16.000000000","message":"Nit: turn -\u003e turns","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"044f6976bc64bf5d21ec9d1164401be645c37b70","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Options controlling the encryption state, cipher and key size are"},{"line_number":21,"context_line":"specified in the \"ephemeral_storage_encryption\" options group. The boolean"},{"line_number":22,"context_line":"\"enabled\" option turn encryption on and off and the \"cipher\" and \"key_size\""},{"line_number":23,"context_line":"options specify the cipher and key size, respectively."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Note: depends on cryptsetup being installed."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"AAAAUH%2F%2FlB8%3D","line":22,"in_reply_to":"AAAAUH%2F%2FynU%3D","updated":"2014-01-10 20:24:43.000000000","message":"Done","commit_id":"9f8e9882a1ca91665ea077460e8c046841908def"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d19edcd2ed8e17b7f99fc258d4d08117af913d96","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Note: depends on cryptsetup being installed."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Implements: blueprint encrypt-ephemeral-storage"},{"line_number":29,"context_line":"Change-Id: I871af4018f99ddfcc8408708bdaaf480088ac477"},{"line_number":30,"context_line":"DocImpact"},{"line_number":31,"context_line":"SecurityImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":82,"id":"baada198_dff6f35c","line":28,"updated":"2014-07-17 15:04:35.000000000","message":"hmm, did you mean:\nhttps://blueprints.launchpad.net/nova/+spec/lvm-ephemeral-storage-encryption\n\nso blueprint lvm-ephemeral-storage-encryption ?","commit_id":"8eca5128b9dcd7786a3a10780e66cd68b323ae5f"}],"etc/nova/nova.conf.sample":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"34519e742dcaff29b0d35185c5c7c5c7edde4841","unresolved":false,"context_lines":[{"line_number":1870,"context_line":"#encrypt_ephemeral_storage_cipher\u003daes-xts-plain"},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":1873,"context_line":"# ephemeral storage (integer value)"},{"line_number":1874,"context_line":"#encrypt_ephemeral_storage_key_size\u003d256"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":17,"id":"AAAASn%2F%2F3Zc%3D","line":1873,"updated":"2013-08-28 17:28:17.000000000","message":"WHy not create a new config group encrypt_ephemeral_storage or something","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"97aa555ad991ecd509c8d71f29e2d1a637f6b0a7","unresolved":false,"context_lines":[{"line_number":1870,"context_line":"#encrypt_ephemeral_storage_cipher\u003daes-xts-plain"},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":1873,"context_line":"# ephemeral storage (integer value)"},{"line_number":1874,"context_line":"#encrypt_ephemeral_storage_key_size\u003d256"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":17,"id":"AAAASn%2F%2F3Jc%3D","line":1873,"in_reply_to":"AAAASn%2F%2F3Zc%3D","updated":"2013-08-28 19:56:02.000000000","message":"Will do.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"34519e742dcaff29b0d35185c5c7c5c7edde4841","unresolved":false,"context_lines":[{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":1873,"context_line":"# ephemeral storage (integer value)"},{"line_number":1874,"context_line":"#encrypt_ephemeral_storage_key_size\u003d256"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"AAAASn%2F%2F3ZY%3D","line":1874,"updated":"2013-08-28 17:28:17.000000000","message":"Why 256?","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"97aa555ad991ecd509c8d71f29e2d1a637f6b0a7","unresolved":false,"context_lines":[{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":1873,"context_line":"# ephemeral storage (integer value)"},{"line_number":1874,"context_line":"#encrypt_ephemeral_storage_key_size\u003d256"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"AAAASn%2F%2F3I4%3D","line":1874,"in_reply_to":"AAAASn%2F%2F3ZY%3D","updated":"2013-08-28 19:56:02.000000000","message":"256 is a good key length -- strong enough to not be easily broken. But it could be 128 or 512 depending on the user\u0027s requirements.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8f1b77e0421e8c6f9c5f39601a9c9208d5ced7b7","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"# The full class name of the key manager API class (string"},{"line_number":979,"context_line":"# value)"},{"line_number":980,"context_line":"#keymgr_api_class\u003dnova.tests.keymgr.mock_key_mgr.MockKeyManager"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"AAAASn%2F%2Funo%3D","line":980,"updated":"2013-08-30 10:48:53.000000000","message":"Does not match the option\u0027s default value in nova/keymgr/__init__.py (nova.keymgr.not_implemented_key_mgr.NotImplementedKeyManager)\n\nThe mock_key_mgr should *not* be the default key manager because 1) it is insecure and only intended for testing and 2) will not work properly across services.","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"96824f097b5b7fb3e0ff1064a901bc422a55e6d9","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"# The full class name of the key manager API class (string"},{"line_number":979,"context_line":"# value)"},{"line_number":980,"context_line":"#keymgr_api_class\u003dnova.tests.keymgr.mock_key_mgr.MockKeyManager"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"AAAASn%2F%2Ft8Q%3D","line":980,"in_reply_to":"AAAASn%2F%2Funo%3D","updated":"2013-08-30 14:32:35.000000000","message":"Done","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"04186b0a2354af92c32229d6529517b6e16db394","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"# The full class name of the key manager API class (string"},{"line_number":979,"context_line":"# value)"},{"line_number":980,"context_line":"#keymgr_api_class\u003dnova.keymgr.not_implemented_key_mgr.NotImplementedKeyManager"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":24,"id":"AAAASn%2F%2Fjt0%3D","line":980,"updated":"2013-09-03 14:38:39.000000000","message":"so no key manager is available right now? How can I test this out then?","commit_id":"429c15ac97a78692dd61261b146b2939cf1ef434"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"3341239b66efe7341d55fdf9b2ccfc5660f23ae9","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"# The full class name of the key manager API class (string"},{"line_number":979,"context_line":"# value)"},{"line_number":980,"context_line":"#keymgr_api_class\u003dnova.keymgr.not_implemented_key_mgr.NotImplementedKeyManager"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":24,"id":"AAAASn%2F%2Fjho%3D","line":980,"in_reply_to":"AAAASn%2F%2Fjlw%3D","updated":"2013-09-03 15:06:00.000000000","message":"Based on this warning about keys not persistent there, this isn\u0027t what I am looking for.  I want to know how to run this in a production like environment.","commit_id":"429c15ac97a78692dd61261b146b2939cf1ef434"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"488ba83755c18a68289d68b87bb674f667f1fff4","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"# The full class name of the key manager API class (string"},{"line_number":979,"context_line":"# value)"},{"line_number":980,"context_line":"#keymgr_api_class\u003dnova.keymgr.not_implemented_key_mgr.NotImplementedKeyManager"},{"line_number":981,"context_line":""},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":24,"id":"AAAASn%2F%2Fjlw%3D","line":980,"in_reply_to":"AAAASn%2F%2Fjt0%3D","updated":"2013-09-03 14:58:16.000000000","message":"mock key manager can be used for testing\n\nkeymgr_api_class\u003dnova.keymgr.mock_key_mgr.MockKeyManager","commit_id":"429c15ac97a78692dd61261b146b2939cf1ef434"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"a20ad1155ec357d16550c6c260111386c2b0fe7a","unresolved":false,"context_lines":[{"line_number":2558,"context_line":""},{"line_number":2559,"context_line":"# The cipher and mode to be used to encrypt ephemeral storage"},{"line_number":2560,"context_line":"# (string value)"},{"line_number":2561,"context_line":"#cipher\u003daes-xts-plain64"},{"line_number":2562,"context_line":""},{"line_number":2563,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":2564,"context_line":"# ephemeral storage (in XTS mode only half of the bits are"}],"source_content_type":"application/octet-stream","patch_set":31,"id":"AAAASn%2F%2FOIE%3D","line":2561,"updated":"2013-09-09 19:05:40.000000000","message":"can you add a pointer to what other options are supported in the help message","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0c27b86f0f0851e1bb7e67c90f5f47324c5dac61","unresolved":false,"context_lines":[{"line_number":2558,"context_line":""},{"line_number":2559,"context_line":"# The cipher and mode to be used to encrypt ephemeral storage"},{"line_number":2560,"context_line":"# (string value)"},{"line_number":2561,"context_line":"#cipher\u003daes-xts-plain64"},{"line_number":2562,"context_line":""},{"line_number":2563,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":2564,"context_line":"# ephemeral storage (in XTS mode only half of the bits are"}],"source_content_type":"application/octet-stream","patch_set":31,"id":"AAAASn%2F%2FIbs%3D","line":2561,"in_reply_to":"AAAASn%2F%2FOIE%3D","updated":"2013-09-11 13:00:41.000000000","message":"Done","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":2093,"context_line":"# ephemeral storage (in XTS mode only half of the bits are"},{"line_number":2094,"context_line":"# used for encryption key) (integer value)"},{"line_number":2095,"context_line":"#key_size\u003d512  "},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":""},{"line_number":2098,"context_line":"[docker]"}],"source_content_type":"application/octet-stream","patch_set":42,"id":"AAAATn%2F%2BJxg%3D","line":2095,"updated":"2013-12-01 12:59:30.000000000","message":"white space - a script should aut generate this - please run - tools/config/generate_sample.sh","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"# The bit length of the encryption key to be used to encrypt"},{"line_number":2093,"context_line":"# ephemeral storage (in XTS mode only half of the bits are"},{"line_number":2094,"context_line":"# used for encryption key) (integer value)"},{"line_number":2095,"context_line":"#key_size\u003d512  "},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":""},{"line_number":2098,"context_line":"[docker]"}],"source_content_type":"application/octet-stream","patch_set":42,"id":"AAAATn%2F%2BD9w%3D","line":2095,"in_reply_to":"AAAATn%2F%2BJxg%3D","updated":"2013-12-02 22:48:06.000000000","message":"Done","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"1d1879893f9a58bc7f5b81dcaf4a0bea1a3efd91","unresolved":false,"context_lines":[{"line_number":2511,"context_line":"#registry_default_port\u003d5042"},{"line_number":2512,"context_line":""},{"line_number":2513,"context_line":""},{"line_number":2514,"context_line":"[ephemeral_storage_encryption]"},{"line_number":2515,"context_line":""},{"line_number":2516,"context_line":"#"},{"line_number":2517,"context_line":"# Options defined in nova.compute.api"}],"source_content_type":"application/octet-stream","patch_set":59,"id":"AAAAUH%2F%2B5rE%3D","line":2514,"updated":"2014-01-20 22:40:43.000000000","message":"Given this is only supported for LVM, which isn\u0027t the default ephemeral storage option, I feel like we need a more specific name for this group. Something which makes it clear that its LVM only.","commit_id":"3c843aaede3214c8be5b729f35e92277d2381aa2"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d5e44f096b4bfe02ce336f0c2d525975b6687a8b","unresolved":false,"context_lines":[{"line_number":2511,"context_line":"#registry_default_port\u003d5042"},{"line_number":2512,"context_line":""},{"line_number":2513,"context_line":""},{"line_number":2514,"context_line":"[ephemeral_storage_encryption]"},{"line_number":2515,"context_line":""},{"line_number":2516,"context_line":"#"},{"line_number":2517,"context_line":"# Options defined in nova.compute.api"}],"source_content_type":"application/octet-stream","patch_set":59,"id":"AAAAUH%2F%2B5lA%3D","line":2514,"in_reply_to":"AAAAUH%2F%2B5rE%3D","updated":"2014-01-20 22:59:37.000000000","message":"These patches are part of the ephemeral storage encryption blueprint that intends to provide encryption for all backend types. This set is only the first instalment. Patches for Raw and Qcow2 are in the pipeline and will be arriving by Icehouse 3.","commit_id":"3c843aaede3214c8be5b729f35e92277d2381aa2"}],"etc/nova/rootwrap.d/compute.filters":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":36,"context_line":"cryptsetup: CommandFilter, cryptsetup, root"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# nova/virt/libvirt/utils.py: \u0027blockdev\u0027, \u0027--getsize64\u0027, path"},{"line_number":39,"context_line":"blockdev: RegExpFilter, blockdev, root, blockdev, --getsize64, /dev/.*"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# nova/virt/disk/vfs/localfs.py: \u0027tee\u0027, canonpath"},{"line_number":42,"context_line":"tee: CommandFilter, tee, root"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"AAAASn%2F%2FzNI%3D","line":39,"updated":"2013-08-29 13:24:49.000000000","message":"Can the path be restricted further (e.g., to /dev/mapper/.*)?","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":36,"context_line":"cryptsetup: CommandFilter, cryptsetup, root"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# nova/virt/libvirt/utils.py: \u0027blockdev\u0027, \u0027--getsize64\u0027, path"},{"line_number":39,"context_line":"blockdev: RegExpFilter, blockdev, root, blockdev, --getsize64, /dev/.*"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# nova/virt/disk/vfs/localfs.py: \u0027tee\u0027, canonpath"},{"line_number":42,"context_line":"tee: CommandFilter, tee, root"}],"source_content_type":"application/octet-stream","patch_set":17,"id":"AAAASn%2F%2Fy34%3D","line":39,"in_reply_to":"AAAASn%2F%2FzNI%3D","updated":"2013-08-29 20:31:01.000000000","message":"I believe this function is called with devices other than /dev/mapper/.*.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"a20ad1155ec357d16550c6c260111386c2b0fe7a","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# nova/virt/libvirt/imagebackend.py: \u0027cryptsetup\u0027, \u0027create\u0027, ..."},{"line_number":35,"context_line":"# nova/virt/libvirt/utils.py: \u0027cryptsetup\u0027, \u0027remove\u0027, path"},{"line_number":36,"context_line":"cryptsetup: CommandFilter, cryptsetup, root"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# nova/virt/libvirt/utils.py: \u0027blockdev\u0027, \u0027--getsize64\u0027, path"},{"line_number":39,"context_line":"blockdev: RegExpFilter, blockdev, root, blockdev, --getsize64, /dev/.*"}],"source_content_type":"application/octet-stream","patch_set":31,"id":"AAAASn%2F%2FOI8%3D","line":36,"updated":"2013-09-09 19:05:40.000000000","message":"it would be nice to mention this dep somewhere, not sure where though ... maybe in the commit msg.","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0c27b86f0f0851e1bb7e67c90f5f47324c5dac61","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# nova/virt/libvirt/imagebackend.py: \u0027cryptsetup\u0027, \u0027create\u0027, ..."},{"line_number":35,"context_line":"# nova/virt/libvirt/utils.py: \u0027cryptsetup\u0027, \u0027remove\u0027, path"},{"line_number":36,"context_line":"cryptsetup: CommandFilter, cryptsetup, root"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# nova/virt/libvirt/utils.py: \u0027blockdev\u0027, \u0027--getsize64\u0027, path"},{"line_number":39,"context_line":"blockdev: RegExpFilter, blockdev, root, blockdev, --getsize64, /dev/.*"}],"source_content_type":"application/octet-stream","patch_set":31,"id":"AAAASn%2F%2FIb0%3D","line":36,"in_reply_to":"AAAASn%2F%2FOI8%3D","updated":"2013-09-11 13:00:41.000000000","message":"Done","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"}],"nova/compute/api.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":1140,"context_line":"        info_cache.network_info \u003d network_model.NetworkInfo()"},{"line_number":1141,"context_line":"        instance.info_cache \u003d info_cache"},{"line_number":1142,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1143,"context_line":"            instance.ephemeral_key_uuid \u003d \\"},{"line_number":1144,"context_line":"                self.key_manager.create_key("},{"line_number":1145,"context_line":"                    context,"},{"line_number":1146,"context_line":"                    algorithm\u003dCONF.ephemeral_storage_encryption.cipher,"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxY%3D","line":1143,"updated":"2013-12-01 12:59:30.000000000","message":"any chance of writing this \\?","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":1140,"context_line":"        info_cache.network_info \u003d network_model.NetworkInfo()"},{"line_number":1141,"context_line":"        instance.info_cache \u003d info_cache"},{"line_number":1142,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1143,"context_line":"            instance.ephemeral_key_uuid \u003d \\"},{"line_number":1144,"context_line":"                self.key_manager.create_key("},{"line_number":1145,"context_line":"                    context,"},{"line_number":1146,"context_line":"                    algorithm\u003dCONF.ephemeral_storage_encryption.cipher,"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BHGg%3D","line":1143,"in_reply_to":"AAAATn%2F%2BJxY%3D","updated":"2013-12-02 22:48:06.000000000","message":"do you mean write this without the \"\\\" ?","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7764,"name":"Peter Hamilton","email":"peter.hamilton@jhuapl.edu","username":"Peter"},"change_message_id":"693e51f195ac14bb84130aa6a28e539642afb2e2","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1143,"context_line":"            instance.ephemeral_key_uuid \u003d self.key_manager.create_key("},{"line_number":1144,"context_line":"                context,"},{"line_number":1145,"context_line":"                algorithm\u003dCONF.ephemeral_storage_encryption.cipher,"},{"line_number":1146,"context_line":"                length\u003dCONF.ephemeral_storage_encryption.key_size)"},{"line_number":1147,"context_line":"        else:"},{"line_number":1148,"context_line":"            instance.ephemeral_key_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96t8%3D","line":1145,"updated":"2013-12-04 14:18:42.000000000","message":"Why is the encryption cipher passed to the key manager? I would think only the key_size would be needed here.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"a125b583ff46844e6b8803d679fdb5f253e1a887","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1143,"context_line":"            instance.ephemeral_key_uuid \u003d self.key_manager.create_key("},{"line_number":1144,"context_line":"                context,"},{"line_number":1145,"context_line":"                algorithm\u003dCONF.ephemeral_storage_encryption.cipher,"},{"line_number":1146,"context_line":"                length\u003dCONF.ephemeral_storage_encryption.key_size)"},{"line_number":1147,"context_line":"        else:"},{"line_number":1148,"context_line":"            instance.ephemeral_key_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96XQ%3D","line":1145,"in_reply_to":"AAAATn%2F96iw%3D","updated":"2013-12-04 15:34:07.000000000","message":"Oh, I see your point. Will remove.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7764,"name":"Peter Hamilton","email":"peter.hamilton@jhuapl.edu","username":"Peter"},"change_message_id":"e82e84594f3056e6c8120722455bfd84708fd053","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1143,"context_line":"            instance.ephemeral_key_uuid \u003d self.key_manager.create_key("},{"line_number":1144,"context_line":"                context,"},{"line_number":1145,"context_line":"                algorithm\u003dCONF.ephemeral_storage_encryption.cipher,"},{"line_number":1146,"context_line":"                length\u003dCONF.ephemeral_storage_encryption.key_size)"},{"line_number":1147,"context_line":"        else:"},{"line_number":1148,"context_line":"            instance.ephemeral_key_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96iw%3D","line":1145,"in_reply_to":"AAAATn%2F96mE%3D","updated":"2013-12-04 15:00:58.000000000","message":"I suppose there could be a case where a key should be generated with certain features to leverage the full security of a specified cipher, therefore requiring the cipher name at key creation. I just don\u0027t know of an actual example where this would occur.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1143,"context_line":"            instance.ephemeral_key_uuid \u003d self.key_manager.create_key("},{"line_number":1144,"context_line":"                context,"},{"line_number":1145,"context_line":"                algorithm\u003dCONF.ephemeral_storage_encryption.cipher,"},{"line_number":1146,"context_line":"                length\u003dCONF.ephemeral_storage_encryption.key_size)"},{"line_number":1147,"context_line":"        else:"},{"line_number":1148,"context_line":"            instance.ephemeral_key_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96mE%3D","line":1145,"in_reply_to":"AAAATn%2F96t8%3D","updated":"2013-12-04 14:56:33.000000000","message":"Based on the definition in key_mgr\ndef create_key(self, ctxt, algorithm\u003d\u0027AES\u0027, length\u003d256, expiration\u003dNone, **kwargs)\nBut you are right that this is an issue because the same parameter is also passed to cryptsetup.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7764,"name":"Peter Hamilton","email":"peter.hamilton@jhuapl.edu","username":"Peter"},"change_message_id":"3d0c5f86abcc0ad18549687fe631df435dc6f57b","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"                context,"},{"line_number":1200,"context_line":"                length\u003dCONF.ephemeral_storage_encryption.key_size)"},{"line_number":1201,"context_line":"        else:"},{"line_number":1202,"context_line":"            instance.ephemeral_key_uuid \u003d None"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        # Store image properties so we can use them later"},{"line_number":1205,"context_line":"        # (for notifications, etc).  Only store what we can."}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2BkSM%3D","line":1202,"updated":"2014-02-20 13:40:48.000000000","message":"nit - why is this not called encryption_key_uuid?","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":7764,"name":"Peter Hamilton","email":"peter.hamilton@jhuapl.edu","username":"Peter"},"change_message_id":"d32a34f7a29e476498de3f5c9490d10b2862be88","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"                context,"},{"line_number":1200,"context_line":"                length\u003dCONF.ephemeral_storage_encryption.key_size)"},{"line_number":1201,"context_line":"        else:"},{"line_number":1202,"context_line":"            instance.ephemeral_key_uuid \u003d None"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        # Store image properties so we can use them later"},{"line_number":1205,"context_line":"        # (for notifications, etc).  Only store what we can."}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2BkMk%3D","line":1202,"in_reply_to":"AAAAUX%2F%2BkSM%3D","updated":"2014-02-20 13:48:02.000000000","message":"ignore this - I forgot about the prior patch that added this in","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"92db1fa81a38ad6e78be7d92a6bcef09b5fb8469","unresolved":false,"context_lines":[{"line_number":125,"context_line":"ephemeral_storage_encryption_opts \u003d ["},{"line_number":126,"context_line":"    cfg.BoolOpt(\u0027enabled\u0027,"},{"line_number":127,"context_line":"                default\u003dFalse,"},{"line_number":128,"context_line":"                help\u003d\u0027Whether to encrypt ephemeral storage\u0027),"},{"line_number":129,"context_line":"    cfg.StrOpt(\u0027cipher\u0027,"},{"line_number":130,"context_line":"               default\u003d\u0027aes-xts-plain64\u0027,"},{"line_number":131,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt ephemeral \u0027"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F6D8%3D","line":128,"updated":"2014-02-27 15:16:21.000000000","message":"when do we expect to make this default True? It seems like after the recent issues with things like digital ocean, default true would be goodness.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4ae3bb7f79b64829230c51be301697bca42b4390","unresolved":false,"context_lines":[{"line_number":125,"context_line":"ephemeral_storage_encryption_opts \u003d ["},{"line_number":126,"context_line":"    cfg.BoolOpt(\u0027enabled\u0027,"},{"line_number":127,"context_line":"                default\u003dFalse,"},{"line_number":128,"context_line":"                help\u003d\u0027Whether to encrypt ephemeral storage\u0027),"},{"line_number":129,"context_line":"    cfg.StrOpt(\u0027cipher\u0027,"},{"line_number":130,"context_line":"               default\u003d\u0027aes-xts-plain64\u0027,"},{"line_number":131,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt ephemeral \u0027"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F3GI%3D","line":128,"in_reply_to":"AAAAVX%2F%2F6D8%3D","updated":"2014-02-27 18:56:31.000000000","message":"Given that encryption is available only for LVM (implementations for Qcow2 and Raw are blocked due to broken encryption implementation in Qemu and loop device performance concerns, respectively) this is not likely any time soon.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":137,"context_line":"CONF.register_opts(compute_opts)"},{"line_number":138,"context_line":"CONF.register_group(ephemeral_storage_encryption_group)"},{"line_number":139,"context_line":"CONF.register_opts(ephemeral_storage_encryption_opts,"},{"line_number":140,"context_line":"  group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":141,"context_line":"CONF.import_opt(\u0027compute_topic\u0027, \u0027nova.compute.rpcapi\u0027)"},{"line_number":142,"context_line":"CONF.import_opt(\u0027enable\u0027, \u0027nova.cells.opts\u0027, group\u003d\u0027cells\u0027)"},{"line_number":143,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_589b6317","line":140,"updated":"2014-09-05 19:45:51.000000000","message":"nit: align the group\u003d to the ephemeral_ above it...","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":137,"context_line":"CONF.register_opts(compute_opts)"},{"line_number":138,"context_line":"CONF.register_group(ephemeral_storage_encryption_group)"},{"line_number":139,"context_line":"CONF.register_opts(ephemeral_storage_encryption_opts,"},{"line_number":140,"context_line":"  group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":141,"context_line":"CONF.import_opt(\u0027compute_topic\u0027, \u0027nova.compute.rpcapi\u0027)"},{"line_number":142,"context_line":"CONF.import_opt(\u0027enable\u0027, \u0027nova.cells.opts\u0027, group\u003d\u0027cells\u0027)"},{"line_number":143,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_33f1606b","line":140,"in_reply_to":"fa98f980_589b6317","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    vcpus \u003d Column(Integer)"},{"line_number":231,"context_line":"    root_gb \u003d Column(Integer)"},{"line_number":232,"context_line":"    ephemeral_gb \u003d Column(Integer)"},{"line_number":233,"context_line":"    ephemeral_key_uuid \u003d Column(String(36))"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    # This is not related to hostname, above.  It refers"},{"line_number":236,"context_line":"    #  to the nova node."}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxU%3D","line":233,"updated":"2013-12-01 12:59:30.000000000","message":"you need a database migration for this.","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    vcpus \u003d Column(Integer)"},{"line_number":231,"context_line":"    root_gb \u003d Column(Integer)"},{"line_number":232,"context_line":"    ephemeral_gb \u003d Column(Integer)"},{"line_number":233,"context_line":"    ephemeral_key_uuid \u003d Column(String(36))"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    # This is not related to hostname, above.  It refers"},{"line_number":236,"context_line":"    #  to the nova node."}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BHGY%3D","line":233,"in_reply_to":"AAAATn%2F%2BJxU%3D","updated":"2013-12-02 22:48:06.000000000","message":"Done","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"}],"nova/keymgr/__init__.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8f1b77e0421e8c6f9c5f39601a9c9208d5ced7b7","unresolved":false,"context_lines":[{"line_number":22,"context_line":"keymgr_opts \u003d ["},{"line_number":23,"context_line":"    cfg.StrOpt(\u0027keymgr_api_class\u0027,"},{"line_number":24,"context_line":"               default\u003d\u0027nova.keymgr.\u0027"},{"line_number":25,"context_line":"                       \u0027not_implemented_key_mgr.NotImplementedKeyManager\u0027,"},{"line_number":26,"context_line":"               help\u003d\u0027The full class name of the key manager API class\u0027),"},{"line_number":27,"context_line":"]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAASn%2F%2Funw%3D","line":25,"updated":"2013-08-30 10:48:53.000000000","message":"not_implemented_key_mgr is not defined in this patch or upstream","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"96824f097b5b7fb3e0ff1064a901bc422a55e6d9","unresolved":false,"context_lines":[{"line_number":22,"context_line":"keymgr_opts \u003d ["},{"line_number":23,"context_line":"    cfg.StrOpt(\u0027keymgr_api_class\u0027,"},{"line_number":24,"context_line":"               default\u003d\u0027nova.keymgr.\u0027"},{"line_number":25,"context_line":"                       \u0027not_implemented_key_mgr.NotImplementedKeyManager\u0027,"},{"line_number":26,"context_line":"               help\u003d\u0027The full class name of the key manager API class\u0027),"},{"line_number":27,"context_line":"]"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAASn%2F%2Ft8I%3D","line":25,"in_reply_to":"AAAASn%2F%2Funw%3D","updated":"2013-08-30 14:32:35.000000000","message":"Done","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"}],"nova/objects/instance.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"40cb7229b46a9b7eab41823a4d8e87419e8f0592","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":98,"context_line":"        \u0027ephemeral_key_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":101,"context_line":"        \u0027node\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BF4c%3D","line":98,"updated":"2013-12-02 16:49:13.000000000","message":"You need to bump the object version to make this change.","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \u0027vcpus\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":96,"context_line":"        \u0027root_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":97,"context_line":"        \u0027ephemeral_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":98,"context_line":"        \u0027ephemeral_key_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":101,"context_line":"        \u0027node\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BFtI%3D","line":98,"in_reply_to":"AAAATn%2F%2BF4c%3D","updated":"2013-12-02 22:48:06.000000000","message":"Done","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"}],"nova/test.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    \"\"\""},{"line_number":311,"context_line":"    USES_DB \u003d False"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def setUp(self):"},{"line_number":314,"context_line":"        super(NoDBTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxQ%3D","line":313,"updated":"2013-12-01 12:59:30.000000000","message":"can you please explain why we need this?","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    \"\"\""},{"line_number":311,"context_line":"    USES_DB \u003d False"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def setUp(self):"},{"line_number":314,"context_line":"        super(NoDBTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BFtA%3D","line":313,"in_reply_to":"AAAATn%2F%2BJxQ%3D","updated":"2013-12-02 22:48:06.000000000","message":"we don\u0027t, removed.","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"}],"nova/tests/compute/test_compute_api.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"34519e742dcaff29b0d35185c5c7c5c7edde4841","unresolved":false,"context_lines":[{"line_number":532,"context_line":""},{"line_number":533,"context_line":"        self.mox.ReplayAll()"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        self.assertRaises(test.TestingException,"},{"line_number":536,"context_line":"                          self.compute_api.soft_delete, self.context, inst)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def test_is_volume_backed_being_true_if_root_is_block_device(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2F3ZM%3D","line":535,"updated":"2013-08-28 17:28:17.000000000","message":"should this be a separate patch?","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"97aa555ad991ecd509c8d71f29e2d1a637f6b0a7","unresolved":false,"context_lines":[{"line_number":532,"context_line":""},{"line_number":533,"context_line":"        self.mox.ReplayAll()"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        self.assertRaises(test.TestingException,"},{"line_number":536,"context_line":"                          self.compute_api.soft_delete, self.context, inst)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def test_is_volume_backed_being_true_if_root_is_block_device(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2F3HY%3D","line":535,"in_reply_to":"AAAASn%2F%2F3ZM%3D","updated":"2013-08-28 19:56:02.000000000","message":"I was trying to make a commit depending on another patch that implemented this change but made a mistake during the submission. That patch has now been merged into master so this will be fixed in my next commit.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"}],"nova/tests/virt/libvirt/fake_imagebackend.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        # snapshot tests in test_libvirt.LibvirtConnTestCase"},{"line_number":58,"context_line":"        return imagebackend.Backend(True).snapshot(instance,"},{"line_number":59,"context_line":"            disk_path,"},{"line_number":60,"context_line":"            image_type)"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNrE%3D","line":60,"updated":"2014-02-14 20:25:41.000000000","message":"I\u0027d call this with image_type\u003dimage_type since it\u0027s a keyword argument.  Works either way, but more future-proof that way.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        # snapshot tests in test_libvirt.LibvirtConnTestCase"},{"line_number":58,"context_line":"        return imagebackend.Backend(True).snapshot(instance,"},{"line_number":59,"context_line":"            disk_path,"},{"line_number":60,"context_line":"            image_type)"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNlE%3D","line":60,"in_reply_to":"AAAAUX%2F%2FNrE%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"}],"nova/tests/virt/libvirt/fake_libvirt_utils.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def cryptsetup(target, device, cipher, key_size, key):"},{"line_number":106,"context_line":"    pass"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def get_disk_backing_file(path):"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxM%3D","line":106,"updated":"2013-12-01 12:59:30.000000000","message":"there should be tests that validate the parameters passed","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def cryptsetup(target, device, cipher, key_size, key):"},{"line_number":106,"context_line":"    pass"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def get_disk_backing_file(path):"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BEjs%3D","line":106,"in_reply_to":"AAAATn%2F%2BJxM%3D","updated":"2013-12-02 22:48:06.000000000","message":"working on this","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"}],"nova/tests/virt/libvirt/test_driver.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":3635,"context_line":"        self.assertEqual(snapshot[\u0027name\u0027], snapshot_name)"},{"line_number":3636,"context_line":""},{"line_number":3637,"context_line":"    def test_lvm_snapshot_in_raw_format(self):"},{"line_number":3638,"context_line":"        \"\"\"Tests Lvm backend snapshot functionality with raw format"},{"line_number":3639,"context_line":"           snapshots."},{"line_number":3640,"context_line":"        \"\"\""},{"line_number":3641,"context_line":"        xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_d85bd351","line":3638,"updated":"2014-09-05 19:45:51.000000000","message":"just FYI, try to avoid docstrings on test case methods (use # comments instead), because for most test runners, it replaces the method name with the docstring which inevitably gets truncated for longer strings like this, which means the test output becomes indecipherable. :)","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":3635,"context_line":"        self.assertEqual(snapshot[\u0027name\u0027], snapshot_name)"},{"line_number":3636,"context_line":""},{"line_number":3637,"context_line":"    def test_lvm_snapshot_in_raw_format(self):"},{"line_number":3638,"context_line":"        \"\"\"Tests Lvm backend snapshot functionality with raw format"},{"line_number":3639,"context_line":"           snapshots."},{"line_number":3640,"context_line":"        \"\"\""},{"line_number":3641,"context_line":"        xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_334de09a","line":3638,"in_reply_to":"fa98f980_d85bd351","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":3706,"context_line":"        self.assertEqual(snapshot[\u0027properties\u0027][\u0027image_state\u0027], \u0027available\u0027)"},{"line_number":3707,"context_line":"        self.assertEqual(snapshot[\u0027status\u0027], \u0027active\u0027)"},{"line_number":3708,"context_line":"        self.assertEqual(snapshot[\u0027disk_format\u0027], \u0027raw\u0027)"},{"line_number":3709,"context_line":"        self.assertEqual(snapshot[\u0027name\u0027], snapshot_name)"},{"line_number":3710,"context_line":"        # This is for all the subsequent tests that do not set the value of"},{"line_number":3711,"context_line":"        # images type"},{"line_number":3712,"context_line":"        self.flags(images_type\u003d\u0027default\u0027, group\u003d\u0027libvirt\u0027)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_b3155041","line":3709,"updated":"2014-09-05 19:45:51.000000000","message":"nits: Remember assertEqual()\u0027s arguments are (expected, actual), not the other way around. It affects the failure message displayed by the testtools matcher for assertEqual().\n\nOverall, excellent work on this test case, though. Well done.","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":3706,"context_line":"        self.assertEqual(snapshot[\u0027properties\u0027][\u0027image_state\u0027], \u0027available\u0027)"},{"line_number":3707,"context_line":"        self.assertEqual(snapshot[\u0027status\u0027], \u0027active\u0027)"},{"line_number":3708,"context_line":"        self.assertEqual(snapshot[\u0027disk_format\u0027], \u0027raw\u0027)"},{"line_number":3709,"context_line":"        self.assertEqual(snapshot[\u0027name\u0027], snapshot_name)"},{"line_number":3710,"context_line":"        # This is for all the subsequent tests that do not set the value of"},{"line_number":3711,"context_line":"        # images type"},{"line_number":3712,"context_line":"        self.flags(images_type\u003d\u0027default\u0027, group\u003d\u0027libvirt\u0027)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_f3043819","line":3709,"in_reply_to":"fa98f980_b3155041","updated":"2014-09-05 20:32:35.000000000","message":"Thank you.","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"}],"nova/tests/virt/libvirt/test_image_utils.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from nova.virt import images"},{"line_number":25,"context_line":"from nova.virt.libvirt import utils as libvirt_utils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImageUtilsTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxI%3D","line":27,"updated":"2013-12-01 12:59:30.000000000","message":"this is not used","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from nova.virt import images"},{"line_number":25,"context_line":"from nova.virt.libvirt import utils as libvirt_utils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImageUtilsTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BEjo%3D","line":27,"in_reply_to":"AAAATn%2F%2BJxI%3D","updated":"2013-12-02 22:48:06.000000000","message":"removed.","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"}],"nova/tests/virt/libvirt/test_imagebackend.py":[{"author":{"_account_id":6593,"name":"Dirk Mueller","email":"dirk@dmllr.de","username":"dmllr"},"change_message_id":"3d96f75adad71176aacac8ebc545b89326171a43","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.dmcrypt \u003d imagebackend.dmcrypt"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def prepare_mocks(self):"},{"line_number":547,"context_line":"        fn \u003d self.mox.CreateMockAnything()"},{"line_number":548,"context_line":"        self.mox.StubOutWithMock(self.disk, \u0027resize2fs\u0027)"},{"line_number":549,"context_line":"        self.mox.StubOutWithMock(self.dmcrypt, \u0027create_volume\u0027)"},{"line_number":550,"context_line":"        self.mox.StubOutWithMock(self.dmcrypt, \u0027delete_volume\u0027)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAUH%2F%2B8Jg%3D","line":547,"updated":"2014-01-20 15:35:14.000000000","message":"can we possibly use mock instead of mox? the general trend should be towards \"mock\".","commit_id":"3c843aaede3214c8be5b729f35e92277d2381aa2"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"793e27ac26a41df0bfb0bf12ef5fbdd3d39ddb9e","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.dmcrypt \u003d imagebackend.dmcrypt"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def prepare_mocks(self):"},{"line_number":547,"context_line":"        fn \u003d self.mox.CreateMockAnything()"},{"line_number":548,"context_line":"        self.mox.StubOutWithMock(self.disk, \u0027resize2fs\u0027)"},{"line_number":549,"context_line":"        self.mox.StubOutWithMock(self.dmcrypt, \u0027create_volume\u0027)"},{"line_number":550,"context_line":"        self.mox.StubOutWithMock(self.dmcrypt, \u0027delete_volume\u0027)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAUH%2F%2B7%2Fk%3D","line":547,"in_reply_to":"AAAAUH%2F%2B8Jg%3D","updated":"2014-01-20 15:55:41.000000000","message":"I was following the pattern established for testing in test_imagebackend but I will try to convert these tests to mock.","commit_id":"3c843aaede3214c8be5b729f35e92277d2381aa2"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"08422da01a5592c1f0d0f2ba1cc6a9677b23f5db","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import fixtures"},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import contextlib"},{"line_number":24,"context_line":"import inspect"},{"line_number":25,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":64,"id":"AAAAUH%2F%2BQok%3D","line":22,"updated":"2014-01-28 16:00:34.000000000","message":"looks like an extra newline here","commit_id":"864d95295521582120159b23b2e4fcc81537d121"},{"author":{"_account_id":8623,"name":"Kaitlin Farr","email":"kaitlin.farr@jhuapl.edu","username":"kaitlin.farr"},"change_message_id":"f748dca3119bac5df977a191f68abc87dd7e37bc","unresolved":false,"context_lines":[{"line_number":517,"context_line":"    VG \u003d \u0027FakeVG\u0027"},{"line_number":518,"context_line":"    TEMPLATE_SIZE \u003d 512"},{"line_number":519,"context_line":"    SIZE \u003d 1024"},{"line_number":520,"context_line":"    KEY_SIZE \u003d 512"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def setUp(self):"},{"line_number":523,"context_line":"        super(EncryptedLvmTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":68,"id":"AAAAUH%2F90mg%3D","line":520,"updated":"2014-02-03 16:28:49.000000000","message":"Is this variable being used?","commit_id":"3c9ab57d3ac08c3a090ee350b52219ee5ce727a3"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"8f7608a6d934d14c39d197b6b78cbbdafc78b313","unresolved":false,"context_lines":[{"line_number":517,"context_line":"    VG \u003d \u0027FakeVG\u0027"},{"line_number":518,"context_line":"    TEMPLATE_SIZE \u003d 512"},{"line_number":519,"context_line":"    SIZE \u003d 1024"},{"line_number":520,"context_line":"    KEY_SIZE \u003d 512"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"    def setUp(self):"},{"line_number":523,"context_line":"        super(EncryptedLvmTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":68,"id":"AAAAUH%2F90dU%3D","line":520,"in_reply_to":"AAAAUH%2F90mg%3D","updated":"2014-02-03 16:43:48.000000000","message":"Not anymore. Thank you for catching this.","commit_id":"3c9ab57d3ac08c3a090ee350b52219ee5ce727a3"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"},{"line_number":24,"context_line":"from nova import context"},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import keymgr"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNuA%3D","line":23,"updated":"2014-02-14 20:25:41.000000000","message":"need a newline here between 3rd party and nova imports","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"},{"line_number":24,"context_line":"from nova import context"},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import keymgr"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNkw%3D","line":23,"in_reply_to":"AAAAUX%2F%2FNuA%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":514,"context_line":"class EncryptedLvmTestCase(_ImageTestCase, test.TestCase):"},{"line_number":515,"context_line":"    VG \u003d \u0027FakeVG\u0027"},{"line_number":516,"context_line":"    TEMPLATE_SIZE \u003d 512"},{"line_number":517,"context_line":"    SIZE \u003d 1024"},{"line_number":518,"context_line":"    KEY_SIZE \u003d 512"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNtc%3D","line":517,"updated":"2014-02-14 20:25:41.000000000","message":"I\u0027m not sure if you want to use units.Ki here or not, but it\u0027s worth thinking about.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":514,"context_line":"class EncryptedLvmTestCase(_ImageTestCase, test.TestCase):"},{"line_number":515,"context_line":"    VG \u003d \u0027FakeVG\u0027"},{"line_number":516,"context_line":"    TEMPLATE_SIZE \u003d 512"},{"line_number":517,"context_line":"    SIZE \u003d 1024"},{"line_number":518,"context_line":"    KEY_SIZE \u003d 512"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNkY%3D","line":517,"in_reply_to":"AAAAUX%2F%2FNtc%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":810,"context_line":"                        self.dmcrypt.delete_volume.assert_called_with("},{"line_number":811,"context_line":"                            self.PATH.rpartition(\u0027/\u0027)[2])"},{"line_number":812,"context_line":"                        self.libvirt_utils.remove_logical_volumes.\\"},{"line_number":813,"context_line":"                                assert_called_with("},{"line_number":814,"context_line":"                            self.LV_PATH)"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def test_create_image_generated_encrypt_negative(self):"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNsI%3D","line":813,"updated":"2014-02-14 20:25:41.000000000","message":"I think this would look better without the newline here","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":810,"context_line":"                        self.dmcrypt.delete_volume.assert_called_with("},{"line_number":811,"context_line":"                            self.PATH.rpartition(\u0027/\u0027)[2])"},{"line_number":812,"context_line":"                        self.libvirt_utils.remove_logical_volumes.\\"},{"line_number":813,"context_line":"                                assert_called_with("},{"line_number":814,"context_line":"                            self.LV_PATH)"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def test_create_image_generated_encrypt_negative(self):"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNkM%3D","line":813,"in_reply_to":"AAAAUX%2F%2FNsI%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":845,"context_line":"                        self.dmcrypt.delete_volume.assert_called_with("},{"line_number":846,"context_line":"                            self.PATH.rpartition(\u0027/\u0027)[2])"},{"line_number":847,"context_line":"                        self.libvirt_utils.remove_logical_volumes.\\"},{"line_number":848,"context_line":"                                assert_called_with("},{"line_number":849,"context_line":"                            self.LV_PATH)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"    def test_prealloc_image(self):"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNsE%3D","line":848,"updated":"2014-02-14 20:25:41.000000000","message":"I don\u0027t like the newline here either.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":845,"context_line":"                        self.dmcrypt.delete_volume.assert_called_with("},{"line_number":846,"context_line":"                            self.PATH.rpartition(\u0027/\u0027)[2])"},{"line_number":847,"context_line":"                        self.libvirt_utils.remove_logical_volumes.\\"},{"line_number":848,"context_line":"                                assert_called_with("},{"line_number":849,"context_line":"                            self.LV_PATH)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"    def test_prealloc_image(self):"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNkA%3D","line":848,"in_reply_to":"AAAAUX%2F%2FNsE%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5ed69b12ca785ca6486cc360cd2f1bba1bb60d4","unresolved":false,"context_lines":[{"line_number":515,"context_line":"class EncryptedLvmTestCase(_ImageTestCase, test.TestCase):"},{"line_number":516,"context_line":"    VG \u003d \u0027FakeVG\u0027"},{"line_number":517,"context_line":"    TEMPLATE_SIZE \u003d 512"},{"line_number":518,"context_line":"    SIZE \u003d 1024"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def setUp(self):"},{"line_number":521,"context_line":"        super(EncryptedLvmTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2B0nI%3D","line":518,"updated":"2014-02-18 20:06:01.000000000","message":"Prior comment from David Ripton (patch set 70) does not appear to have been addressed.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"309f5119da0c302957bbfb21d71b1351e18cb473","unresolved":false,"context_lines":[{"line_number":515,"context_line":"class EncryptedLvmTestCase(_ImageTestCase, test.TestCase):"},{"line_number":516,"context_line":"    VG \u003d \u0027FakeVG\u0027"},{"line_number":517,"context_line":"    TEMPLATE_SIZE \u003d 512"},{"line_number":518,"context_line":"    SIZE \u003d 1024"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def setUp(self):"},{"line_number":521,"context_line":"        super(EncryptedLvmTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2Bt70%3D","line":518,"in_reply_to":"AAAAUX%2F%2B0nI%3D","updated":"2014-02-19 15:58:38.000000000","message":"I have thought about changing this to units.Ki but it would be hard to do the same for TEMPLATE_SIZE and keep it an integer. So there there would be a hodgepodge of unit-ed and ununit-ed constants. The numbers themselves could be changed but this will break the test pattern established for other backends, which also seems a poor choice.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"3a94ef0d1ff7ee4f52c2ec0ff4f19e128cbbd280","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import fixtures"},{"line_number":19,"context_line":"from oslo.config import cfg"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":76,"id":"AAAAVX%2F%2Ft4A%3D","line":20,"updated":"2014-02-28 20:01:34.000000000","message":"these 5 third-party imports should all be in one block, not two","commit_id":"bedb0628ebdc96881d9dcc7b4d615694930f5dcd"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ba462254f8078ffb771296462a10c8618494021a","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import fixtures"},{"line_number":19,"context_line":"from oslo.config import cfg"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":76,"id":"AAAAVX%2F%2FtzE%3D","line":20,"in_reply_to":"AAAAVX%2F%2Ft4A%3D","updated":"2014-03-03 14:49:12.000000000","message":"Will do in the next patch.","commit_id":"bedb0628ebdc96881d9dcc7b4d615694930f5dcd"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"5e27109c9ce80f2c1b059646de763c03c2c46b39","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"},{"line_number":24,"context_line":"from nova import context"},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import keymgr"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2F2p0%3D","line":23,"updated":"2014-03-03 19:43:58.000000000","message":"these three imports should be in the same block with contextlib/inspect/mock, with a newline separating them from the nova imports.  The pep8 check should have caught that.","commit_id":"ddcd10bfe50e13dc171938d46e9ec23452901931"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"78720768f7a31b8f9ffdd1634922a142ae1cbc8d","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"},{"line_number":24,"context_line":"from nova import context"},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import keymgr"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2F2cA%3D","line":23,"in_reply_to":"AAAAVn%2F%2F2ek%3D","updated":"2014-03-03 20:00:11.000000000","message":"No, Gerrit is fine, I misread your comment.","commit_id":"ddcd10bfe50e13dc171938d46e9ec23452901931"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"0353be6e2467698a0dd2a4a18f2bde2a3d75f2db","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"},{"line_number":24,"context_line":"from nova import context"},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import keymgr"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2F2ek%3D","line":23,"in_reply_to":"AAAAVn%2F%2F2jg%3D","updated":"2014-03-03 19:56:30.000000000","message":"They are.  Should be stdlib imports, blank line, 3rd part imports, blank line, nova imports.\n\nIf it\u0027s like that and Gerrit is just lying to me, then please disregard.  pep8 job will catch some of these problems anyway.","commit_id":"ddcd10bfe50e13dc171938d46e9ec23452901931"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"eb25baf030db4ba9cfadc0e3ecc1009edf02a80c","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import contextlib"},{"line_number":22,"context_line":"import inspect"},{"line_number":23,"context_line":"import mock"},{"line_number":24,"context_line":"from nova import context"},{"line_number":25,"context_line":"from nova import exception"},{"line_number":26,"context_line":"from nova import keymgr"}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2F2jg%3D","line":23,"in_reply_to":"AAAAVn%2F%2F2p0%3D","updated":"2014-03-03 19:54:36.000000000","message":"I removed the wrong blank line then:) I thought nova imports were supposed to be separated from the rest.","commit_id":"ddcd10bfe50e13dc171938d46e9ec23452901931"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"a3e752b40735c84651026e1946fc27bfb67f38ca","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import shutil"},{"line_number":18,"context_line":"import tempfile"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import fixtures"},{"line_number":21,"context_line":"from oslo.config import cfg"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import contextlib"},{"line_number":24,"context_line":"import inspect"},{"line_number":25,"context_line":"import mock"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova import context"},{"line_number":28,"context_line":"from nova import exception"}],"source_content_type":"text/x-python","patch_set":87,"id":"7ac7a964_f3ceaa82","line":25,"range":{"start_line":16,"start_character":0,"end_line":25,"end_character":11},"updated":"2014-08-15 09:00:01.000000000","message":"Should be like this:\n    import contextlib\n    import inspect\n    import os\n    import shutil\n    import tempfile\n\n    import fixtures\n    import mock\n    from oslo.config import cfg","commit_id":"0cc1482b0f874d78399dfb0c0b06eebf0b7473c4"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"6e95a9cd6894b04509777427b495c6fa63a7910e","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import contextlib"},{"line_number":24,"context_line":"import inspect"},{"line_number":25,"context_line":"import mock"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova import context"},{"line_number":28,"context_line":"from nova import exception"}],"source_content_type":"text/x-python","patch_set":87,"id":"7ac7a964_5be849b4","line":25,"in_reply_to":"7ac7a964_f3ceaa82","updated":"2014-08-15 15:55:40.000000000","message":"Done","commit_id":"0cc1482b0f874d78399dfb0c0b06eebf0b7473c4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":748,"context_line":"                mock.patch.object(self.libvirt_utils, \u0027create_lvm_image\u0027,"},{"line_number":749,"context_line":"                               mock.Mock()),"},{"line_number":750,"context_line":"                mock.patch.object(self.libvirt_utils, \u0027remove_logical_volumes\u0027,"},{"line_number":751,"context_line":"                                   mock.Mock()),"},{"line_number":752,"context_line":"                mock.patch.object(self.utils, \u0027execute\u0027, mock.Mock())):"},{"line_number":753,"context_line":"            fn \u003d mock.Mock()"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_f38ef877","line":751,"updated":"2014-09-05 19:45:51.000000000","message":"nits: here and throughout this file.. alignment of the mock.Mock(\u0027s are off.","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":748,"context_line":"                mock.patch.object(self.libvirt_utils, \u0027create_lvm_image\u0027,"},{"line_number":749,"context_line":"                               mock.Mock()),"},{"line_number":750,"context_line":"                mock.patch.object(self.libvirt_utils, \u0027remove_logical_volumes\u0027,"},{"line_number":751,"context_line":"                                   mock.Mock()),"},{"line_number":752,"context_line":"                mock.patch.object(self.utils, \u0027execute\u0027, mock.Mock())):"},{"line_number":753,"context_line":"            fn \u003d mock.Mock()"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_dee49b0e","line":751,"in_reply_to":"fa98f980_f38ef877","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                   mock.Mock()),"},{"line_number":854,"context_line":"                mock.patch.object(self.utils, \u0027execute\u0027, mock.Mock())):"},{"line_number":855,"context_line":"            fn \u003d mock.Mock()"},{"line_number":856,"context_line":"            self.lvm.create_volume.side_effect \u003d\\"},{"line_number":857,"context_line":"                RuntimeError()"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            image \u003d self.image_class(self.INSTANCE, self.NAME)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_5388a470","line":856,"updated":"2014-09-05 19:45:51.000000000","message":"pretty sure there\u0027s no need for the \\ above :)","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":853,"context_line":"                                   mock.Mock()),"},{"line_number":854,"context_line":"                mock.patch.object(self.utils, \u0027execute\u0027, mock.Mock())):"},{"line_number":855,"context_line":"            fn \u003d mock.Mock()"},{"line_number":856,"context_line":"            self.lvm.create_volume.side_effect \u003d\\"},{"line_number":857,"context_line":"                RuntimeError()"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"            image \u003d self.image_class(self.INSTANCE, self.NAME)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_fec6bf66","line":856,"in_reply_to":"fa98f980_5388a470","updated":"2014-09-05 20:32:35.000000000","message":"refactor bug","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"            self.lvm.remove_volumes.assert_called_with(self.LV_PATH)"},{"line_number":1018,"context_line":""},{"line_number":1019,"context_line":"    def test_prealloc_image(self):"},{"line_number":1020,"context_line":"        CONF.set_override(\u0027preallocate_images\u0027, \u0027space\u0027)"},{"line_number":1021,"context_line":"        fake_processutils.fake_execute_clear_log()"},{"line_number":1022,"context_line":"        fake_processutils.stub_out_processutils_execute(self.stubs)"},{"line_number":1023,"context_line":"        image \u003d self.image_class(self.INSTANCE, self.NAME)"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_d3c1f480","line":1020,"updated":"2014-09-05 19:45:51.000000000","message":"Please use self.flag() instead of the CONF.set_override()","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"}],"nova/virt/driver.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"285667d1b49bf890fe6a64cc11f30a3c31ce3e99","unresolved":false,"context_lines":[{"line_number":56,"context_line":"               default\u003d\u0027aes-xts-plain\u0027,"},{"line_number":57,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":58,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":59,"context_line":"    cfg.StrOpt(\u0027encrypt_ephemeral_storage_key_size\u0027,"},{"line_number":60,"context_line":"               default\u003d\u0027256\u0027,"},{"line_number":61,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":62,"context_line":"                    \u0027encrypt ephemeral storage\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARH%2F%2F5nk%3D","line":59,"updated":"2013-08-15 14:57:23.000000000","message":"Shouldn\u0027t this be an IntOpt rather than a StrOpt?","commit_id":"dd229a482fd3734d873412a8247a02e3552d675e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                default\u003dFalse,"},{"line_number":54,"context_line":"                help\u003d\u0027Whether to encrypt ephemeral storage\u0027),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027encrypt_ephemeral_storage_cipher\u0027,"},{"line_number":56,"context_line":"               default\u003d\u0027aes-xts-plain\u0027,"},{"line_number":57,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":58,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027encrypt_ephemeral_storage_key_size\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzMs%3D","line":56,"updated":"2013-08-29 13:24:49.000000000","message":"Quoting from the cryptsetup FAQs, \"[...] aes-xts-plain should not be used for encrypted container sizes larger than 2TiB. Use aes-xts-plain64 for that.\" (https://code.google.com/p/cryptsetup/wiki/FrequentlyAskedQuestions).\n\nI don\u0027t think that there\u0027s any reason against using \u0027aes-xts-plain64\u0027 as the default.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                default\u003dFalse,"},{"line_number":54,"context_line":"                help\u003d\u0027Whether to encrypt ephemeral storage\u0027),"},{"line_number":55,"context_line":"    cfg.StrOpt(\u0027encrypt_ephemeral_storage_cipher\u0027,"},{"line_number":56,"context_line":"               default\u003d\u0027aes-xts-plain\u0027,"},{"line_number":57,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":58,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027encrypt_ephemeral_storage_key_size\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2Fy3s%3D","line":56,"in_reply_to":"AAAASn%2F%2FzMs%3D","updated":"2013-08-29 20:31:01.000000000","message":"Done","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":58,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027encrypt_ephemeral_storage_key_size\u0027,"},{"line_number":60,"context_line":"               default\u003d256,"},{"line_number":61,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":62,"context_line":"                    \u0027encrypt ephemeral storage\u0027)"},{"line_number":63,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzM0%3D","line":60,"updated":"2013-08-29 13:24:49.000000000","message":"XTS mode in cryptsetup uses only half the key for encryption (the other half is used for the tweak factor). Hence, the key size should be 512 if 256-bit encryption is desired.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":58,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":59,"context_line":"    cfg.IntOpt(\u0027encrypt_ephemeral_storage_key_size\u0027,"},{"line_number":60,"context_line":"               default\u003d256,"},{"line_number":61,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":62,"context_line":"                    \u0027encrypt ephemeral storage\u0027)"},{"line_number":63,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2Fy3o%3D","line":60,"in_reply_to":"AAAASn%2F%2FzM0%3D","updated":"2013-08-29 20:31:01.000000000","message":"Done","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8f1b77e0421e8c6f9c5f39601a9c9208d5ced7b7","unresolved":false,"context_lines":[{"line_number":45,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":46,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027key_size\u0027,"},{"line_number":48,"context_line":"               default\u003d512,"},{"line_number":49,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":50,"context_line":"                    \u0027encrypt ephemeral storage\u0027)"},{"line_number":51,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAASn%2F%2FunQ%3D","line":48,"updated":"2013-08-30 10:48:53.000000000","message":"Might want a comment to the effect of only half the bits being used for the encryption key when using XTS mode.","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"96824f097b5b7fb3e0ff1064a901bc422a55e6d9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"               help\u003d\u0027The cipher and mode to be used to encrypt \u0027"},{"line_number":46,"context_line":"                    \u0027ephemeral storage\u0027),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027key_size\u0027,"},{"line_number":48,"context_line":"               default\u003d512,"},{"line_number":49,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":50,"context_line":"                    \u0027encrypt ephemeral storage\u0027)"},{"line_number":51,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAASn%2F%2Ft74%3D","line":48,"in_reply_to":"AAAASn%2F%2FunQ%3D","updated":"2013-08-30 14:32:35.000000000","message":"Done","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c30f8f4dd2236b8f6498db852952c4bacba1686e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               default\u003d512,"},{"line_number":51,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":52,"context_line":"                    \u0027encrypt ephemeral storage (in XTS mode only half of \u0027"},{"line_number":53,"context_line":"                    \u0027the bits are used for encryption key)\u0027)"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"driver_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2Fcs4%3D","line":53,"updated":"2013-11-06 01:35:09.000000000","message":"Do we really need to add these cipher/key_size conf parameters. We have far too many config options in Nova already, so we really need to put thought into whether each new option is really compelling or not. IMHO using the kernel defaults is sufficient.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f4b363e9ee8f8072d9401cdd2f55742fb6feacf1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               default\u003d512,"},{"line_number":51,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":52,"context_line":"                    \u0027encrypt ephemeral storage (in XTS mode only half of \u0027"},{"line_number":53,"context_line":"                    \u0027the bits are used for encryption key)\u0027)"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"driver_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FBjs%3D","line":53,"in_reply_to":"AAAATn%2F%2FOU4%3D","updated":"2013-11-15 14:46:25.000000000","message":"Ok, I withdraw my objections here.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"a3eb1e5c3fad79054024440606406b4f9f06ab8b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               default\u003d512,"},{"line_number":51,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":52,"context_line":"                    \u0027encrypt ephemeral storage (in XTS mode only half of \u0027"},{"line_number":53,"context_line":"                    \u0027the bits are used for encryption key)\u0027)"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"driver_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FOU4%3D","line":53,"in_reply_to":"AAAATn%2F%2FbJ4%3D","updated":"2013-11-12 16:40:58.000000000","message":"There are also instances where compliance might dictate particular ciphers or key sizes. The default value could be the same as the kernel\u0027s, but the ability to change the parameters is important in some domains.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"69d73c13a600c20b41d50401dfcc44b2aa19f11c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               default\u003d512,"},{"line_number":51,"context_line":"               help\u003d\u0027The bit length of the encryption key to be used to \u0027"},{"line_number":52,"context_line":"                    \u0027encrypt ephemeral storage (in XTS mode only half of \u0027"},{"line_number":53,"context_line":"                    \u0027the bits are used for encryption key)\u0027)"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"driver_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FbJ4%3D","line":53,"in_reply_to":"AAAATn%2F%2Fcs4%3D","updated":"2013-11-06 14:36:21.000000000","message":"There is a trade-off between execution speed and strength of encryption which, I think, it makes sense to leave to the operator. Defaulting to kernel settings seems unnecessarily restrictive.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"}],"nova/virt/libvirt/dmcrypt.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def is_encrypted(path):"},{"line_number":33,"context_line":"    \"\"\"Returns true if the path corresponds to an encrypted disk.\"\"\""},{"line_number":34,"context_line":"    if path.startswith(\u0027/dev/mapper\u0027):"},{"line_number":35,"context_line":"        return path.rpartition(\u0027/\u0027)[2].endswith(_dmcrypt_suffix)"},{"line_number":36,"context_line":"    else:"},{"line_number":37,"context_line":"        return False"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz6k%3D","line":35,"updated":"2014-03-04 00:49:52.000000000","message":"It\u0027s really hard for me to look at this and know if it\u0027s right or not. I\u0027m guessing this is looking at something like /dev/mapper/$foo to make sure that $foo ends with that suffix. Could you do something like this:\n\n  dev, mapper, target \u003d path.split(\u0027/\u0027, 2)\n  return target.endswith(_dmcrypt_suffix) and \u0027/\u0027 not in target\n\nWould hate to have something be confused because I did this:\n\n  mkdir /dev/mapper/foo.$suffix\n  touch /dev/mapper/foo.$suffix/bar\n\nRight? With what you have here, you might as well say:\n\n  return (\"%s/\" % _dmcrypt_suffix) in path\n\nWhich I don\u0027t think is what you\u0027re aiming for.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def is_encrypted(path):"},{"line_number":33,"context_line":"    \"\"\"Returns true if the path corresponds to an encrypted disk.\"\"\""},{"line_number":34,"context_line":"    if path.startswith(\u0027/dev/mapper\u0027):"},{"line_number":35,"context_line":"        return path.rpartition(\u0027/\u0027)[2].endswith(_dmcrypt_suffix)"},{"line_number":36,"context_line":"    else:"},{"line_number":37,"context_line":"        return False"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fttg%3D","line":35,"in_reply_to":"AAAAVn%2F%2Fz6k%3D","updated":"2014-03-04 15:14:25.000000000","message":"There is actually some reason behind this madness. Doing this \n\ndev, mapper, target \u003d path.split(\u0027/\u0027, 2)\n\nassumes that the path has at least three components. If the path happens to be \u0027foo\u0027 or even \u0027foo/bar\u0027 the above will fail. That\u0027s why I used rpartition only after checking that there is at least one \u0027/\u0027 in the path. Implementing your suggestion would also require checking that dev\u003d\u003d\u0027dev\u0027 and mapper\u003d\u003d\u0027mapper\u0027 so it would have to be\n\nreturn target.endswith(_dmcrypt_suffix) and dev\u003d\u003d\u0027dev\u0027 and mapper\u003d\u003d\u0027mapper\u0027 and \u0027/\u0027 not in target\n\nwhich at least to my eye seems much less clear than the original.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"285667d1b49bf890fe6a64cc11f30a3c31ce3e99","unresolved":false,"context_lines":[{"line_number":1304,"context_line":"        if self.has_min_version(MIN_LIBVIRT_LIVESNAPSHOT_VERSION,"},{"line_number":1305,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1306,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT) \\"},{"line_number":1307,"context_line":"                and not source_format \u003d\u003d \"lvm\" \\"},{"line_number":1308,"context_line":"                and not CONF.encrypt_ephemeral_storage:"},{"line_number":1309,"context_line":"            live_snapshot \u003d True"},{"line_number":1310,"context_line":"            # Abort is an idempotent operation, so make sure any block"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARH%2F%2F5nM%3D","line":1307,"updated":"2013-08-15 14:57:23.000000000","message":"Parens would be prettier than backslashes here, though it doesn\u0027t *really* matter.","commit_id":"dd229a482fd3734d873412a8247a02e3552d675e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":1946,"context_line":"        LOG.info(_(\u0027Creating image\u0027), instance\u003dinstance)"},{"line_number":1947,"context_line":"        if CONF.encrypt_ephemeral_storage:"},{"line_number":1948,"context_line":"            if CONF.libvirt_images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1949,"context_line":"                key_manager \u003d keymgr.API()"},{"line_number":1950,"context_line":"                key_uuid \u003d key_manager.create_key(context,"},{"line_number":1951,"context_line":"                    algorithm\u003dCONF.encrypt_ephemeral_storage_cipher,"},{"line_number":1952,"context_line":"                    length\u003dCONF.encrypt_ephemeral_storage_key_size)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzJw%3D","line":1949,"updated":"2013-08-29 13:24:49.000000000","message":"Better to initialize the key manager in __init__ rather than creating it here.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":1946,"context_line":"        LOG.info(_(\u0027Creating image\u0027), instance\u003dinstance)"},{"line_number":1947,"context_line":"        if CONF.encrypt_ephemeral_storage:"},{"line_number":1948,"context_line":"            if CONF.libvirt_images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1949,"context_line":"                key_manager \u003d keymgr.API()"},{"line_number":1950,"context_line":"                key_uuid \u003d key_manager.create_key(context,"},{"line_number":1951,"context_line":"                    algorithm\u003dCONF.encrypt_ephemeral_storage_cipher,"},{"line_number":1952,"context_line":"                    length\u003dCONF.encrypt_ephemeral_storage_key_size)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2Fy3g%3D","line":1949,"in_reply_to":"AAAASn%2F%2FzJw%3D","updated":"2013-08-29 20:31:01.000000000","message":"Done","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":1951,"context_line":"                    algorithm\u003dCONF.encrypt_ephemeral_storage_cipher,"},{"line_number":1952,"context_line":"                    length\u003dCONF.encrypt_ephemeral_storage_key_size)"},{"line_number":1953,"context_line":"                encryption_key \u003d \\"},{"line_number":1954,"context_line":"                    key_manager.get_key(context, key_uuid).get_encoded()"},{"line_number":1955,"context_line":"            else:"},{"line_number":1956,"context_line":"                LOG.info(_(\u0027Ephemeral storage encryption is currently \u0027"},{"line_number":1957,"context_line":"                           \u0027supported only for LVM storage backend. Ephemeral \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzDg%3D","line":1954,"updated":"2013-08-29 13:24:49.000000000","message":"I\u0027d prefer to limit access to the raw key as much as possible, but this code can always be refactored later.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":1953,"context_line":"                encryption_key \u003d \\"},{"line_number":1954,"context_line":"                    key_manager.get_key(context, key_uuid).get_encoded()"},{"line_number":1955,"context_line":"            else:"},{"line_number":1956,"context_line":"                LOG.info(_(\u0027Ephemeral storage encryption is currently \u0027"},{"line_number":1957,"context_line":"                           \u0027supported only for LVM storage backend. Ephemeral \u0027"},{"line_number":1958,"context_line":"                           \u0027storage will not be encrypted.\u0027))"},{"line_number":1959,"context_line":"                encryption_key \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzJU%3D","line":1956,"updated":"2013-08-29 13:24:49.000000000","message":"I think a warning is more reasonable.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":1953,"context_line":"                encryption_key \u003d \\"},{"line_number":1954,"context_line":"                    key_manager.get_key(context, key_uuid).get_encoded()"},{"line_number":1955,"context_line":"            else:"},{"line_number":1956,"context_line":"                LOG.info(_(\u0027Ephemeral storage encryption is currently \u0027"},{"line_number":1957,"context_line":"                           \u0027supported only for LVM storage backend. Ephemeral \u0027"},{"line_number":1958,"context_line":"                           \u0027storage will not be encrypted.\u0027))"},{"line_number":1959,"context_line":"                encryption_key \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2Fy3Y%3D","line":1956,"in_reply_to":"AAAASn%2F%2FzJU%3D","updated":"2013-08-29 20:31:01.000000000","message":"Done","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"a20ad1155ec357d16550c6c260111386c2b0fe7a","unresolved":false,"context_lines":[{"line_number":944,"context_line":""},{"line_number":945,"context_line":"    def _cleanup_lvm(self, instance):"},{"line_number":946,"context_line":"        \"\"\"Delete all LVM disks for given instance object.\"\"\""},{"line_number":947,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":948,"context_line":"            disks \u003d self._lvm_encrypted_disks(instance)"},{"line_number":949,"context_line":"            LOG.info(_(\"Removing encrypted disks : %s\"), str(disks))"},{"line_number":950,"context_line":"            if disks:"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAASn%2F%2FOJ0%3D","line":947,"updated":"2013-09-09 19:05:40.000000000","message":"Is it possible to infer if a VM was created with ephemeral_storage_encryption.enabled?  Otherwise if someone turns this on or off while some VMs are running deletion will fail","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0c27b86f0f0851e1bb7e67c90f5f47324c5dac61","unresolved":false,"context_lines":[{"line_number":944,"context_line":""},{"line_number":945,"context_line":"    def _cleanup_lvm(self, instance):"},{"line_number":946,"context_line":"        \"\"\"Delete all LVM disks for given instance object.\"\"\""},{"line_number":947,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":948,"context_line":"            disks \u003d self._lvm_encrypted_disks(instance)"},{"line_number":949,"context_line":"            LOG.info(_(\"Removing encrypted disks : %s\"), str(disks))"},{"line_number":950,"context_line":"            if disks:"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAASn%2F%2FIcE%3D","line":947,"in_reply_to":"AAAASn%2F%2FOJ0%3D","updated":"2013-09-11 13:00:41.000000000","message":"There is no clean way to do this. As this feature continues to evolve I would like to add an encryption field to the instance object, which will enable the inference you suggest as well as other nice additions, e.g. the capability to disconnect the dm-crypt device during suspend and live migration.","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"a20ad1155ec357d16550c6c260111386c2b0fe7a","unresolved":false,"context_lines":[{"line_number":2304,"context_line":"                encryption_key \u003d \\"},{"line_number":2305,"context_line":"                    self.key_manager.get_key(context, key_uuid).get_encoded()"},{"line_number":2306,"context_line":"            else:"},{"line_number":2307,"context_line":"                LOG.warn(_(\u0027Ephemeral storage encryption is currently \u0027"},{"line_number":2308,"context_line":"                           \u0027supported only for LVM storage backend. Ephemeral \u0027"},{"line_number":2309,"context_line":"                           \u0027storage will not be encrypted.\u0027))"},{"line_number":2310,"context_line":"                encryption_key \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAASn%2F%2FOV4%3D","line":2307,"updated":"2013-09-09 19:05:40.000000000","message":"I think its safer to fail hard in this case, if user tries to turn on ephemeral_storage_encryption and are not using a backend that supports it, then something is wrong and a lowly warning isn\u0027t loud enough.","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0c27b86f0f0851e1bb7e67c90f5f47324c5dac61","unresolved":false,"context_lines":[{"line_number":2304,"context_line":"                encryption_key \u003d \\"},{"line_number":2305,"context_line":"                    self.key_manager.get_key(context, key_uuid).get_encoded()"},{"line_number":2306,"context_line":"            else:"},{"line_number":2307,"context_line":"                LOG.warn(_(\u0027Ephemeral storage encryption is currently \u0027"},{"line_number":2308,"context_line":"                           \u0027supported only for LVM storage backend. Ephemeral \u0027"},{"line_number":2309,"context_line":"                           \u0027storage will not be encrypted.\u0027))"},{"line_number":2310,"context_line":"                encryption_key \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAASn%2F%2FIcA%3D","line":2307,"in_reply_to":"AAAASn%2F%2FOV4%3D","updated":"2013-09-11 13:00:41.000000000","message":"Done","commit_id":"9c56ccb786d04132636618816fc383a7f266148d"},{"author":{"_account_id":360,"name":"Dan Prince","email":"dprince@redhat.com","username":"dan-prince"},"change_message_id":"66b123b3af88c486336d6b9c723a268df964356a","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        self.image_cache_manager \u003d imagecache.ImageCacheManager()"},{"line_number":352,"context_line":"        self.image_backend \u003d imagebackend.Backend(CONF.use_cow_images)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        self.key_manager \u003d keymgr.API()"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        self.disk_cachemodes \u003d {}"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAASn%2F%2FEto%3D","line":354,"updated":"2013-09-12 14:30:45.000000000","message":"We shouldn\u0027t initialize the key manager API unless it is enabled. Doing so may incur extra startup checks, etc.\n\nHow about:\n\nif CONF.ephemeral_storage_encryption.enabled:\n    self.key_manager \u003d keymgr.API()","commit_id":"6f9b9989f29a421af7b1797b984c620458381b9f"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"38120a1e952074c8d9e32e9c1ddef1c12873531d","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        self.image_cache_manager \u003d imagecache.ImageCacheManager()"},{"line_number":352,"context_line":"        self.image_backend \u003d imagebackend.Backend(CONF.use_cow_images)"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        self.key_manager \u003d keymgr.API()"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        self.disk_cachemodes \u003d {}"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAASn%2F%2FEVc%3D","line":354,"in_reply_to":"AAAASn%2F%2FEto%3D","updated":"2013-09-12 18:32:56.000000000","message":"Done","commit_id":"6f9b9989f29a421af7b1797b984c620458381b9f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":1048,"context_line":"            LOG.error(_(\"Something is preventing \u0027find\u0027 from locating \""},{"line_number":1049,"context_line":"                        \"encrypted volumes, possibly the path is incorrect \""},{"line_number":1050,"context_line":"                        \"or privileges are insufficient.\"))"},{"line_number":1051,"context_line":"        encrypted_logical_volumes \u003d \\"},{"line_number":1052,"context_line":"            [path.rpartition(\u0027/\u0027)[2] for path in out.splitlines()]"},{"line_number":1053,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxE%3D","line":1050,"updated":"2013-12-01 12:59:30.000000000","message":"the exception should be raised. the code continues from here - will this not be a problem?","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":1048,"context_line":"            LOG.error(_(\"Something is preventing \u0027find\u0027 from locating \""},{"line_number":1049,"context_line":"                        \"encrypted volumes, possibly the path is incorrect \""},{"line_number":1050,"context_line":"                        \"or privileges are insufficient.\"))"},{"line_number":1051,"context_line":"        encrypted_logical_volumes \u003d \\"},{"line_number":1052,"context_line":"            [path.rpartition(\u0027/\u0027)[2] for path in out.splitlines()]"},{"line_number":1053,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BFTg%3D","line":1050,"in_reply_to":"AAAATn%2F%2BJxE%3D","updated":"2013-12-02 22:48:06.000000000","message":"Done","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"            if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1026,"context_line":"                if CONF.libvirt_images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1027,"context_line":"                    self._cleanup_encrypted_lvm(instance)"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1030,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97jA%3D","line":1027,"updated":"2013-12-04 10:49:42.000000000","message":"Any place where the driver.py code has to do conditional branching on CONF.libvirt_images_type is a bug IMHO. The imagebackend.py interface should be used to hide all differences between different image types. If the existing APis in imagebackend.py don\u0027t cope with this scenario, then feel free to add new APIs there.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e50dd6f23eaa10cf7fe0aa924c925c3741dfb112","unresolved":false,"context_lines":[{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"            if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1026,"context_line":"                if CONF.libvirt_images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1027,"context_line":"                    self._cleanup_encrypted_lvm(instance)"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1030,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F9518%3D","line":1027,"in_reply_to":"AAAATn%2F96lg%3D","updated":"2013-12-04 17:24:37.000000000","message":"Looking at, for example, _cleanup_lvm() code path in driver, it branches on CONF.libvirt.images_volume_group in _lvm_disks(), which seems essentially identical. Is it really possible to get rid of all this branching code? Imagebackend may need a major rewriting to make backends appear completely uniform to the driver.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"            if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1026,"context_line":"                if CONF.libvirt_images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1027,"context_line":"                    self._cleanup_encrypted_lvm(instance)"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1030,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96lg%3D","line":1027,"in_reply_to":"AAAATn%2F97jA%3D","updated":"2013-12-04 14:56:33.000000000","message":"Yes, this seemed ugly and now I know why. Thanks. Will fix.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        try:"},{"line_number":1045,"context_line":"            out, err \u003d utils.execute(\u0027find\u0027, \u0027/dev/mapper/\u0027,"},{"line_number":1046,"context_line":"                                     \u0027-name\u0027, \u0027*dmcrypt\u0027)"},{"line_number":1047,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":1048,"context_line":"            raise exception.NovaException("},{"line_number":1049,"context_line":"                _(\"Unable to locate encrypted volumes.\"))"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97jc%3D","line":1046,"updated":"2013-12-04 10:49:42.000000000","message":"That\u0027s a pretty heavy way to enumerate files in a directory, given that you\u0027re not needing to pass it through rootwrap. Can you not just use the python APIs for reading directories.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        try:"},{"line_number":1045,"context_line":"            out, err \u003d utils.execute(\u0027find\u0027, \u0027/dev/mapper/\u0027,"},{"line_number":1046,"context_line":"                                     \u0027-name\u0027, \u0027*dmcrypt\u0027)"},{"line_number":1047,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":1048,"context_line":"            raise exception.NovaException("},{"line_number":1049,"context_line":"                _(\"Unable to locate encrypted volumes.\"))"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96kk%3D","line":1046,"in_reply_to":"AAAATn%2F97jc%3D","updated":"2013-12-04 14:56:33.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"            raise exception.NovaException("},{"line_number":1049,"context_line":"                _(\"Unable to locate encrypted volumes.\"))"},{"line_number":1050,"context_line":"        encrypted_logical_volumes \u003d \\"},{"line_number":1051,"context_line":"            [path.rpartition(\u0027/\u0027)[2] for path in out.splitlines()]"},{"line_number":1052,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"},{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        if disks:"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97iM%3D","line":1051,"updated":"2013-12-04 10:49:42.000000000","message":"You\u0027ve already got helpers for creating + deleting crypt volumes in utils.py. I\u0027d suggest adding another one to obtain a list of crypt volumes.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"            raise exception.NovaException("},{"line_number":1049,"context_line":"                _(\"Unable to locate encrypted volumes.\"))"},{"line_number":1050,"context_line":"        encrypted_logical_volumes \u003d \\"},{"line_number":1051,"context_line":"            [path.rpartition(\u0027/\u0027)[2] for path in out.splitlines()]"},{"line_number":1052,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"},{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        if disks:"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96kc%3D","line":1051,"in_reply_to":"AAAATn%2F97iM%3D","updated":"2013-12-04 14:56:33.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        if disks:"},{"line_number":1055,"context_line":"            for path in disks:"},{"line_number":1056,"context_line":"                utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, path, run_as_root\u003dTrue)"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"    def _cleanup_rbd(self, instance):"},{"line_number":1059,"context_line":"        pool \u003d CONF.libvirt.images_rbd_pool"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97i4%3D","line":1056,"updated":"2013-12-04 10:49:42.000000000","message":"Given that you went to trouble of creating a \u0027cryptdestroy\u0027 method in the utils.py module I\u0027d rather expect that this would invoke that.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        if disks:"},{"line_number":1055,"context_line":"            for path in disks:"},{"line_number":1056,"context_line":"                utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, path, run_as_root\u003dTrue)"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"    def _cleanup_rbd(self, instance):"},{"line_number":1059,"context_line":"        pool \u003d CONF.libvirt.images_rbd_pool"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96kU%3D","line":1056,"in_reply_to":"AAAATn%2F97i4%3D","updated":"2013-12-04 14:56:33.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":2442,"context_line":""},{"line_number":2443,"context_line":"        LOG.info(_(\u0027Creating image\u0027), instance\u003dinstance)"},{"line_number":2444,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":2445,"context_line":"            if CONF.libvirt_images_type !\u003d \u0027lvm\u0027:"},{"line_number":2446,"context_line":"                raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":2447,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"},{"line_number":2448,"context_line":"                                  \u0027only for LVM images.\u0027))"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97h8%3D","line":2445,"updated":"2013-12-04 10:49:42.000000000","message":"IMHO this is another example of a bug - conditional code that should be hidden in imagebackend.py","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":2442,"context_line":""},{"line_number":2443,"context_line":"        LOG.info(_(\u0027Creating image\u0027), instance\u003dinstance)"},{"line_number":2444,"context_line":"        if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":2445,"context_line":"            if CONF.libvirt_images_type !\u003d \u0027lvm\u0027:"},{"line_number":2446,"context_line":"                raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":2447,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"},{"line_number":2448,"context_line":"                                  \u0027only for LVM images.\u0027))"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96kM%3D","line":2445,"in_reply_to":"AAAATn%2F97h8%3D","updated":"2013-12-04 14:56:33.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"fd91511d4badd6f314a292ab073cdcfcdb8cd716","unresolved":false,"context_lines":[{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1040,"context_line":"        #TODO(dgenin): Use disk_info to identify disks if available."},{"line_number":1041,"context_line":"        #Disk names containing _ can potentially be a problem."},{"line_number":1042,"context_line":"        pattern \u003d \u0027%s_\u0027 % instance[\u0027name\u0027]"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        def belongs_to_instance(disk):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9OGA%3D","line":1041,"updated":"2013-12-13 21:13:33.000000000","message":"Does this need to be finished as part of this patch?","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0edc0a499f151d5ed2f5a8894edb821b6a26a428","unresolved":false,"context_lines":[{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1040,"context_line":"        #TODO(dgenin): Use disk_info to identify disks if available."},{"line_number":1041,"context_line":"        #Disk names containing _ can potentially be a problem."},{"line_number":1042,"context_line":"        pattern \u003d \u0027%s_\u0027 % instance[\u0027name\u0027]"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"        def belongs_to_instance(disk):"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9N2Q%3D","line":1041,"in_reply_to":"AAAATn%2F9OGA%3D","updated":"2013-12-13 22:10:30.000000000","message":"It is not essential and the patch works fine without it but it seems to me that using disk_info would be a more elegant way of locating encrypted devices. Now that I look at it, this TODO should be in dmcrypt.list_volumes().","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"fd91511d4badd6f314a292ab073cdcfcdb8cd716","unresolved":false,"context_lines":[{"line_number":1475,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1476,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1477,"context_line":"             and not source_format \u003d\u003d \"lvm\""},{"line_number":1478,"context_line":"             and not source_format \u003d\u003d \"rbd\""},{"line_number":1479,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled)):"},{"line_number":1480,"context_line":"            live_snapshot \u003d True"},{"line_number":1481,"context_line":"            # Abort is an idempotent operation, so make sure any block"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9OFo%3D","line":1478,"updated":"2013-12-13 21:13:33.000000000","message":"I think !\u003d is clearer in these cases than not and \u003d\u003d","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0edc0a499f151d5ed2f5a8894edb821b6a26a428","unresolved":false,"context_lines":[{"line_number":1475,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1476,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1477,"context_line":"             and not source_format \u003d\u003d \"lvm\""},{"line_number":1478,"context_line":"             and not source_format \u003d\u003d \"rbd\""},{"line_number":1479,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled)):"},{"line_number":1480,"context_line":"            live_snapshot \u003d True"},{"line_number":1481,"context_line":"            # Abort is an idempotent operation, so make sure any block"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9N2A%3D","line":1478,"in_reply_to":"AAAATn%2F9OFo%3D","updated":"2013-12-13 22:10:30.000000000","message":"This is not my code by will gladly change it.","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"fd89c1b6330e0db59edce3b024d7bae23d3270b1","unresolved":false,"context_lines":[{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"        if disks:"},{"line_number":1042,"context_line":"            for path in disks:"},{"line_number":1043,"context_line":"                dmcrypt.delete_volume(path)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    def _cleanup_rbd(self, instance):"},{"line_number":1046,"context_line":"        pool \u003d CONF.libvirt.images_rbd_pool"}],"source_content_type":"text/x-python","patch_set":50,"id":"AAAATn%2F9BOI%3D","line":1043,"updated":"2013-12-17 16:27:42.000000000","message":"I\u0027m still not really liking that this code is in driver.py - nor in fact liking the calls to _cleanup_rbd and _cleanup_lvm either. Seems we ought to have a \u0027delete_image\u0027 method in ImageBackend we can call instead. You are following the existing (bad) practice here though, and fixing this mess looks like quite a big job so won\u0027t make you change this","commit_id":"25d5c864200d12020b8821e3ee22ab0a054bbd5b"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"03724cb1e34b4ef85d83b8c3322a30c023ae0ac0","unresolved":false,"context_lines":[{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"        if disks:"},{"line_number":1042,"context_line":"            for path in disks:"},{"line_number":1043,"context_line":"                dmcrypt.delete_volume(path)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    def _cleanup_rbd(self, instance):"},{"line_number":1046,"context_line":"        pool \u003d CONF.libvirt.images_rbd_pool"}],"source_content_type":"text/x-python","patch_set":50,"id":"AAAATn%2F9A0c%3D","line":1043,"in_reply_to":"AAAATn%2F9BOI%3D","updated":"2013-12-17 17:47:57.000000000","message":"Thank you:) I was wondering why this wasn\u0027t in the backend myself but assumed this was a premeditated architectural decision.","commit_id":"25d5c864200d12020b8821e3ee22ab0a054bbd5b"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"a3b8f7757ece8fbaf962dcdfa6d9bd0af5349f01","unresolved":false,"context_lines":[{"line_number":1466,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1467,"context_line":"             and source_format !\u003d \"lvm\""},{"line_number":1468,"context_line":"             and source_format !\u003d \"rbd\""},{"line_number":1469,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled)):"},{"line_number":1470,"context_line":"            live_snapshot \u003d True"},{"line_number":1471,"context_line":"            # Abort is an idempotent operation, so make sure any block"},{"line_number":1472,"context_line":"            # jobs which may have failed are ended. This operation also"}],"source_content_type":"text/x-python","patch_set":53,"id":"AAAAUH%2F%2F7%2B0%3D","line":1469,"updated":"2014-01-06 14:59:04.000000000","message":"Why the double parentheses?","commit_id":"1baba09fefa020ee298c303cc27892799a0c254a"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"104a2bb7d3f2bee650d3ed379e37bc0e9aa081b4","unresolved":false,"context_lines":[{"line_number":1466,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1467,"context_line":"             and source_format !\u003d \"lvm\""},{"line_number":1468,"context_line":"             and source_format !\u003d \"rbd\""},{"line_number":1469,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled)):"},{"line_number":1470,"context_line":"            live_snapshot \u003d True"},{"line_number":1471,"context_line":"            # Abort is an idempotent operation, so make sure any block"},{"line_number":1472,"context_line":"            # jobs which may have failed are ended. This operation also"}],"source_content_type":"text/x-python","patch_set":53,"id":"AAAAUH%2F%2F7mI%3D","line":1469,"in_reply_to":"AAAAUH%2F%2F7%2B0%3D","updated":"2014-01-06 16:26:03.000000000","message":"Done","commit_id":"1baba09fefa020ee298c303cc27892799a0c254a"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"            return disk.startswith(pattern)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        #TODO(dgenin): Consider using disk_info to identify"},{"line_number":1065,"context_line":"        #attached disks."},{"line_number":1066,"context_line":"        encrypted_logical_volumes \u003d dmcrypt.list_volumes()"},{"line_number":1067,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"},{"line_number":1068,"context_line":""}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNu4%3D","line":1065,"updated":"2014-02-14 20:25:41.000000000","message":"This comment will fit in one line.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"            return disk.startswith(pattern)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        #TODO(dgenin): Consider using disk_info to identify"},{"line_number":1065,"context_line":"        #attached disks."},{"line_number":1066,"context_line":"        encrypted_logical_volumes \u003d dmcrypt.list_volumes()"},{"line_number":1067,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"},{"line_number":1068,"context_line":""}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNj4%3D","line":1065,"in_reply_to":"AAAAUX%2F%2FNu4%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"        encrypted_logical_volumes \u003d dmcrypt.list_volumes()"},{"line_number":1067,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        if disks:"},{"line_number":1070,"context_line":"            for path in disks:"},{"line_number":1071,"context_line":"                dmcrypt.delete_volume(path)"},{"line_number":1072,"context_line":""}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNuo%3D","line":1069,"updated":"2014-02-14 20:25:41.000000000","message":"You don\u0027t really need this if, since a for over an empty list is valid.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"        encrypted_logical_volumes \u003d dmcrypt.list_volumes()"},{"line_number":1067,"context_line":"        disks \u003d filter(belongs_to_instance, encrypted_logical_volumes)"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        if disks:"},{"line_number":1070,"context_line":"            for path in disks:"},{"line_number":1071,"context_line":"                dmcrypt.delete_volume(path)"},{"line_number":1072,"context_line":""}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNj0%3D","line":1069,"in_reply_to":"AAAAUX%2F%2FNuo%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"884a7fbbc2c4762425baff8dd55b6163ac4fe224","unresolved":false,"context_lines":[{"line_number":257,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":258,"context_line":"CONF.import_opt(\u0027use_cow_images\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":259,"context_line":"CONF.import_opt(\u0027enabled\u0027, \u0027nova.compute.api\u0027,"},{"line_number":260,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":261,"context_line":"CONF.import_opt(\u0027cipher\u0027, \u0027nova.compute.api\u0027,"},{"line_number":262,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":263,"context_line":"CONF.import_opt(\u0027key_size\u0027, \u0027nova.compute.api\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F5Io%3D","line":260,"updated":"2014-02-27 15:19:30.000000000","message":"Can you line these up with the starting quote after the paren above? Makes it much easier to read.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4ae3bb7f79b64829230c51be301697bca42b4390","unresolved":false,"context_lines":[{"line_number":257,"context_line":"CONF.import_opt(\u0027default_ephemeral_format\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":258,"context_line":"CONF.import_opt(\u0027use_cow_images\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":259,"context_line":"CONF.import_opt(\u0027enabled\u0027, \u0027nova.compute.api\u0027,"},{"line_number":260,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":261,"context_line":"CONF.import_opt(\u0027cipher\u0027, \u0027nova.compute.api\u0027,"},{"line_number":262,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":263,"context_line":"CONF.import_opt(\u0027key_size\u0027, \u0027nova.compute.api\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F42U%3D","line":260,"in_reply_to":"AAAAVX%2F%2F5Io%3D","updated":"2014-02-27 18:56:31.000000000","message":"Done","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"92db1fa81a38ad6e78be7d92a6bcef09b5fb8469","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"                                 instance\u003dinstance)"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        if destroy_disks:"},{"line_number":1048,"context_line":"            if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1049,"context_line":"                self._detach_encrypted_volumes(instance)"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"            self._delete_instance_files(instance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F6Ag%3D","line":1048,"updated":"2014-02-27 15:16:21.000000000","message":"this bothers me a little bit. Is there nothing on the storage itself that lets us know it\u0027s encrypted? \n\nThe reason is for issues like changing the default ephemeral filesystem. There might be deployed encrypted environments, then the system is configured to not be encrypted, nova is restarted, now how is cleanup done of those guests.\n\nIt seems like the real switch would be around whether or not dmcrypt is available.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"518b073a63e86418351ca82bd46aabfa2d3b7abf","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"                                 instance\u003dinstance)"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        if destroy_disks:"},{"line_number":1048,"context_line":"            if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1049,"context_line":"                self._detach_encrypted_volumes(instance)"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"            self._delete_instance_files(instance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F4VY%3D","line":1048,"in_reply_to":"AAAAVX%2F%2F6Ag%3D","updated":"2014-02-27 16:19:29.000000000","message":"\u003e this bothers me a little bit. Is there nothing on the storage itself that lets us know it\u0027s encrypted?\n\nNo, the prior patch (https://review.openstack.org/#/c/60621/23/nova/virt/libvirt/dmcrypt.py) uses raw cryptsetup so there\u0027s nothing on the storage to identify that the data is encrypted.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4ae3bb7f79b64829230c51be301697bca42b4390","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"                                 instance\u003dinstance)"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        if destroy_disks:"},{"line_number":1048,"context_line":"            if CONF.ephemeral_storage_encryption.enabled:"},{"line_number":1049,"context_line":"                self._detach_encrypted_volumes(instance)"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"            self._delete_instance_files(instance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F3J0%3D","line":1048,"in_reply_to":"AAAAVX%2F%2F6Ag%3D","updated":"2014-02-27 18:56:31.000000000","message":"I will change this to use instance.ephemeral_key_uuid, which has continuity across Nova restarts.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"92db1fa81a38ad6e78be7d92a6bcef09b5fb8469","unresolved":false,"context_lines":[{"line_number":1058,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1059,"context_line":"        pattern \u003d \u0027%s_\u0027 % instance[\u0027name\u0027]"},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"        def belongs_to_instance(disk):"},{"line_number":1062,"context_line":"            return disk.startswith(pattern)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        #TODO(dgenin): Consider using disk_info to identify attached disks."}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F4%2Bc%3D","line":1061,"updated":"2014-02-27 15:16:21.000000000","message":"this doesn\u0027t seem like a safe way to handle this case. There has to be a better way to find this by uuid.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"884a7fbbc2c4762425baff8dd55b6163ac4fe224","unresolved":false,"context_lines":[{"line_number":1058,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1059,"context_line":"        pattern \u003d \u0027%s_\u0027 % instance[\u0027name\u0027]"},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"        def belongs_to_instance(disk):"},{"line_number":1062,"context_line":"            return disk.startswith(pattern)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        #TODO(dgenin): Consider using disk_info to identify attached disks."}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F470%3D","line":1061,"in_reply_to":"AAAAVX%2F%2F4%2Bc%3D","updated":"2014-02-27 15:19:30.000000000","message":"Agreed. This may be because of how things are currently done. However, instance[\u0027name\u0027] really should not be used in the volume name, especially if we care about isolation and security. If a silly admin were to configure his instance_name_format as:\n\n  instance-%(display_name)s\n\nthen a malicious user could potentially gain access to another\u0027s volume, conflict with it in some way, etc. It surely seems like we need a refactor of all the new and existing LV stuff to prevent that, and use the instance uuid (only) instead.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4ae3bb7f79b64829230c51be301697bca42b4390","unresolved":false,"context_lines":[{"line_number":1058,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1059,"context_line":"        pattern \u003d \u0027%s_\u0027 % instance[\u0027name\u0027]"},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"        def belongs_to_instance(disk):"},{"line_number":1062,"context_line":"            return disk.startswith(pattern)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        #TODO(dgenin): Consider using disk_info to identify attached disks."}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F3IQ%3D","line":1061,"in_reply_to":"AAAAVX%2F%2F470%3D","updated":"2014-02-27 18:56:31.000000000","message":"OK, will change to use get_instance_disk_info() to get disk paths. Still need to use dmcrypt._dmcrypt_suffix to identify encrypted volumes but this is much more robust. I assume that implementing this change for the unencrypted code path will require a blueprint?","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"5e27109c9ce80f2c1b059646de763c03c2c46b39","unresolved":false,"context_lines":[{"line_number":1061,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":1062,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        self._undefine_domain(instance)"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1067,"context_line":"        \"\"\"Detaches encrypted volumes attached to instance.\"\"\""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2F2no%3D","line":1064,"updated":"2014-03-03 19:43:58.000000000","message":"Did this need to be moved from the beginning to the end?  I\u0027m not seeing why.","commit_id":"ddcd10bfe50e13dc171938d46e9ec23452901931"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"eb25baf030db4ba9cfadc0e3ecc1009edf02a80c","unresolved":false,"context_lines":[{"line_number":1061,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":1062,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        self._undefine_domain(instance)"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1067,"context_line":"        \"\"\"Detaches encrypted volumes attached to instance.\"\"\""}],"source_content_type":"text/x-python","patch_set":79,"id":"AAAAVn%2F%2F2gY%3D","line":1064,"in_reply_to":"AAAAVn%2F%2F2no%3D","updated":"2014-03-03 19:54:36.000000000","message":"_detach_encrypted_volumes() now uses domain info via get_instance_disk_info() to get the locations of the encrypted volumes. _undefine_domain() destroys domain info so it had to be moved to the end.","commit_id":"ddcd10bfe50e13dc171938d46e9ec23452901931"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"6de1ab53880204f6eed876883fed15c02bace894","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"    def cleanup(self, context, instance, network_info, block_device_info\u003dNone,"},{"line_number":972,"context_line":"                destroy_disks\u003dTrue):"},{"line_number":973,"context_line":"        self._undefine_domain(instance)"},{"line_number":974,"context_line":"        self.unplug_vifs(instance, network_info)"},{"line_number":975,"context_line":"        retry \u003d True"},{"line_number":976,"context_line":"        while retry:"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz9M%3D","side":"PARENT","line":973,"updated":"2014-03-04 00:47:02.000000000","message":"why move this to the bottom?","commit_id":"cc3d8b5c46203d069ce5a5d74599fd4465f2abdc"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"    def cleanup(self, context, instance, network_info, block_device_info\u003dNone,"},{"line_number":972,"context_line":"                destroy_disks\u003dTrue):"},{"line_number":973,"context_line":"        self._undefine_domain(instance)"},{"line_number":974,"context_line":"        self.unplug_vifs(instance, network_info)"},{"line_number":975,"context_line":"        retry \u003d True"},{"line_number":976,"context_line":"        while retry:"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Ftmk%3D","side":"PARENT","line":973,"in_reply_to":"AAAAVn%2F%2Fz9M%3D","updated":"2014-03-04 15:14:25.000000000","message":"An earlier review suggested that identifying LVM disks by filtering all volumes based on instance[\u0027name\u0027], more recently instance[\u0027uuid\u0027] (cf _lvm_disks()) is a bad idea, which made sense to me. So I reimplemented _detach_encrypted_volumes() to use domain xml info via get_instance_disk_info(). The reason _undefine_domain() had to be moved to the end is that if the domain is undefined as the first step during cleanup the xml info is no longer available.","commit_id":"cc3d8b5c46203d069ce5a5d74599fd4465f2abdc"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"6de1ab53880204f6eed876883fed15c02bace894","unresolved":false,"context_lines":[{"line_number":4618,"context_line":"                          instance_name)"},{"line_number":4619,"context_line":"                continue"},{"line_number":4620,"context_line":""},{"line_number":4621,"context_line":"            if disk_type !\u003d \u0027file\u0027:"},{"line_number":4622,"context_line":"                LOG.debug(_(\u0027skipping %s since it looks like volume\u0027), path)"},{"line_number":4623,"context_line":"                continue"},{"line_number":4624,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz8s%3D","side":"PARENT","line":4621,"updated":"2014-03-04 00:47:02.000000000","message":"why remove this?","commit_id":"cc3d8b5c46203d069ce5a5d74599fd4465f2abdc"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":4618,"context_line":"                          instance_name)"},{"line_number":4619,"context_line":"                continue"},{"line_number":4620,"context_line":""},{"line_number":4621,"context_line":"            if disk_type !\u003d \u0027file\u0027:"},{"line_number":4622,"context_line":"                LOG.debug(_(\u0027skipping %s since it looks like volume\u0027), path)"},{"line_number":4623,"context_line":"                continue"},{"line_number":4624,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FtmA%3D","side":"PARENT","line":4621,"in_reply_to":"AAAAVn%2F%2Fz8s%3D","updated":"2014-03-04 15:14:25.000000000","message":"To make it return information on LVM volumes rather than only file based image backends.","commit_id":"cc3d8b5c46203d069ce5a5d74599fd4465f2abdc"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"a3e752b40735c84651026e1946fc27bfb67f38ca","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"                                                  False)):"},{"line_number":1100,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1101,"context_line":"                self._cleanup_lvm(instance)"},{"line_number":1102,"context_line":"            #NOTE(haomai): destroy volumes if needed"},{"line_number":1103,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":1104,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":1105,"context_line":""}],"source_content_type":"text/x-python","patch_set":87,"id":"7ac7a964_58d77ded","line":1102,"range":{"start_line":1102,"start_character":12,"end_line":1102,"end_character":14},"updated":"2014-08-15 09:00:01.000000000","message":"E265 block comment should start with \u0027# \u0027","commit_id":"0cc1482b0f874d78399dfb0c0b06eebf0b7473c4"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"6e95a9cd6894b04509777427b495c6fa63a7910e","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"                                                  False)):"},{"line_number":1100,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027lvm\u0027:"},{"line_number":1101,"context_line":"                self._cleanup_lvm(instance)"},{"line_number":1102,"context_line":"            #NOTE(haomai): destroy volumes if needed"},{"line_number":1103,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":1104,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":1105,"context_line":""}],"source_content_type":"text/x-python","patch_set":87,"id":"7ac7a964_9bf8217e","line":1102,"in_reply_to":"7ac7a964_58d77ded","updated":"2014-08-15 15:55:40.000000000","message":"Done","commit_id":"0cc1482b0f874d78399dfb0c0b06eebf0b7473c4"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e1becb513340d3bea9063fac223293fc24e3262a","unresolved":false,"context_lines":[{"line_number":4959,"context_line":"                continue"},{"line_number":4960,"context_line":""},{"line_number":4961,"context_line":"            if disk_type !\u003d \u0027file\u0027:"},{"line_number":4962,"context_line":"                LOG.debug(\u0027skipping %s since it looks like volume\u0027, path)"},{"line_number":4963,"context_line":"                continue"},{"line_number":4964,"context_line":""},{"line_number":4965,"context_line":"            if target in volume_devices:"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_4c30959e","side":"PARENT","line":4962,"updated":"2014-08-15 14:07:07.000000000","message":"Why are you removing this. You are likely going to break scenarios where the disk type \u003d\u003d network or pool, as your new code only considers type\u003dfile or type\u003dblock.","commit_id":"e63905c3595bfeecc8711ba27b7f3796050d78bb"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"3feddaa9a76c04bff72f0beea9b8f005c22fc86c","unresolved":false,"context_lines":[{"line_number":4959,"context_line":"                continue"},{"line_number":4960,"context_line":""},{"line_number":4961,"context_line":"            if disk_type !\u003d \u0027file\u0027:"},{"line_number":4962,"context_line":"                LOG.debug(\u0027skipping %s since it looks like volume\u0027, path)"},{"line_number":4963,"context_line":"                continue"},{"line_number":4964,"context_line":""},{"line_number":4965,"context_line":"            if target in volume_devices:"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_9510f0a9","side":"PARENT","line":4962,"in_reply_to":"7ac7a964_4c30959e","updated":"2014-08-15 15:30:22.000000000","message":"Good point, I thought \u0027file\u0027 and \u0027volume\u0027 were the only options. \u0027pool\u0027 is new, correct?","commit_id":"e63905c3595bfeecc8711ba27b7f3796050d78bb"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3e598cfd1dc882a5110bf13e0c1d8783808c9d8b","unresolved":false,"context_lines":[{"line_number":4959,"context_line":"                continue"},{"line_number":4960,"context_line":""},{"line_number":4961,"context_line":"            if disk_type !\u003d \u0027file\u0027:"},{"line_number":4962,"context_line":"                LOG.debug(\u0027skipping %s since it looks like volume\u0027, path)"},{"line_number":4963,"context_line":"                continue"},{"line_number":4964,"context_line":""},{"line_number":4965,"context_line":"            if target in volume_devices:"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_20bd1869","side":"PARENT","line":4962,"in_reply_to":"7ac7a964_9510f0a9","updated":"2014-08-15 15:36:49.000000000","message":"I didn\u0027t mean \u0027pool\u0027, rather \u0027volume\u0027. Either way we should only process things we know we can handle, so this disk_type check   shouldn\u0027t be removed otherwise this code tries to run for type\u003dvolume/type\u003dnetwork with bad results.","commit_id":"e63905c3595bfeecc8711ba27b7f3796050d78bb"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e1becb513340d3bea9063fac223293fc24e3262a","unresolved":false,"context_lines":[{"line_number":1103,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":1104,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1107,"context_line":""},{"line_number":1108,"context_line":"        self._undefine_domain(instance)"},{"line_number":1109,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_ac4be929","line":1106,"updated":"2014-08-15 14:07:07.000000000","message":"You\u0027ve significantly changed the conditionals here - was that intentional or a conflict rebase mistake ?\n\nPreviously  cleanup_lvm/cleanup_rbd were run \u0027if destroy_disks\u0027.\n\nNow they are run \u0027if destroy_disks or is_shared_block_storage\n\nI don\u0027t see why adding encryption would require such a change in logic.","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"3feddaa9a76c04bff72f0beea9b8f005c22fc86c","unresolved":false,"context_lines":[{"line_number":1103,"context_line":"            if CONF.libvirt.images_type \u003d\u003d \u0027rbd\u0027:"},{"line_number":1104,"context_line":"                self._cleanup_rbd(instance)"},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1107,"context_line":""},{"line_number":1108,"context_line":"        self._undefine_domain(instance)"},{"line_number":1109,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_204ef86f","line":1106,"in_reply_to":"7ac7a964_ac4be929","updated":"2014-08-15 15:30:22.000000000","message":"I misread this condition. I thought disk was destroyed if migrate_data.get(\u0027is_shared_block_storage\u0027) \u003d\u003d False. This would make sense, since if storage is not shared we would want to release resources after migration. This should be done for LVM and RBD as well as for qcow2 and raw. Now, I am not sure what this actually does, so I will revert it.","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e1becb513340d3bea9063fac223293fc24e3262a","unresolved":false,"context_lines":[{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1107,"context_line":""},{"line_number":1108,"context_line":"        self._undefine_domain(instance)"},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1111,"context_line":"        \"\"\"Detaches encrypted volumes attached to instance.\"\"\""}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_ecbec1fe","line":1108,"updated":"2014-08-15 14:07:07.000000000","message":"Why move this line, it doesn\u0027t seems to have an obvious purpose.","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"3feddaa9a76c04bff72f0beea9b8f005c22fc86c","unresolved":false,"context_lines":[{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"            self._delete_instance_files(instance)"},{"line_number":1107,"context_line":""},{"line_number":1108,"context_line":"        self._undefine_domain(instance)"},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"    def _detach_encrypted_volumes(self, instance):"},{"line_number":1111,"context_line":"        \"\"\"Detaches encrypted volumes attached to instance.\"\"\""}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_c0aaa4d1","line":1108,"in_reply_to":"7ac7a964_ecbec1fe","updated":"2014-08-15 15:30:22.000000000","message":"I need domain info to figure out which volumes belong to the instance without relying on the volume name semantics. Using volume name as an ownership tag was objected to in a prior review.","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e1becb513340d3bea9063fac223293fc24e3262a","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"    def _cleanup_lvm(self, instance):"},{"line_number":1129,"context_line":"        \"\"\"Delete all LVM disks for given instance object.\"\"\""},{"line_number":1130,"context_line":"        if instance.get(\u0027ephemeral_key_uuid\u0027) is not None:"},{"line_number":1131,"context_line":"                self._detach_encrypted_volumes(instance)"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"        disks \u003d self._lvm_disks(instance)"},{"line_number":1134,"context_line":"        if disks:"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_0c513dd8","line":1131,"updated":"2014-08-15 14:07:07.000000000","message":"Indentation is too deep here. Stick to 4 space indent","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"3feddaa9a76c04bff72f0beea9b8f005c22fc86c","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"    def _cleanup_lvm(self, instance):"},{"line_number":1129,"context_line":"        \"\"\"Delete all LVM disks for given instance object.\"\"\""},{"line_number":1130,"context_line":"        if instance.get(\u0027ephemeral_key_uuid\u0027) is not None:"},{"line_number":1131,"context_line":"                self._detach_encrypted_volumes(instance)"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"        disks \u003d self._lvm_disks(instance)"},{"line_number":1134,"context_line":"        if disks:"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_8080ac47","line":1131,"in_reply_to":"7ac7a964_0c513dd8","updated":"2014-08-15 15:30:22.000000000","message":"Done","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"6a75bb78891818dbb66406fbbcda5ed18b592671","unresolved":false,"context_lines":[{"line_number":4992,"context_line":"                # NOTE(dgenin): This is confusing because disk_type\u003d\u003d\u0027volume\u0027"},{"line_number":4993,"context_line":"                # does not mean that the device is a volume in Nova terminology"},{"line_number":4994,"context_line":"                # For example, LVM ephemeral disks have disk_type \u0027volume\u0027 but"},{"line_number":4995,"context_line":"                # are not volumes."},{"line_number":4996,"context_line":"                LOG.debug(\u0027skipping disk because it looks like a volume\u0027, path)"},{"line_number":4997,"context_line":"                continue"},{"line_number":4998,"context_line":""}],"source_content_type":"text/x-python","patch_set":89,"id":"7ac7a964_7bb425d1","line":4995,"updated":"2014-08-15 15:54:05.000000000","message":"The same is likely to be true for RBD but I don\u0027t know if its size can be obtained using blockdev.","commit_id":"7453c344214664cfec75bc8494b755914863e5c8"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"2b63a20920604e1a7cabe897d5744d140c50af18","unresolved":false,"context_lines":[{"line_number":4992,"context_line":"                # NOTE(dgenin): This is confusing because disk_type\u003d\u003d\u0027volume\u0027"},{"line_number":4993,"context_line":"                # does not mean that the device is a volume in Nova terminology"},{"line_number":4994,"context_line":"                # For example, LVM ephemeral disks have disk_type \u0027volume\u0027 but"},{"line_number":4995,"context_line":"                # are not volumes."},{"line_number":4996,"context_line":"                LOG.debug(\u0027skipping disk because it looks like a volume\u0027, path)"},{"line_number":4997,"context_line":"                continue"},{"line_number":4998,"context_line":""}],"source_content_type":"text/x-python","patch_set":89,"id":"7ac7a964_56273bb6","line":4995,"in_reply_to":"7ac7a964_0647544c","updated":"2014-08-15 17:26:41.000000000","message":"Thank you for the explanation, it really helps.","commit_id":"7453c344214664cfec75bc8494b755914863e5c8"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"ebae57058af25aa2a373a89ced43adf8316b7a56","unresolved":false,"context_lines":[{"line_number":4992,"context_line":"                # NOTE(dgenin): This is confusing because disk_type\u003d\u003d\u0027volume\u0027"},{"line_number":4993,"context_line":"                # does not mean that the device is a volume in Nova terminology"},{"line_number":4994,"context_line":"                # For example, LVM ephemeral disks have disk_type \u0027volume\u0027 but"},{"line_number":4995,"context_line":"                # are not volumes."},{"line_number":4996,"context_line":"                LOG.debug(\u0027skipping disk because it looks like a volume\u0027, path)"},{"line_number":4997,"context_line":"                continue"},{"line_number":4998,"context_line":""}],"source_content_type":"text/x-python","patch_set":89,"id":"7ac7a964_0647544c","line":4995,"in_reply_to":"7ac7a964_7bb425d1","updated":"2014-08-15 16:10:06.000000000","message":"I think you\u0027ve got the wrong type here. LVM disks are configured using \u0027block\u0027 not \u0027volume\u0027.  The type\u003dvolume is a feature that\u0027s being added to nova in a separate patch.\n\nRBD can\u0027t use blockdev because the images don\u0027t appear in the filesystem at all - the size is only obtainable via the rbd apis. The same is true of any type\u003dnetwork (of which RBD is one)\n\nTo be clear\n\n - type\u003dfile - plain files in filesystem\n - type\u003dblock - block device nodes in /dev\n - type\u003dnetwork - network protocols like rbd/iscsi/etc with no /dev mapping\n - type\u003dvolume - indirect reference to libvirt storage volume API","commit_id":"7453c344214664cfec75bc8494b755914863e5c8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":1620,"context_line":"        #               future."},{"line_number":1621,"context_line":"        if (self._has_min_version(MIN_LIBVIRT_LIVESNAPSHOT_VERSION,"},{"line_number":1622,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1623,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1624,"context_line":"             and not source_format \u003d\u003d \"lvm\""},{"line_number":1625,"context_line":"             and not source_format \u003d\u003d \"rbd\""},{"line_number":1626,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled):"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_d348142f","line":1623,"updated":"2014-09-05 19:45:51.000000000","message":"alignment of MIN_ and REQ_ ...","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":1620,"context_line":"        #               future."},{"line_number":1621,"context_line":"        if (self._has_min_version(MIN_LIBVIRT_LIVESNAPSHOT_VERSION,"},{"line_number":1622,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1623,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1624,"context_line":"             and not source_format \u003d\u003d \"lvm\""},{"line_number":1625,"context_line":"             and not source_format \u003d\u003d \"rbd\""},{"line_number":1626,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled):"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_9e0e938a","line":1623,"in_reply_to":"fa98f980_d348142f","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":1622,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1623,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1624,"context_line":"             and not source_format \u003d\u003d \"lvm\""},{"line_number":1625,"context_line":"             and not source_format \u003d\u003d \"rbd\""},{"line_number":1626,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled):"},{"line_number":1627,"context_line":"            live_snapshot \u003d True"},{"line_number":1628,"context_line":"            # Abort is an idempotent operation, so make sure any block"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_336160a9","line":1625,"updated":"2014-09-05 19:45:51.000000000","message":"More succinct:\n\n and source_format not in (\u0027lvm\u0027, \u0027rbd\u0027)","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":1622,"context_line":"                                MIN_QEMU_LIVESNAPSHOT_VERSION,"},{"line_number":1623,"context_line":"                                REQ_HYPERVISOR_LIVESNAPSHOT)"},{"line_number":1624,"context_line":"             and not source_format \u003d\u003d \"lvm\""},{"line_number":1625,"context_line":"             and not source_format \u003d\u003d \"rbd\""},{"line_number":1626,"context_line":"             and not CONF.ephemeral_storage_encryption.enabled):"},{"line_number":1627,"context_line":"            live_snapshot \u003d True"},{"line_number":1628,"context_line":"            # Abort is an idempotent operation, so make sure any block"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_7e82cfc8","line":1625,"in_reply_to":"fa98f980_336160a9","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"}],"nova/virt/libvirt/imagebackend.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"285667d1b49bf890fe6a64cc11f30a3c31ce3e99","unresolved":false,"context_lines":[{"line_number":331,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":332,"context_line":"                self.path \u003d path"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                self.vg \u003d CONF.libvirt_images_volume_group"},{"line_number":335,"context_line":"                self.path \u003d path"},{"line_number":336,"context_line":"        else:"},{"line_number":337,"context_line":"            if not CONF.libvirt_images_volume_group:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARH%2F%2F5mM%3D","line":334,"updated":"2013-08-15 14:57:23.000000000","message":"self.lv never gets set in this branch.  Is this an oversight or intentional?","commit_id":"dd229a482fd3734d873412a8247a02e3552d675e"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"285667d1b49bf890fe6a64cc11f30a3c31ce3e99","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                   \u0027--key-size\u003d\u0027 + CONF.encrypt_ephemeral_storage_key_size,"},{"line_number":372,"context_line":"                   \u0027--key-file\u003d-\u0027)"},{"line_number":373,"context_line":"            # TODO(dgenin): Need to pass context into imagebackend for this"},{"line_number":374,"context_line":"            # to work."},{"line_number":375,"context_line":"            key_bytes \u003d self.key_manager.get_key(None,"},{"line_number":376,"context_line":"                                                 self.key_uuid).get_encoded()"},{"line_number":377,"context_line":"            key_str \u003d \u0027\u0027.join(map(lambda byte: hex(byte)[2:], key_bytes))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARH%2F%2F5l8%3D","line":374,"updated":"2013-08-15 14:57:23.000000000","message":"Just reminding you about this TODO","commit_id":"dd229a482fd3734d873412a8247a02e3552d675e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":329,"context_line":"                self.path \u003d path"},{"line_number":330,"context_line":"            else:"},{"line_number":331,"context_line":"                self.vg \u003d CONF.libvirt_images_volume_group"},{"line_number":332,"context_line":"                self.path \u003d path"},{"line_number":333,"context_line":"        else:"},{"line_number":334,"context_line":"            if not CONF.libvirt_images_volume_group:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzIw%3D","line":331,"updated":"2013-08-29 13:24:49.000000000","message":"self.lv is not set on this path","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":329,"context_line":"                self.path \u003d path"},{"line_number":330,"context_line":"            else:"},{"line_number":331,"context_line":"                self.vg \u003d CONF.libvirt_images_volume_group"},{"line_number":332,"context_line":"                self.path \u003d path"},{"line_number":333,"context_line":"        else:"},{"line_number":334,"context_line":"            if not CONF.libvirt_images_volume_group:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2Fy1c%3D","line":331,"in_reply_to":"AAAASn%2F%2FzIw%3D","updated":"2013-08-29 20:31:01.000000000","message":"self.lv is only consumed in create_image() when creating the volume, but if you look at the default branch, it is obtained by querying the volume, which means the volume must already exist. The bottom line is that it is unnecessary to set self.lv if the path is set.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            if resize:"},{"line_number":384,"context_line":"                disk.resize2fs(self.path, run_as_root\u003dTrue)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        if \u0027encryption_key\u0027 in kwargs:"},{"line_number":387,"context_line":"            encryption_key \u003d kwargs.pop(\u0027encryption_key\u0027)"},{"line_number":388,"context_line":"        else:"},{"line_number":389,"context_line":"            encryption_key \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzEs%3D","line":386,"updated":"2013-08-29 13:24:49.000000000","message":"I think\n\n  encryption_key \u003d kwargs.pop(\u0027encryption_key\u0027, None)\n\nis more pythonic.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            # which first creates a logical volume snapshot with lvcreate"},{"line_number":426,"context_line":"            # before extracting it with qemu-img, and is identical to the"},{"line_number":427,"context_line":"            # Raw snapshot functionality. Once encrypted snapshot support is"},{"line_number":428,"context_line":"            # implemented this # will be returned to the normal LVM snapshot"},{"line_number":429,"context_line":"            # procedure."},{"line_number":430,"context_line":"            pass"},{"line_number":431,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzD0%3D","line":428,"updated":"2013-08-29 13:24:49.000000000","message":"superfluous \u0027#\u0027?","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c30f8f4dd2236b8f6498db852952c4bacba1686e","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            # Raw snapshot functionality. Once encrypted snapshot support is"},{"line_number":452,"context_line":"            # implemented this will be returned to the normal LVM snapshot"},{"line_number":453,"context_line":"            # procedure."},{"line_number":454,"context_line":"            pass"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def snapshot_extract(self, target, out_format):"},{"line_number":457,"context_line":"        if not CONF.ephemeral_storage_encryption.enabled:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FcsU%3D","line":454,"updated":"2013-11-06 01:35:09.000000000","message":"This really looks very bogus. If you\u0027re not going to implement this, then you should raise an exception, not silently ignore the request \u0026 expect everything to continue working.\n\nI\u0027d really rather you just implemented this correctly right away though","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"628fe25a329a4e9f1059ba80a293743ac8642804","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            # Raw snapshot functionality. Once encrypted snapshot support is"},{"line_number":452,"context_line":"            # implemented this will be returned to the normal LVM snapshot"},{"line_number":453,"context_line":"            # procedure."},{"line_number":454,"context_line":"            pass"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def snapshot_extract(self, target, out_format):"},{"line_number":457,"context_line":"        if not CONF.ephemeral_storage_encryption.enabled:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FBI8%3D","line":454,"in_reply_to":"AAAATn%2F%2FZ84%3D","updated":"2013-11-15 16:46:47.000000000","message":"Done","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f4b363e9ee8f8072d9401cdd2f55742fb6feacf1","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            # Raw snapshot functionality. Once encrypted snapshot support is"},{"line_number":452,"context_line":"            # implemented this will be returned to the normal LVM snapshot"},{"line_number":453,"context_line":"            # procedure."},{"line_number":454,"context_line":"            pass"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def snapshot_extract(self, target, out_format):"},{"line_number":457,"context_line":"        if not CONF.ephemeral_storage_encryption.enabled:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FZ84%3D","line":454,"in_reply_to":"AAAATn%2F%2FbKs%3D","updated":"2013-11-15 14:46:25.000000000","message":"Ok I see what\u0027s going on here, but I\u0027m still not at all convinced this is the right way to implement this.\n\nIf a host is using encrypted images, then IMHO taking unencrypted snapshots would be considered a security flaw.\n\nI understand from a data consistency POV this is safe, since driver.snapshot() guarantees the VM to be shutoff when  snapshot_extract is run. \n\nIn fact there was a separate change https://review.openstack.org/#/c/52363/6 which was simplifying this code for Qcow2. I suggested that it go one step further and just remove the \u0027snapshot_create\u0027 and \u0027snapshot_delete\u0027 methods entirely. That change has now merged, so this special case for encryption is simplified.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"69d73c13a600c20b41d50401dfcc44b2aa19f11c","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            # Raw snapshot functionality. Once encrypted snapshot support is"},{"line_number":452,"context_line":"            # implemented this will be returned to the normal LVM snapshot"},{"line_number":453,"context_line":"            # procedure."},{"line_number":454,"context_line":"            pass"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def snapshot_extract(self, target, out_format):"},{"line_number":457,"context_line":"        if not CONF.ephemeral_storage_encryption.enabled:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FbKs%3D","line":454,"in_reply_to":"AAAATn%2F%2FcsU%3D","updated":"2013-11-06 14:36:21.000000000","message":"This does not silently ignore the request. The snapshot is still extracted in snapshot_extract(), but it is done directly from the logical volume rather than going through a snapshot created with lvcreate as it is done for unencrypted volumes. As the comment states this approach is identical to the way snapshots are implemented for Raw.\n\nI agree this is not very satisfying but it does provide a way to take snapshots, albeit unencrypted ones. Implementing encrypted snapshots requires support for Glance. And I would like to hear more on how useful unencrypted snapshots of encrypted disks would be.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"f4b363e9ee8f8072d9401cdd2f55742fb6feacf1","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                                 run_as_root\u003dTrue)"},{"line_number":460,"context_line":"        else:"},{"line_number":461,"context_line":"            images.convert_image(self.path, target, out_format,"},{"line_number":462,"context_line":"                                  run_as_root\u003dTrue)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def snapshot_delete(self):"},{"line_number":465,"context_line":"        if not CONF.ephemeral_storage_encryption.enabled:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FZ80%3D","line":462,"updated":"2013-11-15 14:46:25.000000000","message":"So \u0027self.path\u0027 here points to the dm-crypt device providing the unencrypted view of the data. I think we need to make it point to the underlying encrypted device, so that the snapshot is encrypted too.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"628fe25a329a4e9f1059ba80a293743ac8642804","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                                 run_as_root\u003dTrue)"},{"line_number":460,"context_line":"        else:"},{"line_number":461,"context_line":"            images.convert_image(self.path, target, out_format,"},{"line_number":462,"context_line":"                                  run_as_root\u003dTrue)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def snapshot_delete(self):"},{"line_number":465,"context_line":"        if not CONF.ephemeral_storage_encryption.enabled:"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FBHM%3D","line":462,"in_reply_to":"AAAATn%2F%2FZ80%3D","updated":"2013-11-15 16:46:47.000000000","message":"Correct.\n\nI agree with you 100% that taking unencrypted snapshots of encrypted data is somewhat strange, though perhaps still useful. The issue is that, AFAIK, Glance does not provide support for associating a snapshot with an encryption key; so while we could easily snapshot the encrypted data the snapshot will be useless in Glance.\n\nThis is something we are still actively pursuing and any ideas or suggestions on this front would be most welcome.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c30f8f4dd2236b8f6498db852952c4bacba1686e","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            cmd \u003d (\u0027lvremove\u0027, \u0027-f\u0027, self.snapshot_path)"},{"line_number":468,"context_line":"            libvirt_utils.execute(*cmd, run_as_root\u003dTrue, attempts\u003d3)"},{"line_number":469,"context_line":"        else:"},{"line_number":470,"context_line":"            pass"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"class RBDVolumeProxy(object):"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FcsM%3D","line":470,"updated":"2013-11-06 01:35:09.000000000","message":"Again very bogus","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"628fe25a329a4e9f1059ba80a293743ac8642804","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            cmd \u003d (\u0027lvremove\u0027, \u0027-f\u0027, self.snapshot_path)"},{"line_number":468,"context_line":"            libvirt_utils.execute(*cmd, run_as_root\u003dTrue, attempts\u003d3)"},{"line_number":469,"context_line":"        else:"},{"line_number":470,"context_line":"            pass"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"class RBDVolumeProxy(object):"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FBHE%3D","line":470,"in_reply_to":"AAAATn%2F%2FbKc%3D","updated":"2013-11-15 16:46:47.000000000","message":"Done","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"69d73c13a600c20b41d50401dfcc44b2aa19f11c","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            cmd \u003d (\u0027lvremove\u0027, \u0027-f\u0027, self.snapshot_path)"},{"line_number":468,"context_line":"            libvirt_utils.execute(*cmd, run_as_root\u003dTrue, attempts\u003d3)"},{"line_number":469,"context_line":"        else:"},{"line_number":470,"context_line":"            pass"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"class RBDVolumeProxy(object):"}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FbKc%3D","line":470,"in_reply_to":"AAAATn%2F%2FcsM%3D","updated":"2013-11-06 14:36:21.000000000","message":"The answer is the same as for the previous comment. Because we are not using lvcreate to create a \"temporary\" snapshot there is no need to remove it, so we are not silently passing the buck.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                CONF.ephemeral_storage_encryption.key_size,"},{"line_number":411,"context_line":"                key)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        def create_lvm_image(base, size):"},{"line_number":414,"context_line":"            base_size \u003d disk.get_disk_size(base)"},{"line_number":415,"context_line":"            self.verify_base_size(base, size, base_size\u003dbase_size)"},{"line_number":416,"context_line":"            resize \u003d size \u003e base_size"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJxA%3D","line":413,"updated":"2013-12-01 12:59:30.000000000","message":"you have removed the locking here. is this on purpose?","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                CONF.ephemeral_storage_encryption.key_size,"},{"line_number":411,"context_line":"                key)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        def create_lvm_image(base, size):"},{"line_number":414,"context_line":"            base_size \u003d disk.get_disk_size(base)"},{"line_number":415,"context_line":"            self.verify_base_size(base, size, base_size\u003dbase_size)"},{"line_number":416,"context_line":"            resize \u003d size \u003e base_size"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BFTY%3D","line":413,"in_reply_to":"AAAATn%2F%2BJxA%3D","updated":"2013-12-02 22:48:06.000000000","message":"no, this is a mistake.","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":417,"context_line":"            size \u003d size if resize else base_size"},{"line_number":418,"context_line":"            libvirt_utils.create_lvm_image(self.vg, self.lv,"},{"line_number":419,"context_line":"                                           size, sparse\u003dself.sparse)"},{"line_number":420,"context_line":"            if self.ephemeral_key_uuid is not None:"},{"line_number":421,"context_line":"                encrypt_lvm_image()"},{"line_number":422,"context_line":"            images.convert_image(base, self.path, \u0027raw\u0027, run_as_root\u003dTrue)"},{"line_number":423,"context_line":"            if resize:"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJw8%3D","line":420,"updated":"2013-12-01 12:59:30.000000000","message":"consider: \nif self.ephemeral_key_uuid:","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":431,"context_line":"            else:"},{"line_number":432,"context_line":"                LOG.error(_(\"Instance disk to be encrypted but no context\""},{"line_number":433,"context_line":"                            \" provided\"))"},{"line_number":434,"context_line":"                raise Exception"},{"line_number":435,"context_line":"        #Generate images with specified size right on volume"},{"line_number":436,"context_line":"        if generated and size:"},{"line_number":437,"context_line":"            libvirt_utils.create_lvm_image(self.vg, self.lv,"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAATn%2F%2BJw4%3D","line":434,"updated":"2013-12-01 12:59:30.000000000","message":"please use a Nova Exception","commit_id":"6bd32af1b19d43f8f82c86f7880c92b9be791a42"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    libvirt_utils.execute(\u0027cryptsetup\u0027,"},{"line_number":457,"context_line":"                                          \u0027remove\u0027,"},{"line_number":458,"context_line":"                                          path.rpartition(\u0027/\u0027)[2],"},{"line_number":459,"context_line":"                                          run_as_root\u003dTrue)"},{"line_number":460,"context_line":"                    libvirt_utils.remove_logical_volumes(self.lv_path)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def snapshot_extract(self, target, out_format):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97hU%3D","line":459,"updated":"2013-12-04 10:49:42.000000000","message":"Again why not use the \u0027cryptdestroy\u0027 method you created.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"a125b583ff46844e6b8803d679fdb5f253e1a887","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    libvirt_utils.execute(\u0027cryptsetup\u0027,"},{"line_number":457,"context_line":"                                          \u0027remove\u0027,"},{"line_number":458,"context_line":"                                          path.rpartition(\u0027/\u0027)[2],"},{"line_number":459,"context_line":"                                          run_as_root\u003dTrue)"},{"line_number":460,"context_line":"                    libvirt_utils.remove_logical_volumes(self.lv_path)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def snapshot_extract(self, target, out_format):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96Wg%3D","line":459,"in_reply_to":"AAAATn%2F96d8%3D","updated":"2013-12-04 15:34:07.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"aab0ed522d48fd3994b0b8e8c01485a542de9aaf","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    libvirt_utils.execute(\u0027cryptsetup\u0027,"},{"line_number":457,"context_line":"                                          \u0027remove\u0027,"},{"line_number":458,"context_line":"                                          path.rpartition(\u0027/\u0027)[2],"},{"line_number":459,"context_line":"                                          run_as_root\u003dTrue)"},{"line_number":460,"context_line":"                    libvirt_utils.remove_logical_volumes(self.lv_path)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def snapshot_extract(self, target, out_format):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96d8%3D","line":459,"in_reply_to":"AAAATn%2F96kE%3D","updated":"2013-12-04 15:13:21.000000000","message":"The overhead of one extra function call here is going to be completely invisible in the scheme of everything that happens in running cryptsetup, so I don\u0027t think there\u0027s any speed tradeoff.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":456,"context_line":"                    libvirt_utils.execute(\u0027cryptsetup\u0027,"},{"line_number":457,"context_line":"                                          \u0027remove\u0027,"},{"line_number":458,"context_line":"                                          path.rpartition(\u0027/\u0027)[2],"},{"line_number":459,"context_line":"                                          run_as_root\u003dTrue)"},{"line_number":460,"context_line":"                    libvirt_utils.remove_logical_volumes(self.lv_path)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def snapshot_extract(self, target, out_format):"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96kE%3D","line":459,"in_reply_to":"AAAATn%2F97hU%3D","updated":"2013-12-04 14:56:33.000000000","message":"This seems to be a trade-off between speed and abstraction(?). I guess an extra function call is not too high a price for clean code.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"fd91511d4badd6f314a292ab073cdcfcdb8cd716","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if CONF.ephemeral_storage_encryption.enabled and \\"},{"line_number":259,"context_line":"            disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"},{"line_number":260,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":261,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"},{"line_number":262,"context_line":"                                  \u0027only for LVM images.\u0027))"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9OMY%3D","line":259,"updated":"2013-12-13 21:13:33.000000000","message":"I don\u0027t like this indentation because the continuation line exactly matches the indentation of the next line which is not a continuation.  I think the continuation line should be indented more.  Also, PEP8 prefers parentheses to a \\.","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0edc0a499f151d5ed2f5a8894edb821b6a26a428","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        if CONF.ephemeral_storage_encryption.enabled and \\"},{"line_number":259,"context_line":"            disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"},{"line_number":260,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":261,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"},{"line_number":262,"context_line":"                                  \u0027only for LVM images.\u0027))"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9N18%3D","line":259,"in_reply_to":"AAAATn%2F9OMY%3D","updated":"2013-12-13 22:10:30.000000000","message":"Done","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"fd91511d4badd6f314a292ab073cdcfcdb8cd716","unresolved":false,"context_lines":[{"line_number":379,"context_line":"            # NOTE(dgenin):  When used to create a snapshot we are not"},{"line_number":380,"context_line":"            # given an instance object so ephemeral_key_uuid cannot be"},{"line_number":381,"context_line":"            # used to detect encryption."},{"line_number":382,"context_line":"            if self.ephemeral_key_uuid is None and \\"},{"line_number":383,"context_line":"                    not CONF.ephemeral_storage_encryption.enabled:"},{"line_number":384,"context_line":"                info \u003d libvirt_utils.logical_volume_info(path)"},{"line_number":385,"context_line":"                self.vg \u003d info[\u0027VG\u0027]"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9OKM%3D","line":382,"updated":"2013-12-13 21:13:33.000000000","message":"PEP8 says () is better than \\","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0edc0a499f151d5ed2f5a8894edb821b6a26a428","unresolved":false,"context_lines":[{"line_number":379,"context_line":"            # NOTE(dgenin):  When used to create a snapshot we are not"},{"line_number":380,"context_line":"            # given an instance object so ephemeral_key_uuid cannot be"},{"line_number":381,"context_line":"            # used to detect encryption."},{"line_number":382,"context_line":"            if self.ephemeral_key_uuid is None and \\"},{"line_number":383,"context_line":"                    not CONF.ephemeral_storage_encryption.enabled:"},{"line_number":384,"context_line":"                info \u003d libvirt_utils.logical_volume_info(path)"},{"line_number":385,"context_line":"                self.vg \u003d info[\u0027VG\u0027]"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9N10%3D","line":382,"in_reply_to":"AAAATn%2F9OKM%3D","updated":"2013-12-13 22:10:30.000000000","message":"Done","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"fd91511d4badd6f314a292ab073cdcfcdb8cd716","unresolved":false,"context_lines":[{"line_number":399,"context_line":"            if self.ephemeral_key_uuid is None:"},{"line_number":400,"context_line":"                self.path \u003d os.path.join(\u0027/dev\u0027, self.vg, self.lv)"},{"line_number":401,"context_line":"            else:"},{"line_number":402,"context_line":"                self.lv_path \u003d os.path.join(\u0027/dev/\u0027, self.vg, self.lv)"},{"line_number":403,"context_line":"                self.path \u003d \u0027/dev/mapper/\u0027 + self.lv + \u0027-dmcrypt\u0027"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        # TODO(pbrady): possibly deprecate libvirt.sparse_logical_volumes"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9OKg%3D","line":402,"updated":"2013-12-13 21:13:33.000000000","message":"The extra / you added here is unnecessary since os.path.join adds it.  I guess it doesn\u0027t hurt anything since os.path.join won\u0027t make it \u0027//\u0027, but I\u0027d make it consistent with the one above which doesn\u0027t have the extra /.","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"0edc0a499f151d5ed2f5a8894edb821b6a26a428","unresolved":false,"context_lines":[{"line_number":399,"context_line":"            if self.ephemeral_key_uuid is None:"},{"line_number":400,"context_line":"                self.path \u003d os.path.join(\u0027/dev\u0027, self.vg, self.lv)"},{"line_number":401,"context_line":"            else:"},{"line_number":402,"context_line":"                self.lv_path \u003d os.path.join(\u0027/dev/\u0027, self.vg, self.lv)"},{"line_number":403,"context_line":"                self.path \u003d \u0027/dev/mapper/\u0027 + self.lv + \u0027-dmcrypt\u0027"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        # TODO(pbrady): possibly deprecate libvirt.sparse_logical_volumes"}],"source_content_type":"text/x-python","patch_set":48,"id":"AAAATn%2F9N1w%3D","line":402,"in_reply_to":"AAAATn%2F9OKg%3D","updated":"2013-12-13 22:10:30.000000000","message":"Done","commit_id":"d529407fde849029546e8dc7140fa833172c9259"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"a3b8f7757ece8fbaf962dcdfa6d9bd0af5349f01","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":367,"context_line":"        super(Lvm, self).__init__(\"block\", \"raw\", is_block_dev\u003dTrue)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        if instance and \u0027ephemeral_key_uuid\u0027 in instance:"},{"line_number":370,"context_line":"            self.ephemeral_key_uuid \u003d instance.get(\u0027ephemeral_key_uuid\u0027)"},{"line_number":371,"context_line":"        else:"},{"line_number":372,"context_line":"            self.ephemeral_key_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":53,"id":"AAAAUH%2F%2F8Ak%3D","line":369,"updated":"2014-01-06 14:59:04.000000000","message":"I think the \"in\" check isn\u0027t needed since you use get(), which does that.","commit_id":"1baba09fefa020ee298c303cc27892799a0c254a"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"104a2bb7d3f2bee650d3ed379e37bc0e9aa081b4","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":367,"context_line":"        super(Lvm, self).__init__(\"block\", \"raw\", is_block_dev\u003dTrue)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        if instance and \u0027ephemeral_key_uuid\u0027 in instance:"},{"line_number":370,"context_line":"            self.ephemeral_key_uuid \u003d instance.get(\u0027ephemeral_key_uuid\u0027)"},{"line_number":371,"context_line":"        else:"},{"line_number":372,"context_line":"            self.ephemeral_key_uuid \u003d None"}],"source_content_type":"text/x-python","patch_set":53,"id":"AAAAUH%2F%2F7m0%3D","line":369,"in_reply_to":"AAAAUH%2F%2F8Ak%3D","updated":"2014-01-06 16:26:03.000000000","message":"Done","commit_id":"1baba09fefa020ee298c303cc27892799a0c254a"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"a3b8f7757ece8fbaf962dcdfa6d9bd0af5349f01","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            self.ephemeral_key_uuid \u003d None"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":375,"context_line":"            self.key_manager \u003d keymgr.API()"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        if path:"},{"line_number":378,"context_line":"            # NOTE(dgenin):  When used to create a snapshot we are not"}],"source_content_type":"text/x-python","patch_set":53,"id":"AAAAUH%2F%2F7%2F4%3D","line":375,"updated":"2014-01-06 14:59:04.000000000","message":"You could do \"else: self.key_manager \u003d None\" so that self.key_manager always exists.  Objects that always have the same set of attributes are easier to work with.","commit_id":"1baba09fefa020ee298c303cc27892799a0c254a"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"104a2bb7d3f2bee650d3ed379e37bc0e9aa081b4","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            self.ephemeral_key_uuid \u003d None"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":375,"context_line":"            self.key_manager \u003d keymgr.API()"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        if path:"},{"line_number":378,"context_line":"            # NOTE(dgenin):  When used to create a snapshot we are not"}],"source_content_type":"text/x-python","patch_set":53,"id":"AAAAUH%2F%2F7ms%3D","line":375,"in_reply_to":"AAAAUH%2F%2F7%2F4%3D","updated":"2014-01-06 16:26:03.000000000","message":"Done","commit_id":"1baba09fefa020ee298c303cc27892799a0c254a"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    rados \u003d None"},{"line_number":45,"context_line":"    rbd \u003d None"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"__imagebackend_opts \u003d ["},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027images_type\u0027,"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNx0%3D","line":47,"updated":"2014-02-14 20:25:41.000000000","message":"Why did you move this?  Seems like needless churn.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    rados \u003d None"},{"line_number":45,"context_line":"    rbd \u003d None"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"__imagebackend_opts \u003d ["},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027images_type\u0027,"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNjc%3D","line":47,"in_reply_to":"AAAAUX%2F%2FNx0%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                info \u003d libvirt_utils.logical_volume_info(path)"},{"line_number":372,"context_line":"                self.vg \u003d info[\u0027VG\u0027]"},{"line_number":373,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":374,"context_line":"                self.path \u003d path"},{"line_number":375,"context_line":"            else:"},{"line_number":376,"context_line":"                self.vg \u003d CONF.libvirt.images_volume_group"},{"line_number":377,"context_line":"                self.path \u003d path"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNxQ%3D","line":374,"updated":"2014-02-14 20:25:41.000000000","message":"This line could be pulled out of the if and else since both have it.","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                info \u003d libvirt_utils.logical_volume_info(path)"},{"line_number":372,"context_line":"                self.vg \u003d info[\u0027VG\u0027]"},{"line_number":373,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":374,"context_line":"                self.path \u003d path"},{"line_number":375,"context_line":"            else:"},{"line_number":376,"context_line":"                self.vg \u003d CONF.libvirt.images_volume_group"},{"line_number":377,"context_line":"                self.path \u003d path"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNjU%3D","line":374,"in_reply_to":"AAAAUX%2F%2FNxQ%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"cf35de72e980421b91024f993ecac0c051be6ce0","unresolved":false,"context_lines":[{"line_number":400,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":401,"context_line":"        def encrypt_lvm_image():"},{"line_number":402,"context_line":"            dmcrypt.create_volume(self.path.rpartition(\u0027/\u0027)[2],"},{"line_number":403,"context_line":"                               self.lv_path,"},{"line_number":404,"context_line":"                               CONF.ephemeral_storage_encryption.cipher,"},{"line_number":405,"context_line":"                               CONF.ephemeral_storage_encryption.key_size,"},{"line_number":406,"context_line":"                               key)"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNwY%3D","line":403,"updated":"2014-02-14 20:25:41.000000000","message":"it would look better (and not hit 80 columns) if you indented the other parameters 3 more spaces to line up with the first","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ff9bc9666cc4d797820826691e604e4cf059cf64","unresolved":false,"context_lines":[{"line_number":400,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":401,"context_line":"        def encrypt_lvm_image():"},{"line_number":402,"context_line":"            dmcrypt.create_volume(self.path.rpartition(\u0027/\u0027)[2],"},{"line_number":403,"context_line":"                               self.lv_path,"},{"line_number":404,"context_line":"                               CONF.ephemeral_storage_encryption.cipher,"},{"line_number":405,"context_line":"                               CONF.ephemeral_storage_encryption.key_size,"},{"line_number":406,"context_line":"                               key)"}],"source_content_type":"text/x-python","patch_set":70,"id":"AAAAUX%2F%2FNjE%3D","line":403,"in_reply_to":"AAAAUX%2F%2FNwY%3D","updated":"2014-02-14 20:44:12.000000000","message":"Done","commit_id":"cec40062c938fb7dab070642b26fdf93df1507df"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5ed69b12ca785ca6486cc360cd2f1bba1bb60d4","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":246,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        if (CONF.ephemeral_storage_encryption.enabled and"},{"line_number":249,"context_line":"                disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":250,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":251,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2B0jU%3D","line":248,"updated":"2014-02-18 20:06:01.000000000","message":"Recommend adding this check to the Image object initializer rather than to all subclasses individually. The default behavior would be to throw an exception unless the subclass (e.g., LVM) explicitly overrides this behavior because it supports encryption. This approach is more maintainable when new subclasses are added.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"55d854f102633b4d5d69c544e9e0a4e8253789c5","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":246,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        if (CONF.ephemeral_storage_encryption.enabled and"},{"line_number":249,"context_line":"                disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":250,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":251,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2Buh4%3D","line":248,"in_reply_to":"AAAAUX%2F%2B0jU%3D","updated":"2014-02-19 14:52:41.000000000","message":"Agreed, the base class could define a \"def supports_encryption()\u0027 method which returns False, and subclasses would override that.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"9c913b95d0b730df5ebe3e60ef4cf5b5dc10fdbb","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":246,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        if (CONF.ephemeral_storage_encryption.enabled and"},{"line_number":249,"context_line":"                disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":250,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":251,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2BiSA%3D","line":248,"in_reply_to":"AAAAUX%2F%2BkWg%3D","updated":"2014-02-20 17:02:07.000000000","message":"Ah, great idea! Why didn\u0027t I think of that... Thanks, Peter.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":7764,"name":"Peter Hamilton","email":"peter.hamilton@jhuapl.edu","username":"Peter"},"change_message_id":"a064ef96433dca7ebb7241e02c6dc75ee221ed48","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":246,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        if (CONF.ephemeral_storage_encryption.enabled and"},{"line_number":249,"context_line":"                disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":250,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":251,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2BkWg%3D","line":248,"in_reply_to":"AAAAUX%2F%2BkbE%3D","updated":"2014-02-20 13:31:18.000000000","message":"Why not add the disk_name as a subclass member above this conditional, and then invoke supports_encryption() and reference self.disk_name in the subclass implementation? You wouldn\u0027t need to add any disk_name parameter then and the base class implementation of supports_encryption would be clean and simple (i.e., return False).","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"6820e55c0c0fabf02baefd90ea171ba003edf6e7","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":246,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        if (CONF.ephemeral_storage_encryption.enabled and"},{"line_number":249,"context_line":"                disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":250,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":251,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2BkbE%3D","line":248,"in_reply_to":"AAAAUX%2F%2BuOM%3D","updated":"2014-02-20 13:22:55.000000000","message":"\u003e I could add disk_name as a parameter to the Image initializer but this goes counter to the base class containing only the basic information necessary for all classes.\n\nI think that\u0027s a necessary evil in this case. The current approach is less maintainable.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"309f5119da0c302957bbfb21d71b1351e18cb473","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone):"},{"line_number":246,"context_line":"        super(Raw, self).__init__(\"file\", \"raw\", is_block_dev\u003dFalse)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        if (CONF.ephemeral_storage_encryption.enabled and"},{"line_number":249,"context_line":"                disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":250,"context_line":"            raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":251,"context_line":"                                  \u0027ephemeral storage encryption is supported \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"AAAAUX%2F%2BuOM%3D","line":248,"in_reply_to":"AAAAUX%2F%2Buh4%3D","updated":"2014-02-19 15:58:38.000000000","message":"This is going to be hard to do cleanly precisely because of the second half of the test, following this comment. Because Raw backend is always used to create kernel, ramdisk and disk.config, the supports_encryption() method, called in the Image initializer, would have to know the disk name but this information is not available in the base class. I could add disk_name as a parameter to the Image initializer but this goes counter to the base class containing only the basic information necessary for all classes. Unless I misunderstood what you had in mind.","commit_id":"197d707a247d9661b91d0c5e4d87636882b5e19a"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"c94cce8925b063e5c09659d69aae7d5606ab5518","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        #        disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":263,"context_line":"        #    raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":264,"context_line":"        #                          \u0027ephemeral storage encryption is supported \u0027"},{"line_number":265,"context_line":"        #                          \u0027only for LVM images.\u0027))"},{"line_number":266,"context_line":"        self.path \u003d (path or"},{"line_number":267,"context_line":"                     os.path.join(libvirt_utils.get_instance_path(instance),"},{"line_number":268,"context_line":"                                  disk_name))"}],"source_content_type":"text/x-python","patch_set":74,"id":"AAAAUX%2F%2Bf6w%3D","line":265,"updated":"2014-02-20 20:58:30.000000000","message":"These lines should be removed rather than commented out.","commit_id":"fc913b7a0a559e4dae295537c1c338b16348b2dc"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"8427d9238c94be54c3a597e8891476a2ddd7104b","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        #        disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]):"},{"line_number":263,"context_line":"        #    raise exception.NovaException(_(\u0027Incompatible settings: \u0027"},{"line_number":264,"context_line":"        #                          \u0027ephemeral storage encryption is supported \u0027"},{"line_number":265,"context_line":"        #                          \u0027only for LVM images.\u0027))"},{"line_number":266,"context_line":"        self.path \u003d (path or"},{"line_number":267,"context_line":"                     os.path.join(libvirt_utils.get_instance_path(instance),"},{"line_number":268,"context_line":"                                  disk_name))"}],"source_content_type":"text/x-python","patch_set":74,"id":"AAAAUX%2F%2BfgU%3D","line":265,"in_reply_to":"AAAAUX%2F%2Bf6w%3D","updated":"2014-02-20 21:46:45.000000000","message":"Done","commit_id":"fc913b7a0a559e4dae295537c1c338b16348b2dc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"884a7fbbc2c4762425baff8dd55b6163ac4fe224","unresolved":false,"context_lines":[{"line_number":80,"context_line":"CONF.import_opt(\u0027image_cache_subdirectory_name\u0027, \u0027nova.virt.imagecache\u0027)"},{"line_number":81,"context_line":"CONF.import_opt(\u0027preallocate_images\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":82,"context_line":"CONF.import_opt(\u0027enabled\u0027, \u0027nova.compute.api\u0027,"},{"line_number":83,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":84,"context_line":"CONF.import_opt(\u0027cipher\u0027, \u0027nova.compute.api\u0027,"},{"line_number":85,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":86,"context_line":"CONF.import_opt(\u0027key_size\u0027, \u0027nova.compute.api\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F5Ig%3D","line":83,"updated":"2014-02-27 15:19:30.000000000","message":"Same.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4ae3bb7f79b64829230c51be301697bca42b4390","unresolved":false,"context_lines":[{"line_number":80,"context_line":"CONF.import_opt(\u0027image_cache_subdirectory_name\u0027, \u0027nova.virt.imagecache\u0027)"},{"line_number":81,"context_line":"CONF.import_opt(\u0027preallocate_images\u0027, \u0027nova.virt.driver\u0027)"},{"line_number":82,"context_line":"CONF.import_opt(\u0027enabled\u0027, \u0027nova.compute.api\u0027,"},{"line_number":83,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":84,"context_line":"CONF.import_opt(\u0027cipher\u0027, \u0027nova.compute.api\u0027,"},{"line_number":85,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":86,"context_line":"CONF.import_opt(\u0027key_size\u0027, \u0027nova.compute.api\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F3Hk%3D","line":83,"in_reply_to":"AAAAVX%2F%2F5Ig%3D","updated":"2014-02-27 18:56:31.000000000","message":"Done","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"884a7fbbc2c4762425baff8dd55b6163ac4fe224","unresolved":false,"context_lines":[{"line_number":522,"context_line":"class Rbd(Image):"},{"line_number":523,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone, **kwargs):"},{"line_number":524,"context_line":"        super(Rbd, self).__init__(\"block\", \"rbd\", is_block_dev\u003dTrue)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        if path:"},{"line_number":527,"context_line":"            try:"},{"line_number":528,"context_line":"                self.rbd_name \u003d path.split(\u0027/\u0027)[1]"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F5Hk%3D","line":525,"updated":"2014-02-27 15:19:30.000000000","message":"Please don\u0027t add unrelated whitespace damage.","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4ae3bb7f79b64829230c51be301697bca42b4390","unresolved":false,"context_lines":[{"line_number":522,"context_line":"class Rbd(Image):"},{"line_number":523,"context_line":"    def __init__(self, instance\u003dNone, disk_name\u003dNone, path\u003dNone, **kwargs):"},{"line_number":524,"context_line":"        super(Rbd, self).__init__(\"block\", \"rbd\", is_block_dev\u003dTrue)"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        if path:"},{"line_number":527,"context_line":"            try:"},{"line_number":528,"context_line":"                self.rbd_name \u003d path.split(\u0027/\u0027)[1]"}],"source_content_type":"text/x-python","patch_set":75,"id":"AAAAVX%2F%2F3G4%3D","line":525,"in_reply_to":"AAAAVX%2F%2F5Hk%3D","updated":"2014-02-27 18:56:31.000000000","message":"Done","commit_id":"73da6f9b152dfe7c12542bad662fe1b1fc27a9c5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                self.vg \u003d info[\u0027VG\u0027]"},{"line_number":396,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":397,"context_line":"            else:"},{"line_number":398,"context_line":"                self.vg \u003d CONF.libvirt.images_volume_group"},{"line_number":399,"context_line":"        else:"},{"line_number":400,"context_line":"            if not CONF.libvirt.images_volume_group:"},{"line_number":401,"context_line":"                raise RuntimeError(_(\u0027You should specify\u0027"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz5E%3D","line":398,"updated":"2014-03-04 00:49:52.000000000","message":"Is this necessary? Meaning, won\u0027t info[\u0027VG\u0027] be the right thing if images_volume_group is set? If it\u0027s not, it doesn\u0027t seem like taking the conf variable is the right thing to do either.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                self.vg \u003d info[\u0027VG\u0027]"},{"line_number":396,"context_line":"                self.lv \u003d info[\u0027LV\u0027]"},{"line_number":397,"context_line":"            else:"},{"line_number":398,"context_line":"                self.vg \u003d CONF.libvirt.images_volume_group"},{"line_number":399,"context_line":"        else:"},{"line_number":400,"context_line":"            if not CONF.libvirt.images_volume_group:"},{"line_number":401,"context_line":"                raise RuntimeError(_(\u0027You should specify\u0027"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Ftiw%3D","line":398,"in_reply_to":"AAAAVn%2F%2Fz5E%3D","updated":"2014-03-04 15:14:25.000000000","message":"This path is exercised only by the snapshoting functionality, when an image already exists. The reason logical_volume_info() cannot be used to extract information about an encrypted image is that path points to the dmcrypt device rather than the actual logical volume.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                self.path \u003d os.path.join(\u0027/dev\u0027, self.vg, self.lv)"},{"line_number":409,"context_line":"            else:"},{"line_number":410,"context_line":"                self.lv_path \u003d os.path.join(\u0027/dev\u0027, self.vg, self.lv)"},{"line_number":411,"context_line":"                self.path \u003d \u0027/dev/mapper/\u0027 + dmcrypt.volume_name(self.lv)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        # TODO(pbrady): possibly deprecate libvirt.sparse_logical_volumes"},{"line_number":414,"context_line":"        # for the more general preallocate_images"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz38%3D","line":411,"updated":"2014-03-04 00:49:52.000000000","message":"I\u0027d really like to see this be unified a bit. Can we wrap things like this into a helper function like:\n\n def get_vol_name(self):\n    if self.ephemeral_key_id is None:\n    ....","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                self.path \u003d os.path.join(\u0027/dev\u0027, self.vg, self.lv)"},{"line_number":409,"context_line":"            else:"},{"line_number":410,"context_line":"                self.lv_path \u003d os.path.join(\u0027/dev\u0027, self.vg, self.lv)"},{"line_number":411,"context_line":"                self.path \u003d \u0027/dev/mapper/\u0027 + dmcrypt.volume_name(self.lv)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"        # TODO(pbrady): possibly deprecate libvirt.sparse_logical_volumes"},{"line_number":414,"context_line":"        # for the more general preallocate_images"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FtgQ%3D","line":411,"in_reply_to":"AAAAVn%2F%2Fz38%3D","updated":"2014-03-04 15:14:25.000000000","message":"There is only one place this comes up so I don\u0027t know how much sense it makes to move this into a separate function. (My understanding, perhaps flawed, is that functions are usually introduced for code that is reused.) But if you think this will make the code clearer I am happy to make the change.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        self.preallocate \u003d not self.sparse"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def _supports_encryption(self):"},{"line_number":419,"context_line":"        return True"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def _can_fallocate(self):"},{"line_number":422,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz3s%3D","line":419,"updated":"2014-03-04 00:49:52.000000000","message":"What\u0027s the point of this? Does something subclass it that changes it?","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        self.preallocate \u003d not self.sparse"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def _supports_encryption(self):"},{"line_number":419,"context_line":"        return True"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def _can_fallocate(self):"},{"line_number":422,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Ftfk%3D","line":419,"in_reply_to":"AAAAVn%2F%2Fz3s%3D","updated":"2014-03-04 15:14:25.000000000","message":"This function is used in Image superclass to figure out which backends support encryption. The default is False so any backend that supports encryption must overload this function.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":425,"context_line":"        def encrypt_lvm_image():"},{"line_number":426,"context_line":"            dmcrypt.create_volume(self.path.rpartition(\u0027/\u0027)[2],"},{"line_number":427,"context_line":"                                  self.lv_path,"},{"line_number":428,"context_line":"                                  CONF.ephemeral_storage_encryption.cipher,"},{"line_number":429,"context_line":"                                  CONF.ephemeral_storage_encryption.key_size,"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz3M%3D","line":426,"updated":"2014-03-04 00:49:52.000000000","message":"Same hard-to-figure argument here.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def create_image(self, prepare_template, base, size, *args, **kwargs):"},{"line_number":425,"context_line":"        def encrypt_lvm_image():"},{"line_number":426,"context_line":"            dmcrypt.create_volume(self.path.rpartition(\u0027/\u0027)[2],"},{"line_number":427,"context_line":"                                  self.lv_path,"},{"line_number":428,"context_line":"                                  CONF.ephemeral_storage_encryption.cipher,"},{"line_number":429,"context_line":"                                  CONF.ephemeral_storage_encryption.key_size,"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FtcI%3D","line":426,"in_reply_to":"AAAAVn%2F%2Fz3M%3D","updated":"2014-03-04 15:14:25.000000000","message":"Just following precedent (cf. LIbvirtDriver.swap_volume(), detach_volume(), etc.). How do you propose to make this clearer?","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":461,"context_line":"                                           size, sparse\u003dself.sparse)"},{"line_number":462,"context_line":"            with self.remove_volume_on_error(self.path):"},{"line_number":463,"context_line":"                if self.ephemeral_key_uuid:"},{"line_number":464,"context_line":"                    encrypt_lvm_image()"},{"line_number":465,"context_line":"                prepare_template(target\u003dself.path, *args, **kwargs)"},{"line_number":466,"context_line":"        else:"},{"line_number":467,"context_line":"            if \u0027context\u0027 in kwargs and \u0027swap_mb\u0027 in kwargs:"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz2U%3D","line":464,"updated":"2014-03-04 00:49:52.000000000","message":"Maybe a self.maybe_encrypt() or something? Again, seems like this is really a bolt-on feature if we have \"if thing: do other thing\" everywhere in here.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":461,"context_line":"                                           size, sparse\u003dself.sparse)"},{"line_number":462,"context_line":"            with self.remove_volume_on_error(self.path):"},{"line_number":463,"context_line":"                if self.ephemeral_key_uuid:"},{"line_number":464,"context_line":"                    encrypt_lvm_image()"},{"line_number":465,"context_line":"                prepare_template(target\u003dself.path, *args, **kwargs)"},{"line_number":466,"context_line":"        else:"},{"line_number":467,"context_line":"            if \u0027context\u0027 in kwargs and \u0027swap_mb\u0027 in kwargs:"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FtW8%3D","line":464,"in_reply_to":"AAAAVn%2F%2Fz2U%3D","updated":"2014-03-04 15:14:25.000000000","message":"As I wrote above it seems to introduce an additional level of indirection for someone reading the code but if you believe this makes it clearer I will be happy to make the change.\n\nThe alternative is to create a separate EncryptedLvm backend, which would certainly eliminate a lot of the conditionals here but will push them up into driver, because instance object does not know carry information on which backend is being used, and this info has to be extracted from the file system location of the disk, which is really cumbersome.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                prepare_template(target\u003dself.path, *args, **kwargs)"},{"line_number":466,"context_line":"        else:"},{"line_number":467,"context_line":"            if \u0027context\u0027 in kwargs and \u0027swap_mb\u0027 in kwargs:"},{"line_number":468,"context_line":"                kwargs.pop(\u0027context\u0027)"},{"line_number":469,"context_line":"            if not os.path.exists(base):"},{"line_number":470,"context_line":"                prepare_template(target\u003dbase, max_size\u003dsize, *args, **kwargs)"},{"line_number":471,"context_line":"            with self.remove_volume_on_error(self.path):"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz2I%3D","line":468,"updated":"2014-03-04 00:49:52.000000000","message":"Is this related?","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                prepare_template(target\u003dself.path, *args, **kwargs)"},{"line_number":466,"context_line":"        else:"},{"line_number":467,"context_line":"            if \u0027context\u0027 in kwargs and \u0027swap_mb\u0027 in kwargs:"},{"line_number":468,"context_line":"                kwargs.pop(\u0027context\u0027)"},{"line_number":469,"context_line":"            if not os.path.exists(base):"},{"line_number":470,"context_line":"                prepare_template(target\u003dbase, max_size\u003dsize, *args, **kwargs)"},{"line_number":471,"context_line":"            with self.remove_volume_on_error(self.path):"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FtUk%3D","line":468,"in_reply_to":"AAAAVn%2F%2Fz2I%3D","updated":"2014-03-04 15:14:25.000000000","message":"Since swap creation function, called as prepare_template(), does not accept a context argument it has to be removed from the kwargs. I believe this could actually be combined with lines 458-459 because swap disk is also \"generated\" but I didn\u0027t feel confident enough to move this around.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d79de3f8a94d975212cf13ee827cfa26eeeadc8c","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    libvirt_utils.remove_logical_volumes(path)"},{"line_number":482,"context_line":"                else:"},{"line_number":483,"context_line":"                    dmcrypt.delete_volume(path.rpartition(\u0027/\u0027)[2])"},{"line_number":484,"context_line":"                    libvirt_utils.remove_logical_volumes(self.lv_path)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    def snapshot_extract(self, target, out_format):"},{"line_number":487,"context_line":"        images.convert_image(self.path, target, out_format,"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2Fz14%3D","line":484,"updated":"2014-03-04 00:49:52.000000000","message":"Again, this could use some unification as above.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"b454832cb83e5a7622683d78f95bb15b2aadaf54","unresolved":false,"context_lines":[{"line_number":481,"context_line":"                    libvirt_utils.remove_logical_volumes(path)"},{"line_number":482,"context_line":"                else:"},{"line_number":483,"context_line":"                    dmcrypt.delete_volume(path.rpartition(\u0027/\u0027)[2])"},{"line_number":484,"context_line":"                    libvirt_utils.remove_logical_volumes(self.lv_path)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    def snapshot_extract(self, target, out_format):"},{"line_number":487,"context_line":"        images.convert_image(self.path, target, out_format,"}],"source_content_type":"text/x-python","patch_set":80,"id":"AAAAVn%2F%2FtUM%3D","line":484,"in_reply_to":"AAAAVn%2F%2Fz14%3D","updated":"2014-03-04 15:14:25.000000000","message":"Same as above.","commit_id":"e26ea52eef628d66ce8bb5f55aa0b41820a5209c"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"e1becb513340d3bea9063fac223293fc24e3262a","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        if self.disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"},{"line_number":359,"context_line":"            return False"},{"line_number":360,"context_line":"        else:"},{"line_number":361,"context_line":"            return True"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def correct_format(self):"},{"line_number":364,"context_line":"        if os.path.exists(self.path):"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_ccc9057b","line":361,"updated":"2014-08-15 14:07:07.000000000","message":"Can you add a comment as to why we\u0027re returning \u0027True\u0027 for kenrel/ramdisk/disk.config. I\u0027m guessing we\u0027re doing that because the contain no sensitive info and we don\u0027t want to deal with properly supporting encryption of them, so we\u0027re just lieing ?","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"3feddaa9a76c04bff72f0beea9b8f005c22fc86c","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        if self.disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"},{"line_number":359,"context_line":"            return False"},{"line_number":360,"context_line":"        else:"},{"line_number":361,"context_line":"            return True"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def correct_format(self):"},{"line_number":364,"context_line":"        if os.path.exists(self.path):"}],"source_content_type":"text/x-python","patch_set":88,"id":"7ac7a964_40d77423","line":361,"in_reply_to":"7ac7a964_ccc9057b","updated":"2014-08-15 15:30:22.000000000","message":"We could encrypt these once encryption is supported for raw, although, I think you are right about these files typically not being sensitive. We have to lie currently because otherwise we can\u0027t boot the instance. I will add a comment explaining this.","commit_id":"77e808c84d4aeabfd137cc84906e12fb9cc257d9"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6bc309024ffb9d4b43773c9ca6a22ae320fba513","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        if self.disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"},{"line_number":358,"context_line":"            return False"},{"line_number":359,"context_line":"        else:"},{"line_number":360,"context_line":"            return True"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def correct_format(self):"},{"line_number":363,"context_line":"        if os.path.exists(self.path):"}],"source_content_type":"text/x-python","patch_set":94,"id":"1abeadc6_7a5fc8e5","line":360,"updated":"2014-08-19 10:56:48.000000000","message":"Nit-pick, you were going to add a comment to this code describing why we\u0027re lieing here.","commit_id":"f00974cd0bc96ccf6ea163b2423830cc7b322468"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6bc309024ffb9d4b43773c9ca6a22ae320fba513","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        :name: Image name."},{"line_number":720,"context_line":"        :image_type: Image type."},{"line_number":721,"context_line":"        Optional, is CONF.libvirt.images_type by default."},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        \"\"\""},{"line_number":724,"context_line":"        backend \u003d self.backend(image_type)"},{"line_number":725,"context_line":"        return backend(instance\u003dinstance, disk_name\u003ddisk_name)"}],"source_content_type":"text/x-python","patch_set":94,"id":"1abeadc6_9a0904e0","line":722,"updated":"2014-08-19 10:56:48.000000000","message":"Nit-pick, can remove this unrelated whitespace line insertion","commit_id":"f00974cd0bc96ccf6ea163b2423830cc7b322468"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        # NOTE(dgenin): Kernel, ramdisk and disk.config are fetched using"},{"line_number":357,"context_line":"        # the Raw backend regardless of which backend is configured for"},{"line_number":358,"context_line":"        # ephemeral storage. Encryption for the Raw backend is not yet"},{"line_number":359,"context_line":"        # implemented so this loophole is neccessary to allow other"},{"line_number":360,"context_line":"        # backends already supporting encryption to function. This can"},{"line_number":361,"context_line":"        # be removed once encryption for Raw is implemented."},{"line_number":362,"context_line":"        if self.disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_f318b81f","line":359,"updated":"2014-09-05 19:45:51.000000000","message":"s/neccessary/necessary","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        # NOTE(dgenin): Kernel, ramdisk and disk.config are fetched using"},{"line_number":357,"context_line":"        # the Raw backend regardless of which backend is configured for"},{"line_number":358,"context_line":"        # ephemeral storage. Encryption for the Raw backend is not yet"},{"line_number":359,"context_line":"        # implemented so this loophole is neccessary to allow other"},{"line_number":360,"context_line":"        # backends already supporting encryption to function. This can"},{"line_number":361,"context_line":"        # be removed once encryption for Raw is implemented."},{"line_number":362,"context_line":"        if self.disk_name not in [\u0027kernel\u0027, \u0027ramdisk\u0027, \u0027disk.config\u0027]:"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_1edf03d7","line":359,"in_reply_to":"fa98f980_f318b81f","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        self.ephemeral_key_uuid \u003d instance.get(\u0027ephemeral_key_uuid\u0027)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":475,"context_line":"            self.key_manager \u003d keymgr.API()"},{"line_number":476,"context_line":"        else:"},{"line_number":477,"context_line":"            self.key_manager \u003d None"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_f3c6f866","line":474,"updated":"2014-09-05 19:45:51.000000000","message":"You should use:\n\n if self.ephemeral_key_uuid is not None:\n\nto be consistent with your usage of:\n\n if self.ephemeral_key_uuid is None:\n\nbelow, and to avoid bad things from ducktyping.","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        self.ephemeral_key_uuid \u003d instance.get(\u0027ephemeral_key_uuid\u0027)"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":475,"context_line":"            self.key_manager \u003d keymgr.API()"},{"line_number":476,"context_line":"        else:"},{"line_number":477,"context_line":"            self.key_manager \u003d None"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_3e98471b","line":474,"in_reply_to":"fa98f980_f3c6f866","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":525,"context_line":"            size \u003d size if resize else base_size"},{"line_number":526,"context_line":"            lvm.create_volume(self.vg, self.lv,"},{"line_number":527,"context_line":"                                         size, sparse\u003dself.sparse)"},{"line_number":528,"context_line":"            if self.ephemeral_key_uuid:"},{"line_number":529,"context_line":"                encrypt_lvm_image()"},{"line_number":530,"context_line":"            images.convert_image(base, self.path, \u0027raw\u0027, run_as_root\u003dTrue)"},{"line_number":531,"context_line":"            if resize:"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_93b20ce3","line":528,"updated":"2014-09-05 19:45:51.000000000","message":"use:\n\n is not None:","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":525,"context_line":"            size \u003d size if resize else base_size"},{"line_number":526,"context_line":"            lvm.create_volume(self.vg, self.lv,"},{"line_number":527,"context_line":"                                         size, sparse\u003dself.sparse)"},{"line_number":528,"context_line":"            if self.ephemeral_key_uuid:"},{"line_number":529,"context_line":"                encrypt_lvm_image()"},{"line_number":530,"context_line":"            images.convert_image(base, self.path, \u0027raw\u0027, run_as_root\u003dTrue)"},{"line_number":531,"context_line":"            if resize:"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_7e9e4f08","line":528,"in_reply_to":"fa98f980_93b20ce3","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                disk.resize2fs(self.path, run_as_root\u003dTrue)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        generated \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":535,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":536,"context_line":"            if \u0027context\u0027 in kwargs:"},{"line_number":537,"context_line":"                key \u003d self.key_manager.get_key(kwargs[\u0027context\u0027],"},{"line_number":538,"context_line":"                        self.ephemeral_key_uuid).get_encoded()"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_53bc24bb","line":535,"updated":"2014-09-05 19:45:51.000000000","message":"use:\n\n is not None:","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                disk.resize2fs(self.path, run_as_root\u003dTrue)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        generated \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":535,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":536,"context_line":"            if \u0027context\u0027 in kwargs:"},{"line_number":537,"context_line":"                key \u003d self.key_manager.get_key(kwargs[\u0027context\u0027],"},{"line_number":538,"context_line":"                        self.ephemeral_key_uuid).get_encoded()"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_be8b57c1","line":535,"in_reply_to":"fa98f980_53bc24bb","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        generated \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":535,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":536,"context_line":"            if \u0027context\u0027 in kwargs:"},{"line_number":537,"context_line":"                key \u003d self.key_manager.get_key(kwargs[\u0027context\u0027],"},{"line_number":538,"context_line":"                        self.ephemeral_key_uuid).get_encoded()"},{"line_number":539,"context_line":"            else:"},{"line_number":540,"context_line":"                raise exception.NovaException("}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_73fda86d","line":537,"updated":"2014-09-05 19:45:51.000000000","message":"I would imagine there should be a try: except: block around the above? What happens if the key isn\u0027t found? What happens if the key manager has a fault?","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        generated \u003d \u0027ephemeral_size\u0027 in kwargs"},{"line_number":535,"context_line":"        if self.ephemeral_key_uuid:"},{"line_number":536,"context_line":"            if \u0027context\u0027 in kwargs:"},{"line_number":537,"context_line":"                key \u003d self.key_manager.get_key(kwargs[\u0027context\u0027],"},{"line_number":538,"context_line":"                        self.ephemeral_key_uuid).get_encoded()"},{"line_number":539,"context_line":"            else:"},{"line_number":540,"context_line":"                raise exception.NovaException("}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_f90179af","line":537,"in_reply_to":"fa98f980_73fda86d","updated":"2014-09-05 20:32:35.000000000","message":"I believe the exception would be caught in the key_manager, which is the abstract interface to the real key manager. However, you absolutely right that the key should be checked.","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"aa610b274f2859998f972806d30e9ec480a0ff40","unresolved":false,"context_lines":[{"line_number":544,"context_line":"            lvm.create_volume(self.vg, self.lv,"},{"line_number":545,"context_line":"                                         size, sparse\u003dself.sparse)"},{"line_number":546,"context_line":"            with self.remove_volume_on_error(self.path):"},{"line_number":547,"context_line":"                if self.ephemeral_key_uuid:"},{"line_number":548,"context_line":"                    encrypt_lvm_image()"},{"line_number":549,"context_line":"                prepare_template(target\u003dself.path, *args, **kwargs)"},{"line_number":550,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_f3c27832","line":547,"updated":"2014-09-05 19:45:51.000000000","message":"use:\n\n is not None:","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"4b3923693025f365cdfe15afe1df84de5f4f6dd6","unresolved":false,"context_lines":[{"line_number":544,"context_line":"            lvm.create_volume(self.vg, self.lv,"},{"line_number":545,"context_line":"                                         size, sparse\u003dself.sparse)"},{"line_number":546,"context_line":"            with self.remove_volume_on_error(self.path):"},{"line_number":547,"context_line":"                if self.ephemeral_key_uuid:"},{"line_number":548,"context_line":"                    encrypt_lvm_image()"},{"line_number":549,"context_line":"                prepare_template(target\u003dself.path, *args, **kwargs)"},{"line_number":550,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":105,"id":"fa98f980_19eb9ddc","line":547,"in_reply_to":"fa98f980_f3c27832","updated":"2014-09-05 20:32:35.000000000","message":"Done","commit_id":"389285591ea55341fc64965bcf20ffd5e3aaee2c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c136e8bd31858828a70fe05cbe26cec07257812e","unresolved":false,"context_lines":[{"line_number":540,"context_line":"                    # an exception if key retrieval fails."},{"line_number":541,"context_line":"                    key \u003d self.key_manager.get_key(kwargs[\u0027context\u0027],"},{"line_number":542,"context_line":"                            self.ephemeral_key_uuid).get_encoded()"},{"line_number":543,"context_line":"                except Exception:"},{"line_number":544,"context_line":"                    with excutils.save_and_reraise_exception():"},{"line_number":545,"context_line":"                        LOG.error(_LE(\"Failed to retrieve ephemeral encryption\""},{"line_number":546,"context_line":"                                      \" key\"))"}],"source_content_type":"text/x-python","patch_set":106,"id":"fa98f980_aba5d4a2","line":543,"updated":"2014-09-05 21:07:55.000000000","message":"thx for adding this! ++","commit_id":"faaac020c2bcc36ceadb9eeba51de0a45de27eec"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"34346bc6cd4206b5fcdca4e28099d44528f0979c","unresolved":false,"context_lines":[{"line_number":540,"context_line":"                    # an exception if key retrieval fails."},{"line_number":541,"context_line":"                    key \u003d self.key_manager.get_key(kwargs[\u0027context\u0027],"},{"line_number":542,"context_line":"                            self.ephemeral_key_uuid).get_encoded()"},{"line_number":543,"context_line":"                except Exception:"},{"line_number":544,"context_line":"                    with excutils.save_and_reraise_exception():"},{"line_number":545,"context_line":"                        LOG.error(_LE(\"Failed to retrieve ephemeral encryption\""},{"line_number":546,"context_line":"                                      \" key\"))"}],"source_content_type":"text/x-python","patch_set":106,"id":"fa98f980_cecea659","line":543,"in_reply_to":"fa98f980_aba5d4a2","updated":"2014-09-05 21:49:37.000000000","message":"np","commit_id":"faaac020c2bcc36ceadb9eeba51de0a45de27eec"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"285667d1b49bf890fe6a64cc11f30a3c31ce3e99","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                       \"were removed before instance termination \""},{"line_number":390,"context_line":"                       \"was initiated or was never created.\"))"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    if isinstance(lv_paths, unicode):"},{"line_number":393,"context_line":"        remove_logical_volumes(lv_paths)"},{"line_number":394,"context_line":"    else:"},{"line_number":395,"context_line":"        remove_logical_volumes(*lv_paths)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARH%2F%2F5lo%3D","line":392,"updated":"2013-08-15 14:57:23.000000000","message":"It can only be a unicode, not a str?","commit_id":"dd229a482fd3734d873412a8247a02e3552d675e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"7c4bec33997b29d489ff87c6c8a5ce1826739d48","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                       \"were removed before instance termination \""},{"line_number":390,"context_line":"                       \"was initiated or was never created.\"))"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    if isinstance(lv_paths, list):"},{"line_number":393,"context_line":"        remove_logical_volumes(*lv_paths)"},{"line_number":394,"context_line":"    else:"},{"line_number":395,"context_line":"        remove_logical_volumes(lv_paths)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2FzK0%3D","line":392,"updated":"2013-08-29 13:24:49.000000000","message":"I think it would be clearer if lv_paths is always passed as a list to this function, which eliminates the need for the if/else.","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"31ca6a4a94e7a8f7ffa1e65bdc3ac8ab83a737a8","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                       \"were removed before instance termination \""},{"line_number":390,"context_line":"                       \"was initiated or was never created.\"))"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    if isinstance(lv_paths, list):"},{"line_number":393,"context_line":"        remove_logical_volumes(*lv_paths)"},{"line_number":394,"context_line":"    else:"},{"line_number":395,"context_line":"        remove_logical_volumes(lv_paths)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2Fy4Q%3D","line":392,"in_reply_to":"AAAASn%2F%2FzK0%3D","updated":"2013-08-29 20:31:01.000000000","message":"Done","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8f1b77e0421e8c6f9c5f39601a9c9208d5ced7b7","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    #if isinstance(lv_paths, list):"},{"line_number":416,"context_line":"    remove_logical_volumes(*lv_paths)"},{"line_number":417,"context_line":"    #else:"},{"line_number":418,"context_line":"    #    remove_logical_volumes(lv_paths)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"def pick_disk_driver_name(hypervisor_version, is_block_dev\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAASn%2F%2Fum8%3D","line":418,"updated":"2013-08-30 10:48:53.000000000","message":"Remove commented code.","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"96824f097b5b7fb3e0ff1064a901bc422a55e6d9","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    #if isinstance(lv_paths, list):"},{"line_number":416,"context_line":"    remove_logical_volumes(*lv_paths)"},{"line_number":417,"context_line":"    #else:"},{"line_number":418,"context_line":"    #    remove_logical_volumes(lv_paths)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"def pick_disk_driver_name(hypervisor_version, is_block_dev\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAASn%2F%2Ft7w%3D","line":418,"in_reply_to":"AAAASn%2F%2Fum8%3D","updated":"2013-08-30 14:32:35.000000000","message":"Done","commit_id":"8ae0f193629444512f4f7c00e80c879ec53e50fe"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c30f8f4dd2236b8f6498db852952c4bacba1686e","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    :param path: logical volume path"},{"line_number":354,"context_line":"    \"\"\""},{"line_number":355,"context_line":"    out, _err \u003d execute(\u0027blockdev\u0027, \u0027--getsize64\u0027, path, run_as_root\u003dTrue)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    return int(out)"},{"line_number":358,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2Fcr0%3D","line":355,"updated":"2013-11-06 01:35:09.000000000","message":"This change is completely independent of adding encryption support. Please do it as a separate patch.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"69d73c13a600c20b41d50401dfcc44b2aa19f11c","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    :param path: logical volume path"},{"line_number":354,"context_line":"    \"\"\""},{"line_number":355,"context_line":"    out, _err \u003d execute(\u0027blockdev\u0027, \u0027--getsize64\u0027, path, run_as_root\u003dTrue)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    return int(out)"},{"line_number":358,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"AAAATn%2F%2FbJ0%3D","line":355,"in_reply_to":"AAAATn%2F%2Fcr0%3D","updated":"2013-11-06 14:36:21.000000000","message":"Will do.","commit_id":"ffc5029109cde528870ca6a2b6cdae21c2f56978"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"CONF.import_opt(\u0027cipher\u0027, \u0027nova.virt.driver\u0027,"},{"line_number":52,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":53,"context_line":"CONF.import_opt(\u0027key_size\u0027, \u0027nova.virt.driver\u0027,"},{"line_number":54,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":55,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97g0%3D","line":54,"updated":"2013-12-04 10:49:42.000000000","message":"None of these appear to be used in this file.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":51,"context_line":"CONF.import_opt(\u0027cipher\u0027, \u0027nova.virt.driver\u0027,"},{"line_number":52,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":53,"context_line":"CONF.import_opt(\u0027key_size\u0027, \u0027nova.virt.driver\u0027,"},{"line_number":54,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":55,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96jo%3D","line":54,"in_reply_to":"AAAATn%2F97g0%3D","updated":"2013-12-04 14:56:33.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"1867a6602e5cf3f6493e5de37683356b94f36cd9","unresolved":false,"context_lines":[{"line_number":236,"context_line":"def cryptdestroy(target):"},{"line_number":237,"context_line":"    execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"def create_lvm_image(vg, lv, size, sparse\u003dFalse):"},{"line_number":241,"context_line":"    \"\"\"Create LVM image."},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F97g4%3D","line":239,"updated":"2013-12-04 10:49:42.000000000","message":"This utils.py file is getting to be a bit of dumping ground for random functionality. I\u0027d suggest we have a dedicated \u0027dmcrypt.py\u0027 file which contains \u0027create\u0027, \u0027delete\u0027 and \u0027list\u0027 functions, along with a dedicated unit test file. I\u0027d go further to say that such a module could be created in a separate patch to this, so this becomes a small patch series.","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"51e4b6a429379f52f632bec363c5f9d7fdadabd8","unresolved":false,"context_lines":[{"line_number":236,"context_line":"def cryptdestroy(target):"},{"line_number":237,"context_line":"    execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"def create_lvm_image(vg, lv, size, sparse\u003dFalse):"},{"line_number":241,"context_line":"    \"\"\"Create LVM image."},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAATn%2F96jU%3D","line":239,"in_reply_to":"AAAATn%2F97g4%3D","updated":"2013-12-04 14:56:33.000000000","message":"Done","commit_id":"c4acbce41049dee120ec509279ce36eb6f44e574"}],"requirements.txt":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"441854a417a99e450e7194254b9885c3b56843d6","unresolved":false,"context_lines":[{"line_number":18,"context_line":"suds\u003e\u003d0.4"},{"line_number":19,"context_line":"paramiko\u003e\u003d1.8.0"},{"line_number":20,"context_line":"pyasn1"},{"line_number":21,"context_line":"Babel\u003e\u003d1.3"},{"line_number":22,"context_line":"iso8601\u003e\u003d0.1.4,!\u003d0.1.5,!\u003d0.1.6"},{"line_number":23,"context_line":"jsonschema\u003e\u003d1.3.0,!\u003d1.4.0"},{"line_number":24,"context_line":"python-cinderclient\u003e\u003d1.0.6"}],"source_content_type":"text/plain","patch_set":42,"id":"AAAATn%2F%2BJw0%3D","side":"PARENT","line":21,"updated":"2013-12-01 12:59:30.000000000","message":"why all of the changes here","commit_id":"9ae5ae3bc7c22000cb377d8d5d91e75d020f511f"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"d4e3818a33212e61e3befe3698eed9bd136e5be0","unresolved":false,"context_lines":[{"line_number":18,"context_line":"suds\u003e\u003d0.4"},{"line_number":19,"context_line":"paramiko\u003e\u003d1.8.0"},{"line_number":20,"context_line":"pyasn1"},{"line_number":21,"context_line":"Babel\u003e\u003d1.3"},{"line_number":22,"context_line":"iso8601\u003e\u003d0.1.4,!\u003d0.1.5,!\u003d0.1.6"},{"line_number":23,"context_line":"jsonschema\u003e\u003d1.3.0,!\u003d1.4.0"},{"line_number":24,"context_line":"python-cinderclient\u003e\u003d1.0.6"}],"source_content_type":"text/plain","patch_set":42,"id":"AAAATn%2F%2BD%2BE%3D","side":"PARENT","line":21,"in_reply_to":"AAAATn%2F%2BJw0%3D","updated":"2013-12-02 22:48:06.000000000","message":"stray.","commit_id":"9ae5ae3bc7c22000cb377d8d5d91e75d020f511f"}],"test-requirements.txt":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"34519e742dcaff29b0d35185c5c7c5c7edde4841","unresolved":false,"context_lines":[{"line_number":1,"context_line":"hacking\u003e\u003d0.5.6,\u003c0.8"},{"line_number":2,"context_line":"coverage\u003e\u003d3.6"},{"line_number":3,"context_line":"discover"},{"line_number":4,"context_line":"feedparser"}],"source_content_type":"text/plain","patch_set":17,"id":"AAAASn%2F%2F3Yc%3D","line":1,"updated":"2013-08-28 17:28:17.000000000","message":"this was done already","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"97aa555ad991ecd509c8d71f29e2d1a637f6b0a7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"hacking\u003e\u003d0.5.6,\u003c0.8"},{"line_number":2,"context_line":"coverage\u003e\u003d3.6"},{"line_number":3,"context_line":"discover"},{"line_number":4,"context_line":"feedparser"}],"source_content_type":"text/plain","patch_set":17,"id":"AAAASn%2F%2F3AA%3D","line":1,"in_reply_to":"AAAASn%2F%2F3Yc%3D","updated":"2013-08-28 19:56:02.000000000","message":"Done","commit_id":"ed4cea89a716752381d068d85426a8a9177d5396"}]}
