)]}'
{"etc/nova/rootwrap.d/compute.filters":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5508674be58d5d8f36fb6cd17264fa7467ba877e","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":11,"id":"AAAAT3%2F%2F5h4%3D","line":36,"updated":"2013-12-27 15:23:23.000000000","message":"This filter for cryptsetup also appears below. I doubt that it should be duplicated.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e229a0b1ddf40ecbc46ca0691df8a1e8d06745dc","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":11,"id":"AAAAT3%2F%2F5RI%3D","line":36,"in_reply_to":"AAAAT3%2F%2F5h4%3D","updated":"2013-12-27 17:09:31.000000000","message":"Done","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5508674be58d5d8f36fb6cd17264fa7467ba877e","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"# nova/virt/libvirt/volume.py:"},{"line_number":206,"context_line":"sginfo: CommandFilter, sginfo, root"},{"line_number":207,"context_line":"sg_scan: CommandFilter, sg_scan, root"},{"line_number":208,"context_line":"cryptsetup: CommandFilter, cryptsetup, root"},{"line_number":209,"context_line":"ln: RegExpFilter, ln, root, ln, --symbolic, --force, /dev/mapper/ip-.*-iscsi-iqn.2010-10.org.openstack:volume-.*, /dev/disk/by-path/ip-.*-iscsi-iqn.2010-10.org.openstack:volume-.*"},{"line_number":210,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAT3%2F%2F5h8%3D","line":207,"updated":"2013-12-27 15:23:23.000000000","message":"Duplicate of the above filter for cryptsetup.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e229a0b1ddf40ecbc46ca0691df8a1e8d06745dc","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"# nova/virt/libvirt/volume.py:"},{"line_number":206,"context_line":"sginfo: CommandFilter, sginfo, root"},{"line_number":207,"context_line":"sg_scan: CommandFilter, sg_scan, root"},{"line_number":208,"context_line":"cryptsetup: CommandFilter, cryptsetup, root"},{"line_number":209,"context_line":"ln: RegExpFilter, ln, root, ln, --symbolic, --force, /dev/mapper/ip-.*-iscsi-iqn.2010-10.org.openstack:volume-.*, /dev/disk/by-path/ip-.*-iscsi-iqn.2010-10.org.openstack:volume-.*"},{"line_number":210,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAT3%2F%2F5RE%3D","line":207,"in_reply_to":"AAAAT3%2F%2F5h8%3D","updated":"2013-12-27 17:09:31.000000000","message":"Done","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"}],"nova/tests/virt/libvirt/test_dmcrypt.py":[{"author":{"_account_id":7764,"name":"Peter Hamilton","email":"peter.hamilton@jhuapl.edu","username":"Peter"},"change_message_id":"101245471a9358882bebb1ef110c383d6f45c89f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class LibvirtDmcryptTestCase(test.TestCase):"},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(LibvirtDmcryptTestCase, self).setUp()"},{"line_number":29,"context_line":"    "},{"line_number":30,"context_line":"        self.flags(enabled\u003dTrue, group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":31,"context_line":"        self.flags(cipher\u003d\u0027aes-xts-plain64\u0027,"},{"line_number":32,"context_line":"            group\u003d\u0027ephemeral_storage_encryption\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9tVQ%3D","line":29,"updated":"2013-12-06 21:27:13.000000000","message":"Did you run this through pep8?","commit_id":"e0afae0142300f1f19ce3bc013daefdeb9a3cf80"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"248c564cf227f9f65ca4eb5457ff9fbef118ddfb","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class LibvirtDmcryptTestCase(test.TestCase):"},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(LibvirtDmcryptTestCase, self).setUp()"},{"line_number":29,"context_line":"    "},{"line_number":30,"context_line":"        self.flags(enabled\u003dTrue, group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":31,"context_line":"        self.flags(cipher\u003d\u0027aes-xts-plain64\u0027,"},{"line_number":32,"context_line":"            group\u003d\u0027ephemeral_storage_encryption\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9tSk%3D","line":29,"in_reply_to":"AAAATn%2F9tVQ%3D","updated":"2013-12-06 21:37:00.000000000","message":"Yep, just realized that I forgot to do that.","commit_id":"e0afae0142300f1f19ce3bc013daefdeb9a3cf80"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"39bb2a627ba184668ef46e62ac8ec7517b841ace","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.KEY_SIZE \u003d 123"},{"line_number":29,"context_line":"        self.TARGET \u003d \u0027disk-dmcrypt\u0027"},{"line_number":30,"context_line":"        self.PATH \u003d \u0027/dev/nova-lvm/instance_disk\u0027"},{"line_number":31,"context_line":"        self.KEY \u003d [0 for x in range(0, 123)]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.executes \u003d []"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9b58%3D","line":31,"updated":"2013-12-11 14:53:18.000000000","message":"Nit: Should probably use \u0027self.KEY_SIZE\u0027 rather than hard coding its value.","commit_id":"5250f4571e326080195dccb4317ce05182756885"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"9c3c1b617c3bfda053a70974ef04d689f8752c25","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.KEY_SIZE \u003d 123"},{"line_number":29,"context_line":"        self.TARGET \u003d \u0027disk-dmcrypt\u0027"},{"line_number":30,"context_line":"        self.PATH \u003d \u0027/dev/nova-lvm/instance_disk\u0027"},{"line_number":31,"context_line":"        self.KEY \u003d [0 for x in range(0, 123)]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        self.executes \u003d []"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9bzY%3D","line":31,"in_reply_to":"AAAATn%2F9b58%3D","updated":"2013-12-11 15:09:33.000000000","message":"Done","commit_id":"5250f4571e326080195dccb4317ce05182756885"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"fe70c5a1777afdafeaf13285731adb471760a6bb","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.NAME \u003d \u0027disk\u0027"},{"line_number":30,"context_line":"        self.TARGET \u003d dmcrypt.volume_name(self.NAME)"},{"line_number":31,"context_line":"        self.PATH \u003d \u0027/dev/nova-lvm/instance_disk\u0027"},{"line_number":32,"context_line":"        self.KEY \u003d [x for x in range(0, self.KEY_SIZE)]"},{"line_number":33,"context_line":"        self.KEY_STR \u003d \u0027\u0027.join([\"%02x\" % x for x in range(0, self.KEY_SIZE)])"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.executes \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2F23g%3D","line":32,"updated":"2014-01-07 16:00:47.000000000","message":"No need for the comprehension here since range returns a list.  Just self.KEY \u003d range(self.KEY_SIZE) would work.","commit_id":"d0fbbb94582c26887a57001732027db8ecfb88b5"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"a59d7a133b483f2587867ac6b6edcdf6e5053cb6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.NAME \u003d \u0027disk\u0027"},{"line_number":30,"context_line":"        self.TARGET \u003d dmcrypt.volume_name(self.NAME)"},{"line_number":31,"context_line":"        self.PATH \u003d \u0027/dev/nova-lvm/instance_disk\u0027"},{"line_number":32,"context_line":"        self.KEY \u003d [x for x in range(0, self.KEY_SIZE)]"},{"line_number":33,"context_line":"        self.KEY_STR \u003d \u0027\u0027.join([\"%02x\" % x for x in range(0, self.KEY_SIZE)])"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.executes \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2F2vo%3D","line":32,"in_reply_to":"AAAAUH%2F%2F23g%3D","updated":"2014-01-07 16:25:00.000000000","message":"Done","commit_id":"d0fbbb94582c26887a57001732027db8ecfb88b5"}],"nova/virt/libvirt/dmcrypt.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d9fdae0a65b69c71da9e30b8d628146a365df7de","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def cryptsetup(target, device, key):"},{"line_number":32,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":33,"context_line":"           \u0027create\u0027,"},{"line_number":34,"context_line":"           target,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pNo%3D","line":31,"updated":"2013-12-09 11:32:02.000000000","message":"No need to include the word \u0027crypt\u0027 or \u0027encrypted\u0027 in function names - that is already in the module name. So call this method s/cryptsetup/create_volume/\n\nPlease also add python API docs describing the parameters","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ce4ff1f03607d9c36921f9a08f988195123671e5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    group\u003d\u0027ephemeral_storage_encryption\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def cryptsetup(target, device, key):"},{"line_number":32,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":33,"context_line":"           \u0027create\u0027,"},{"line_number":34,"context_line":"           target,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ojE%3D","line":31,"in_reply_to":"AAAATn%2F9pNo%3D","updated":"2013-12-09 14:07:23.000000000","message":"Done","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d9fdae0a65b69c71da9e30b8d628146a365df7de","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           target,"},{"line_number":35,"context_line":"           device,"},{"line_number":36,"context_line":"           \u0027--cipher\u003d\u0027 + CONF.ephemeral_storage_encryption.cipher,"},{"line_number":37,"context_line":"           \u0027--key-size\u003d\u0027 + str(CONF.ephemeral_storage_encryption.key_size),"},{"line_number":38,"context_line":"           \u0027--key-file\u003d-\u0027)"},{"line_number":39,"context_line":"    key \u003d \u0027\u0027.join(map(lambda byte: hex(byte)[2:], key))"},{"line_number":40,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pNU%3D","line":37,"updated":"2013-12-09 11:32:02.000000000","message":"I\u0027d prefer to see these config tunables passed in as function parameters, so this code doesn\u0027t depend on global variables.","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ce4ff1f03607d9c36921f9a08f988195123671e5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           target,"},{"line_number":35,"context_line":"           device,"},{"line_number":36,"context_line":"           \u0027--cipher\u003d\u0027 + CONF.ephemeral_storage_encryption.cipher,"},{"line_number":37,"context_line":"           \u0027--key-size\u003d\u0027 + str(CONF.ephemeral_storage_encryption.key_size),"},{"line_number":38,"context_line":"           \u0027--key-file\u003d-\u0027)"},{"line_number":39,"context_line":"    key \u003d \u0027\u0027.join(map(lambda byte: hex(byte)[2:], key))"},{"line_number":40,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ojA%3D","line":37,"in_reply_to":"AAAATn%2F9pNU%3D","updated":"2013-12-09 14:07:23.000000000","message":"Done","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d9fdae0a65b69c71da9e30b8d628146a365df7de","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def cryptdestroy(target):"},{"line_number":44,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pNk%3D","line":43,"updated":"2013-12-09 11:32:02.000000000","message":"s/cryptdestroy/delete_volume/\n\n+ docs again","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ce4ff1f03607d9c36921f9a08f988195123671e5","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def cryptdestroy(target):"},{"line_number":44,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9oi8%3D","line":43,"in_reply_to":"AAAATn%2F9pNk%3D","updated":"2013-12-09 14:07:23.000000000","message":"Done","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d9fdae0a65b69c71da9e30b8d628146a365df7de","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def list_encrypted_volumes():"},{"line_number":48,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":49,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9pNg%3D","line":47,"updated":"2013-12-09 11:32:02.000000000","message":"s/list_encrypted_volumes/list_volumes/\n\n+ docs again.","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"ce4ff1f03607d9c36921f9a08f988195123671e5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def list_encrypted_volumes():"},{"line_number":48,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":49,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9oi0%3D","line":47,"in_reply_to":"AAAATn%2F9pNg%3D","updated":"2013-12-09 14:07:23.000000000","message":"Done","commit_id":"789ba9da43f19822398bde91210941e281754327"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"716efb937ee2b90315204dfe05c976cd21a94c78","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.virt.libvirt import utils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def setup(target, device, cipher, key_size, key):"},{"line_number":22,"context_line":"    \"\"\"Sets up a dmcrypt mapping"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    :param target: name for the mapped device"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9dSI%3D","line":21,"updated":"2013-12-11 10:22:44.000000000","message":"As before I think \u0027create_volume\u0027 is a better name for this.","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"2f45114156688198bcb1628d8aebdb62179f8a66","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.virt.libvirt import utils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def setup(target, device, cipher, key_size, key):"},{"line_number":22,"context_line":"    \"\"\"Sets up a dmcrypt mapping"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    :param target: name for the mapped device"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9cBQ%3D","line":21,"in_reply_to":"AAAATn%2F9dSI%3D","updated":"2013-12-11 14:35:24.000000000","message":"Done","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5aba48dca83002c33327c760765239d41e1a8cb7","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.virt.libvirt import utils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def setup(target, device, cipher, key_size, key):"},{"line_number":22,"context_line":"    \"\"\"Sets up a dmcrypt mapping"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    :param target: name for the mapped device"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9c8E%3D","line":21,"in_reply_to":"AAAATn%2F9dSI%3D","updated":"2013-12-11 11:41:52.000000000","message":"I concur with Daniel: \u0027create_volume\u0027 seems clearer than the generic \u0027setup\u0027.","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"716efb937ee2b90315204dfe05c976cd21a94c78","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param key: encryption key"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"},{"line_number":32,"context_line":"           target,"},{"line_number":33,"context_line":"           device,"},{"line_number":34,"context_line":"           \u0027--cipher\u003d\u0027 + cipher,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9dRk%3D","line":31,"updated":"2013-12-11 10:22:44.000000000","message":"I just noticed that the cryptsetup man page says that \u0027create\u0027 is deprecated in favour of \u0027open\u0027\n\n  [quote]\n       open --type plain \u003cdevice\u003e \u003cname\u003e\n       create \u003cname\u003e \u003cdevice\u003e (OBSOLETE syntax)\n  [/quote]","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"37fcd7476c9efa59e37b841a60bd134684ff25a3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param key: encryption key"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"},{"line_number":32,"context_line":"           target,"},{"line_number":33,"context_line":"           device,"},{"line_number":34,"context_line":"           \u0027--cipher\u003d\u0027 + cipher,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9c10%3D","line":31,"in_reply_to":"AAAATn%2F9c9w%3D","updated":"2013-12-11 12:00:25.000000000","message":"Ok, that\u0027s a good enough reason to stick with the \u0027create\u0027 command then.","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5aba48dca83002c33327c760765239d41e1a8cb7","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param key: encryption key"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"},{"line_number":32,"context_line":"           target,"},{"line_number":33,"context_line":"           device,"},{"line_number":34,"context_line":"           \u0027--cipher\u003d\u0027 + cipher,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9c9w%3D","line":31,"in_reply_to":"AAAATn%2F9dRk%3D","updated":"2013-12-11 11:41:52.000000000","message":"The \u0027open\u0027 subcommand was added in version 1.6.0 and is not available in previous versions of cryptsetup. For example, my Ubuntu 12.04 LTS installation has version 1.4.1 of cryptsetup.","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"716efb937ee2b90315204dfe05c976cd21a94c78","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def destroy(target):"},{"line_number":42,"context_line":"    \"\"\"Function destroys a dmcrypt mapping.\"\"\""},{"line_number":43,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9dSE%3D","line":41,"updated":"2013-12-11 10:22:44.000000000","message":"And \u0027delete_volume\u0027 for this.\n\nPlease document what \u0027target\u0027 is - is is a device path or a name or something else ?","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5aba48dca83002c33327c760765239d41e1a8cb7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def destroy(target):"},{"line_number":42,"context_line":"    \"\"\"Function destroys a dmcrypt mapping.\"\"\""},{"line_number":43,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9c7c%3D","line":41,"in_reply_to":"AAAATn%2F9dSE%3D","updated":"2013-12-11 11:41:52.000000000","message":"Agreed: \u0027delete_volume\u0027 (or \u0027remove_volume\u0027 to be consistent with the cryptsetup command) seems to be a better name.","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"2f45114156688198bcb1628d8aebdb62179f8a66","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def destroy(target):"},{"line_number":42,"context_line":"    \"\"\"Function destroys a dmcrypt mapping.\"\"\""},{"line_number":43,"context_line":"    utils.execute(\u0027cryptsetup\u0027, \u0027remove\u0027, target, run_as_root\u003dTrue)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9cBM%3D","line":41,"in_reply_to":"AAAATn%2F9dSE%3D","updated":"2013-12-11 14:35:24.000000000","message":"Done","commit_id":"daa9beda7771723bcf2dcda9195fdec85f50a556"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"9c3c1b617c3bfda053a70974ef04d689f8752c25","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.virt.libvirt import utils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def create_volume(target, device, cipher, key_size, key):"},{"line_number":22,"context_line":"    \"\"\"Sets up a dmcrypt mapping"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    :param target: name for the mapped logical device"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9byQ%3D","line":21,"updated":"2013-12-11 15:09:33.000000000","message":"Do you think create_mapping maybe more appropriate, least the name misleads people into thinking this creates an actual volume rather than simply mapping it.","commit_id":"5250f4571e326080195dccb4317ce05182756885"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"b2fb36ae77d52702a7bc1d2f5df228779cc8eb6f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.virt.libvirt import utils"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def create_volume(target, device, cipher, key_size, key):"},{"line_number":22,"context_line":"    \"\"\"Sets up a dmcrypt mapping"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    :param target: name for the mapped logical device"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9bqk%3D","line":21,"in_reply_to":"AAAATn%2F9byQ%3D","updated":"2013-12-11 15:32:41.000000000","message":"I think volume is fine here - the important thing is consistency of naming in all methods in this file.","commit_id":"5250f4571e326080195dccb4317ce05182756885"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"39bb2a627ba184668ef46e62ac8ec7517b841ace","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param key: encryption key"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"},{"line_number":32,"context_line":"           target,"},{"line_number":33,"context_line":"           device,"},{"line_number":34,"context_line":"           \u0027--cipher\u003d\u0027 + cipher,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9b5g%3D","line":31,"updated":"2013-12-11 14:53:18.000000000","message":"Might want to include a comment about using \u0027create\u0027 rather than \u0027open\u0027 because someone else will probably wonder why at some point.","commit_id":"5250f4571e326080195dccb4317ce05182756885"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"20bb2232fc1e4172d7f4bd35bf687c44b0d474c6","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    :param device: underlying block device"},{"line_number":26,"context_line":"    :param cipher: encryption cipher"},{"line_number":27,"context_line":"    :param cipher: encryption key size"},{"line_number":28,"context_line":"    :param key: encryption key"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9ONU%3D","line":28,"updated":"2013-12-13 20:41:30.000000000","message":"It would be more helpful to document the type of the key, not just that it\u0027s a key.  Keys are often strings but the join(map(lambda)) seems to want a list of ints instead.","commit_id":"ffdd352ef9463985e764554a9c6d002bff001ad5"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5508674be58d5d8f36fb6cd17264fa7467ba877e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    :param device: underlying block device"},{"line_number":26,"context_line":"    :param cipher: encryption cipher string digestible by cryptsetup"},{"line_number":27,"context_line":"    :param cipher: encryption key size"},{"line_number":28,"context_line":"    :param key: encryption key as integer array"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F5gc%3D","line":28,"updated":"2013-12-27 15:23:23.000000000","message":"Properly an array of unsigned bytes to be consistent with the key manager interface.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e229a0b1ddf40ecbc46ca0691df8a1e8d06745dc","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    :param device: underlying block device"},{"line_number":26,"context_line":"    :param cipher: encryption cipher string digestible by cryptsetup"},{"line_number":27,"context_line":"    :param cipher: encryption key size"},{"line_number":28,"context_line":"    :param key: encryption key as integer array"},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":"    cmd \u003d (\u0027cryptsetup\u0027,"},{"line_number":31,"context_line":"           \u0027create\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F5RY%3D","line":28,"in_reply_to":"AAAAT3%2F%2F5gc%3D","updated":"2013-12-27 17:09:31.000000000","message":"Done","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5508674be58d5d8f36fb6cd17264fa7467ba877e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           \u0027--cipher\u003d\u0027 + cipher,"},{"line_number":35,"context_line":"           \u0027--key-size\u003d\u0027 + str(key_size),"},{"line_number":36,"context_line":"           \u0027--key-file\u003d-\u0027)"},{"line_number":37,"context_line":"    key \u003d \u0027\u0027.join(map(lambda byte: hex(byte)[2:], key))"},{"line_number":38,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F5fg%3D","line":37,"updated":"2013-12-27 15:23:23.000000000","message":"This function may shrink the key so its hexadecimal string representation is *not* identical to the supplied bytes. For example, the passphrase generated for 3-byte key [1, 1, 42] should be \"01012a\" instead of \"112a\" which is the result of the current implementation.\n\nAlthough a simple function to write, I\u0027d like to see a separate method and unit test cases to ensure the passphrases are generated correctly.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e229a0b1ddf40ecbc46ca0691df8a1e8d06745dc","unresolved":false,"context_lines":[{"line_number":34,"context_line":"           \u0027--cipher\u003d\u0027 + cipher,"},{"line_number":35,"context_line":"           \u0027--key-size\u003d\u0027 + str(key_size),"},{"line_number":36,"context_line":"           \u0027--key-file\u003d-\u0027)"},{"line_number":37,"context_line":"    key \u003d \u0027\u0027.join(map(lambda byte: hex(byte)[2:], key))"},{"line_number":38,"context_line":"    utils.execute(*cmd, process_input\u003dkey, run_as_root\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F5RM%3D","line":37,"in_reply_to":"AAAAT3%2F%2F5fg%3D","updated":"2013-12-27 17:09:31.000000000","message":"Thank you for catching this, will fix.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"5508674be58d5d8f36fb6cd17264fa7467ba877e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def list_volumes():"},{"line_number":50,"context_line":"    \"\"\"Function enumerates encrypted volumes.\"\"\""},{"line_number":51,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":52,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F5dg%3D","line":52,"updated":"2013-12-27 15:23:23.000000000","message":"The \"-dmcrypt\" suffix should be added by this class if it\u0027s going to be used as a filter. (It\u0027s currently added in a dependent patch for nova/virt/libvirt/imagebackend.py: https://review.openstack.org/#/c/40467/51/nova/virt/libvirt/imagebackend.py .) Otherwise, it would be trivial to break this functionality by omitting \"-dmcrypt\" to the name of a target.\n\nChoices are either to return all devices under /dev/mapper and apply this filter elsewhere or to append \"-dmcrypt\" to the name of the target when creating and deleting volumes.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"03a6e42e055a9885809579e4d2a82105f3d3e83a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def list_volumes():"},{"line_number":50,"context_line":"    \"\"\"Function enumerates encrypted volumes.\"\"\""},{"line_number":51,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":52,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F0yo%3D","line":52,"in_reply_to":"AAAAT3%2F%2F0zQ%3D","updated":"2013-12-30 17:49:36.000000000","message":"Done","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"73e5ef81ad530e71dcab1992ebc0c87b38ca2c3a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def list_volumes():"},{"line_number":50,"context_line":"    \"\"\"Function enumerates encrypted volumes.\"\"\""},{"line_number":51,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":52,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F0zQ%3D","line":52,"in_reply_to":"AAAAT3%2F%2F1N8%3D","updated":"2013-12-30 17:40:30.000000000","message":"In that case, I\u0027d like to see create_volume take a \"name\" rather than a definite \"target\" as the first parameter. create_volume would return the \"target\" (i.e., name + \"-dmcrypt\") to the caller (in this case, imagebackend.py). This modification consolidates the handling of the \"-dmcrypt\" suffix to this module, which is my real goal.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e5f0c87b101556be5bda776311f3946f54b69f4e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def list_volumes():"},{"line_number":50,"context_line":"    \"\"\"Function enumerates encrypted volumes.\"\"\""},{"line_number":51,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":52,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F1N8%3D","line":52,"in_reply_to":"AAAAT3%2F%2F1rM%3D","updated":"2013-12-30 16:07:28.000000000","message":"This would require rewriting a good part of libvirtdriver and imagebackend, as Daniel Berrange pointed out earlier. In this particular case, the issue is that disk name filtering is used in cleanup but cleanup is not handled by imagebackend but by code scattered between libvirtdriver and libvirt.utils. To move filtering into imagebackend, disk clean up would have to be moved there as well and not just for LVM but for all backends. It\u0027s a formidable task.\n\nFurthermore, imagebackend implements operations relating to a specific disk, e.g., creation or snapshotting, whereas listing volumes associated with an instance is an aggregate operation so I am not convinced that imagebackend is the right place for this functionality.","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"61e0630732b2f6c7bd608fd0b99c89f0c2e9940a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def list_volumes():"},{"line_number":50,"context_line":"    \"\"\"Function enumerates encrypted volumes.\"\"\""},{"line_number":51,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":52,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F1rM%3D","line":52,"in_reply_to":"AAAAT3%2F%2F5QM%3D","updated":"2013-12-30 12:21:11.000000000","message":"The code that adds the \"-dmcrypt\" suffix appears in imagebackend.py; in my opinion, the code that filters by the suffix should be in the same file. Hence, either move everything related to the \"-dmcrypt\" suffix to nova/virt/libvirt/driver.py or consolidate it in another file (imagebackend.py or here or ...).","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"},{"author":{"_account_id":7746,"name":"Dan Genin","email":"daniel.genin@jhuapl.edu","username":"DiG"},"change_message_id":"e229a0b1ddf40ecbc46ca0691df8a1e8d06745dc","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def list_volumes():"},{"line_number":50,"context_line":"    \"\"\"Function enumerates encrypted volumes.\"\"\""},{"line_number":51,"context_line":"    return [dmdev for dmdev in os.listdir(\u0027/dev/mapper\u0027)"},{"line_number":52,"context_line":"            if dmdev.endswith(\u0027-dmcrypt\u0027)]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2F5QM%3D","line":52,"in_reply_to":"AAAAT3%2F%2F5dg%3D","updated":"2013-12-27 17:09:31.000000000","message":"What do you think about moving this function to Libvirtdriver? This is how unencrypted instance LVM disks are handled, see LIbvirtdriver._lvm_disks().","commit_id":"a83a6d2235a1d09b78d19e94317b53732522207d"}]}
