)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12408,"name":"Maxim Nestratov","email":"mnestratov@virtuozzo.com","username":"mnestratov"},"change_message_id":"b5498c3019076899bf2f52f388c8b723c23b02fa","unresolved":false,"context_lines":[{"line_number":14,"context_line":"https://blueprints.launchpad.net/cinder/+spec/virtuozzo-cloud-storage-support"},{"line_number":15,"context_line":"https://review.openstack.org/#/c/188869/"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements Blueprint: virtuozzo-cloud-storage-support"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I6732fff3a5c40859781a017ef05046513685167f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a29b11f_2b965b93","line":17,"updated":"2015-10-21 10:39:32.000000000","message":"should have been:\nImplements: blueprint virtuozzo-cloud-storage-support","commit_id":"ccd9321dfa4c7bcd16d662d18255f5f64632bb58"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: add nova volume driver for vzstorage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Driver for vzstorage cinder volumes. The driver mounts"},{"line_number":10,"context_line":"vzstorage cluster and uses images, located on this mount"},{"line_number":11,"context_line":"as volumes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Cinder part has been merged, here are the bluprint and review:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"da85f559_352d4fa8","line":10,"updated":"2015-11-11 15:57:24.000000000","message":"(9:16:17 AM) mnestratov: mriedem: that\u0027s right, with this change we can attach volumes to containers\n\nWe should update the hypervisor support matrix doc as part of this change.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f85b819d70372ebcabface40ed7c8e308bf36bb0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: add nova volume driver for vzstorage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Driver for vzstorage cinder volumes. The driver mounts"},{"line_number":10,"context_line":"vzstorage cluster and uses images, located on this mount"},{"line_number":11,"context_line":"as volumes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Cinder part has been merged, here are the bluprint and review:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9a8ffd7b_940a86d1","line":10,"in_reply_to":"da85f559_2937f3ff","updated":"2015-11-24 20:29:32.000000000","message":"Can we clarify that in the commit message then? And we could still update the hypervisor support matrix for virtuozzo VMs right?  Since the cinder part landed already.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"libvirt: add nova volume driver for vzstorage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Driver for vzstorage cinder volumes. The driver mounts"},{"line_number":10,"context_line":"vzstorage cluster and uses images, located on this mount"},{"line_number":11,"context_line":"as volumes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Cinder part has been merged, here are the bluprint and review:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"da85f559_2937f3ff","line":10,"in_reply_to":"da85f559_352d4fa8","updated":"2015-11-12 18:11:50.000000000","message":"Unfortunately, it will not work right now, because I need to add support of our images type to cinder driver.\n\nI talked to cinder maintainers on summit and they have no complains, also we have a patch for juno. I hope it will be in openstack in mitaka release.\n\nSo I think it\u0027s better to update matrix after cinder patch will be commited.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"}],"etc/nova/rootwrap.d/compute.filters":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":245,"context_line":"# nova/virt/libvirt/utils.py: \u0027xend\u0027, \u0027status\u0027"},{"line_number":246,"context_line":"xend: CommandFilter, xend, root"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"# nova/virt/libvirt/volume.py"},{"line_number":249,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"da85f559_95f75b8a","line":248,"updated":"2015-11-11 15:57:24.000000000","message":"This should be:\n\nnova/virt/libvirt/volume/vzstorage.py","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":245,"context_line":"# nova/virt/libvirt/utils.py: \u0027xend\u0027, \u0027status\u0027"},{"line_number":246,"context_line":"xend: CommandFilter, xend, root"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"# nova/virt/libvirt/volume.py"},{"line_number":249,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"da85f559_291e1370","line":248,"in_reply_to":"da85f559_95f75b8a","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4963cc57b9160ae7a02e75ca1bec6f6a8ad5aa24","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":26,"id":"7aa08908_eaf87c7e","line":258,"updated":"2016-06-17 13:49:15.000000000","message":"We shouldn\u0027t be sharing rootwrap filters with os-brick anymore, this should be handled with oslo.privsep in os-brick, you probably need to talk to Walter Boring (hemna).","commit_id":"24b30991af76853d6a695a41e112ee543ded8bb8"},{"author":{"_account_id":12408,"name":"Maxim Nestratov","email":"mnestratov@virtuozzo.com","username":"mnestratov"},"change_message_id":"cef4a840c9cadf97baf069532763182a938c3aaa","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":26,"id":"5a9d85d2_109e5456","line":258,"in_reply_to":"7aa08908_324f9a35","updated":"2016-06-20 10:18:50.000000000","message":"Yeah, I think we don\u0027t need this change at all. It was mistakenly left here after the pstorage-mount code was moved to os-brick","commit_id":"24b30991af76853d6a695a41e112ee543ded8bb8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"78a633e96f25a76eab16000a782c5a681c8624a8","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":26,"id":"7aa08908_324f9a35","line":258,"in_reply_to":"7aa08908_b258aa32","updated":"2016-06-17 14:37:56.000000000","message":"I see the pstorage-mount rootwrap filter is in cinder\u0027s volume.filters also. With privsep in os-brick I\u0027m not sure if we actually need the rootwrap filter in both nova and cinder, I thought we didn\u0027t.","commit_id":"24b30991af76853d6a695a41e112ee543ded8bb8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8658bc7f387571afdc1a92e6a77dcd23ca25f3ca","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":26,"id":"7aa08908_b258aa32","line":258,"in_reply_to":"7aa08908_eaf87c7e","updated":"2016-06-17 14:32:37.000000000","message":"Actually I don\u0027t even see this used in nova, is it only used in os-brick?","commit_id":"24b30991af76853d6a695a41e112ee543ded8bb8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4733a029b19ce81e5a866c5ac1078422b4d4e5a0","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":30,"id":"3aaa91ec_e944921c","line":258,"updated":"2016-06-27 14:34:36.000000000","message":"OK, this is what I expected once we started using os-brick 1.3.0 from g-r because we aren\u0027t running with os-brick + privsep. We\u0027re still trying to sort that out in the mailing list, regarding the upgrade story, but I don\u0027t want to block this change on that.","commit_id":"1b7f1c9a537c0e90d86a4b43193958bf8c7af6da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"55a758d7e0f03416345a91151c1cd9aef37549c2","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":31,"id":"3aaa91ec_f06c260a","line":258,"updated":"2016-06-28 17:26:26.000000000","message":"We should have probably had a release note for this. It\u0027s too late for this change but a follow on release note patch would be nice so we don\u0027t lose it.","commit_id":"b71a594db6d06d33c4e61fa62f04e3700c74062b"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"58073e812e561c1328a08ea6578742fd0243dc92","unresolved":false,"context_lines":[{"line_number":255,"context_line":"touch: CommandFilter, touch, root"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# nova/virt/libvirt/volume/vzstorage.py"},{"line_number":258,"context_line":"pstorage-mount: CommandFilter, pstorage-mount, root"}],"source_content_type":"application/octet-stream","patch_set":31,"id":"3aaa91ec_55850505","line":258,"in_reply_to":"3aaa91ec_f06c260a","updated":"2016-06-29 11:03:16.000000000","message":"Please, review:\nhttps://review.openstack.org/335439","commit_id":"b71a594db6d06d33c4e61fa62f04e3700c74062b"}],"nova/conf/libvirt.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"23d0aed03e30db214891fa6a58d08800255566d0","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                    \u0027removing files on the remote host.\u0027),"},{"line_number":407,"context_line":"]"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"libvirt_volume_vzstorage_opts \u003d ["},{"line_number":410,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_point_base\u0027,"},{"line_number":411,"context_line":"               default\u003dpaths.state_path_def(\u0027mnt\u0027),"},{"line_number":412,"context_line":"               help\u003d\u0027Directory where the Virtuozzo Storage clusters \u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_8db756f4","line":409,"updated":"2016-06-23 18:14:22.000000000","message":"These should all be using the new config option template, but that could probably happen in a later commit after non-priority blueprint feature freeze so it doesn\u0027t block this.","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"a72b871cf61e69a87a0c83ff6258dba63016a372","unresolved":false,"context_lines":[{"line_number":406,"context_line":"                    \u0027removing files on the remote host.\u0027),"},{"line_number":407,"context_line":"]"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"libvirt_volume_vzstorage_opts \u003d ["},{"line_number":410,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_point_base\u0027,"},{"line_number":411,"context_line":"               default\u003dpaths.state_path_def(\u0027mnt\u0027),"},{"line_number":412,"context_line":"               help\u003d\u0027Directory where the Virtuozzo Storage clusters \u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_34730617","line":409,"in_reply_to":"3aaa91ec_8db756f4","updated":"2016-06-23 19:32:53.000000000","message":"All new config opts should follow the standard template. Updating the remaining opts could be a follow-up.","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"cfc658073018519c4e1ee4ffce7114296444e9ab","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                    \u0027removing files on the remote host.\u0027),"},{"line_number":414,"context_line":"]"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"libvirt_volume_vzstorage_opts \u003d ["},{"line_number":417,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_point_base\u0027,"},{"line_number":418,"context_line":"               default\u003dpaths.state_path_def(\u0027mnt\u0027),"},{"line_number":419,"context_line":"               help\u003d\u0027Directory where the Virtuozzo Storage clusters \u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_9a0e358a","line":416,"updated":"2016-06-24 15:53:49.000000000","message":"Same comment from previous PS: new options should follow the standard format, with much more informative help.","commit_id":"51c3a33090f46c12d7a6e188e19cda3a2867c32a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4733a029b19ce81e5a866c5ac1078422b4d4e5a0","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                    \u0027removing files on the remote host.\u0027),"},{"line_number":414,"context_line":"]"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"libvirt_volume_vzstorage_opts \u003d ["},{"line_number":417,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_point_base\u0027,"},{"line_number":418,"context_line":"               default\u003dpaths.state_path_def(\u0027mnt\u0027),"},{"line_number":419,"context_line":"               help\u003d\u0027Directory where the Virtuozzo Storage clusters \u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"3aaa91ec_c9d1d631","line":416,"updated":"2016-06-27 14:34:36.000000000","message":"As noted by Ed earlier we should be using the full template now for options:\n\nhttp://specs.openstack.org/openstack/nova-specs/specs/mitaka/implemented/centralize-config-options.html#quality-view\n\nThere are the TODOs at the top of this file for eventually cleaning it up. Given the FF deadline this week I don\u0027t want to block on this, but it\u0027s something that should be done so we\u0027re not adding more debt to that config option cleanup.","commit_id":"1b7f1c9a537c0e90d86a4b43193958bf8c7af6da"}],"nova/virt/libvirt/volume/vzstorage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import re"},{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_concurrency import processutils"},{"line_number":18,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_f57a67f0","line":15,"updated":"2015-11-11 15:57:24.000000000","message":"six is third party so it should be lumped in with the olso imports.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import re"},{"line_number":15,"context_line":"import six"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_concurrency import processutils"},{"line_number":18,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_c2587933","line":15,"in_reply_to":"da85f559_f57a67f0","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    \u0027are mounted on the compute node\u0027),"},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_user\u0027,"},{"line_number":36,"context_line":"               default\u003d\u0027stack\u0027,"},{"line_number":37,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":38,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_group\u0027,"},{"line_number":39,"context_line":"               default\u003d\u0027qemu\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_b03e2d89","line":37,"updated":"2015-11-11 15:57:24.000000000","message":"Provide help text for this option.  Maybe point out what it\u0027s used for (with pstorage-mount).","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    \u0027are mounted on the compute node\u0027),"},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_user\u0027,"},{"line_number":36,"context_line":"               default\u003d\u0027stack\u0027,"},{"line_number":37,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":38,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_group\u0027,"},{"line_number":39,"context_line":"               default\u003d\u0027qemu\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_224aa555","line":37,"in_reply_to":"da85f559_b03e2d89","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":37,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":38,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_group\u0027,"},{"line_number":39,"context_line":"               default\u003d\u0027qemu\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_perms\u0027,"},{"line_number":42,"context_line":"               default\u003d\u00270770\u0027,"},{"line_number":43,"context_line":"               help\u003d\u0027\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_d05ad1f1","line":40,"updated":"2015-11-11 15:57:24.000000000","message":"Add help text.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":38,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_group\u0027,"},{"line_number":39,"context_line":"               default\u003d\u0027qemu\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_perms\u0027,"},{"line_number":42,"context_line":"               default\u003d\u00270770\u0027,"},{"line_number":43,"context_line":"               help\u003d\u0027\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_45d573e2","line":40,"in_reply_to":"da85f559_d05ad1f1","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":40,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_perms\u0027,"},{"line_number":42,"context_line":"               default\u003d\u00270770\u0027,"},{"line_number":43,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":44,"context_line":"    ]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_100cd9eb","line":43,"updated":"2015-11-11 15:57:24.000000000","message":"Add help text.  It\u0027d be helpful if we could find a public man page for pstorage-mount.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027vzstorage_mount_perms\u0027,"},{"line_number":42,"context_line":"               default\u003d\u00270770\u0027,"},{"line_number":43,"context_line":"               help\u003d\u0027\u0027),"},{"line_number":44,"context_line":"    ]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_25f14f95","line":43,"in_reply_to":"da85f559_100cd9eb","updated":"2015-11-12 18:11:50.000000000","message":"OK, here is a man page - https://static.openvz.org/vz-man/man1/pstorage-mount.1.gz.html","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    SHARE_FORMAT_REGEX \u003d r\u0027(?:(\\S+):/)?([a-zA-Z0-9_-]+)(?::(\\S+))?\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def _get_mount_point_base(self):"},{"line_number":56,"context_line":"        return CONF.libvirt.nfs_mount_point_base"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _is_mounted(self, vz_share, mount_path):"},{"line_number":59,"context_line":"        cluster_name \u003d self._parse_vz_share(vz_share)[\u0027cluster_name\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_15ce0b2e","line":56,"updated":"2015-11-11 15:57:24.000000000","message":"This should be CONF.libvirt.vzstorage_mount_point_base.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    SHARE_FORMAT_REGEX \u003d r\u0027(?:(\\S+):/)?([a-zA-Z0-9_-]+)(?::(\\S+))?\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def _get_mount_point_base(self):"},{"line_number":56,"context_line":"        return CONF.libvirt.nfs_mount_point_base"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _is_mounted(self, vz_share, mount_path):"},{"line_number":59,"context_line":"        cluster_name \u003d self._parse_vz_share(vz_share)[\u0027cluster_name\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_408a4165","line":56,"in_reply_to":"da85f559_15ce0b2e","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                        \u0027pstorage://%s\u0027 % cluster_name)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _try_cinder_mount(self, vz_share, connection_info):"},{"line_number":64,"context_line":"        self._cinder_mount \u003d False"},{"line_number":65,"context_line":"        base \u003d connection_info.get(\u0027mount_point_base\u0027, None)"},{"line_number":66,"context_line":"        if not base:"},{"line_number":67,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_2b188c1d","line":64,"updated":"2015-11-11 15:57:24.000000000","message":"Let\u0027s not store state using member variables in this volume driver class as flags to be used between methods.  The disconnect method can just call is_mounted if it needs to figure this out.\n\nFor example, in connect, if it\u0027s not mounted you mount it, but you don\u0027t set this flag to True.  It\u0027s just better to make the operations independent and rely on the current state of the system when they need to make their checks.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _try_cinder_mount(self, vz_share, connection_info):"},{"line_number":64,"context_line":"        self._cinder_mount \u003d False"},{"line_number":65,"context_line":"        base \u003d connection_info.get(\u0027mount_point_base\u0027, None)"},{"line_number":66,"context_line":"        if not base:"},{"line_number":67,"context_line":"            return None"},{"line_number":68,"context_line":"        if not os.path.isdir(base):"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_4b463050","line":65,"updated":"2015-11-11 15:57:24.000000000","message":"None is not necessary since it\u0027s the default.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _try_cinder_mount(self, vz_share, connection_info):"},{"line_number":64,"context_line":"        self._cinder_mount \u003d False"},{"line_number":65,"context_line":"        base \u003d connection_info.get(\u0027mount_point_base\u0027, None)"},{"line_number":66,"context_line":"        if not base:"},{"line_number":67,"context_line":"            return None"},{"line_number":68,"context_line":"        if not os.path.isdir(base):"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_60e0a529","line":65,"in_reply_to":"da85f559_4b463050","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _get_mount_path(self, connection_info):"},{"line_number":78,"context_line":"        vz_share \u003d connection_info[\u0027data\u0027][\u0027export\u0027]"},{"line_number":79,"context_line":"        mount_path \u003d self._try_cinder_mount(vz_share, connection_info)"},{"line_number":80,"context_line":"        if mount_path:"},{"line_number":81,"context_line":"            return mount_path"},{"line_number":82,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_eb9cc4c1","line":79,"updated":"2015-11-11 15:57:24.000000000","message":"Why are we checking if it\u0027s mounted from the cinder side based on the connection_info[\u0027mount_point_base\u0027] key when we have the vzstorage_mount_point_base option?","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f85b819d70372ebcabface40ed7c8e308bf36bb0","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _get_mount_path(self, connection_info):"},{"line_number":78,"context_line":"        vz_share \u003d connection_info[\u0027data\u0027][\u0027export\u0027]"},{"line_number":79,"context_line":"        mount_path \u003d self._try_cinder_mount(vz_share, connection_info)"},{"line_number":80,"context_line":"        if mount_path:"},{"line_number":81,"context_line":"            return mount_path"},{"line_number":82,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a8ffd7b_f4ce7282","line":79,"in_reply_to":"da85f559_e0b815ca","updated":"2015-11-24 20:29:32.000000000","message":"I would definitely document that in the code as a limitation/workaround then.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _get_mount_path(self, connection_info):"},{"line_number":78,"context_line":"        vz_share \u003d connection_info[\u0027data\u0027][\u0027export\u0027]"},{"line_number":79,"context_line":"        mount_path \u003d self._try_cinder_mount(vz_share, connection_info)"},{"line_number":80,"context_line":"        if mount_path:"},{"line_number":81,"context_line":"            return mount_path"},{"line_number":82,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_e0b815ca","line":79,"in_reply_to":"da85f559_eb9cc4c1","updated":"2015-11-12 18:11:50.000000000","message":"We have a problem with online (nova-assisted) snapshots, because vzstorage doesn\u0027t allow simultaneous access to files from different clients. That\u0027s by design and definitely will not change in the near future.\n\nCinder tries to open image file for some operations, while it\u0027s in use by some VM, started by nova. It can be fixed in cinder, but require some efforts.\n\nSo as workaround for CI we use the same mount for cinder and nova. It will not work generally, because cinder-volume and nova-compute usually run on different hosts.\n\nIf it\u0027s a problem to keep this, I can try to find a way to skip CI checks for online snapshots. People from cinder told me, that these operations are not mandatory. But things will be easier, if we keep it for some time.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        if mount_path:"},{"line_number":81,"context_line":"            return mount_path"},{"line_number":82,"context_line":"        else:"},{"line_number":83,"context_line":"            return os.path.join(CONF.libvirt.vzstorage_mount_point_base,"},{"line_number":84,"context_line":"                                utils.get_hash_str(vz_share))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_config(self, connection_info, disk_info):"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_eb5fe4e2","line":83,"updated":"2015-11-11 15:57:24.000000000","message":"Just call super(LibvirtVZStorageVolumeDriver, self)._get_mount_path(connection_info) since it\u0027s handled the same way generically there.  That\u0027s why I\u0027m confused as to why we need to check try_cinder_mount from this method.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return conf"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _parse_vz_share(self, vz_share):"},{"line_number":98,"context_line":"        m \u003d re.search(self.SHARE_FORMAT_REGEX, vz_share)"},{"line_number":99,"context_line":"        if not m:"},{"line_number":100,"context_line":"            raise exception.NovaException(_(\"Invalid share format\"))"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_5044a1b5","line":98,"updated":"2015-11-11 15:57:24.000000000","message":"Shouldn\u0027t this be validated on the cinder side when initializing the connection rather than pass garbage to nova, then we try to connect with it and fail with a very obscure error.  i.e. OK it\u0027s invalid, but why?  Where is the valid share format documented?","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return conf"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _parse_vz_share(self, vz_share):"},{"line_number":98,"context_line":"        m \u003d re.search(self.SHARE_FORMAT_REGEX, vz_share)"},{"line_number":99,"context_line":"        if not m:"},{"line_number":100,"context_line":"            raise exception.NovaException(_(\"Invalid share format\"))"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_40dfa1d5","line":98,"in_reply_to":"da85f559_5044a1b5","updated":"2015-11-12 18:11:50.000000000","message":"There are up to 3 parameters to mount vzstorage: cluster name, list of metadata servers and password. This regex is used to split string share into them.\n\nI think we should use os-brick for mounting filesystems and I\u0027ve added spec for it - https://review.openstack.org/#/c/239851/\nBlueprint - https://blueprints.launchpad.net/openstack/?searchtext\u003dlibvirt-os-brick-in-remotefs-volumes","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def _parse_vz_share(self, vz_share):"},{"line_number":98,"context_line":"        m \u003d re.search(self.SHARE_FORMAT_REGEX, vz_share)"},{"line_number":99,"context_line":"        if not m:"},{"line_number":100,"context_line":"            raise exception.NovaException(_(\"Invalid share format\"))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if m.group(1):"},{"line_number":103,"context_line":"            mds_list \u003d m.group(1).split(\u0027,\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_70dd25df","line":100,"updated":"2015-11-11 15:57:24.000000000","message":"I\u0027d prefer to use some form of the Invalid nova exception so the 404 is set, maybe this exception:\n\nhttps://github.com/openstack/nova/blob/master/nova/exception.py#L320","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            mds_list \u003d None"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        return {\u0027cluster_name\u0027: m.group(2),"},{"line_number":108,"context_line":"                \u0027mds_list\u0027: mds_list,"},{"line_number":109,"context_line":"                \u0027password\u0027: m.group(3)}"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_507ca1b4","line":107,"updated":"2015-11-11 15:57:24.000000000","message":"Can we at least turn this dict into a namedtuple?","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            mds_list \u003d None"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        return {\u0027cluster_name\u0027: m.group(2),"},{"line_number":108,"context_line":"                \u0027mds_list\u0027: mds_list,"},{"line_number":109,"context_line":"                \u0027password\u0027: m.group(3)}"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_60b3c598","line":107,"in_reply_to":"da85f559_507ca1b4","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        cluster_name \u003d self._parse_vz_share(vz_share)[\u0027cluster_name\u0027]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        mount_cmd \u003d [\u0027pstorage-mount\u0027, \u0027-c\u0027, cluster_name,"},{"line_number":117,"context_line":"                     \u0027-u\u0027, CONF.libvirt.vzstorage_mount_user,"},{"line_number":118,"context_line":"                     \u0027-g\u0027, CONF.libvirt.vzstorage_mount_group,"},{"line_number":119,"context_line":"                     \u0027-m\u0027, CONF.libvirt.vzstorage_mount_perms,"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_b0e4eddf","line":116,"updated":"2015-11-11 15:57:24.000000000","message":"Can you point me at a public man page for pstorage-mount?  I find lots of wikis and articles but don\u0027t see a public man page anywhere.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f85b819d70372ebcabface40ed7c8e308bf36bb0","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        cluster_name \u003d self._parse_vz_share(vz_share)[\u0027cluster_name\u0027]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        mount_cmd \u003d [\u0027pstorage-mount\u0027, \u0027-c\u0027, cluster_name,"},{"line_number":117,"context_line":"                     \u0027-u\u0027, CONF.libvirt.vzstorage_mount_user,"},{"line_number":118,"context_line":"                     \u0027-g\u0027, CONF.libvirt.vzstorage_mount_group,"},{"line_number":119,"context_line":"                     \u0027-m\u0027, CONF.libvirt.vzstorage_mount_perms,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a8ffd7b_f4caf24e","line":116,"in_reply_to":"da85f559_ace53109","updated":"2015-11-24 20:29:32.000000000","message":"We might want to put that in the code as a comment or something, googling for \u0027pstorage-mount man page\u0027 doesn\u0027t find that.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        cluster_name \u003d self._parse_vz_share(vz_share)[\u0027cluster_name\u0027]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        mount_cmd \u003d [\u0027pstorage-mount\u0027, \u0027-c\u0027, cluster_name,"},{"line_number":117,"context_line":"                     \u0027-u\u0027, CONF.libvirt.vzstorage_mount_user,"},{"line_number":118,"context_line":"                     \u0027-g\u0027, CONF.libvirt.vzstorage_mount_group,"},{"line_number":119,"context_line":"                     \u0027-m\u0027, CONF.libvirt.vzstorage_mount_perms,"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_ace53109","line":116,"in_reply_to":"da85f559_b0e4eddf","updated":"2015-11-12 18:11:50.000000000","message":"https://static.openvz.org/vz-man/man1/pstorage-mount.1.gz.html","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                     \u0027-u\u0027, CONF.libvirt.vzstorage_mount_user,"},{"line_number":118,"context_line":"                     \u0027-g\u0027, CONF.libvirt.vzstorage_mount_group,"},{"line_number":119,"context_line":"                     \u0027-m\u0027, CONF.libvirt.vzstorage_mount_perms,"},{"line_number":120,"context_line":"                     \u0027-l\u0027, \u0027/var/log/pstorage/%s/nova.log.gz\u0027 % cluster_name]"},{"line_number":121,"context_line":"        mount_cmd.extend([mount_path])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_90af6929","line":120,"updated":"2015-11-11 15:57:24.000000000","message":"This log path should probably be configurable.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                     \u0027-u\u0027, CONF.libvirt.vzstorage_mount_user,"},{"line_number":118,"context_line":"                     \u0027-g\u0027, CONF.libvirt.vzstorage_mount_group,"},{"line_number":119,"context_line":"                     \u0027-m\u0027, CONF.libvirt.vzstorage_mount_perms,"},{"line_number":120,"context_line":"                     \u0027-l\u0027, \u0027/var/log/pstorage/%s/nova.log.gz\u0027 % cluster_name]"},{"line_number":121,"context_line":"        mount_cmd.extend([mount_path])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_80aee92b","line":120,"in_reply_to":"da85f559_90af6929","updated":"2015-11-12 18:11:50.000000000","message":"OK","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        try:"},{"line_number":124,"context_line":"            utils.execute(*mount_cmd, run_as_root\u003dTrue)"},{"line_number":125,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":126,"context_line":"            if \u0027Device or resource busy\u0027 in exc.message:"},{"line_number":127,"context_line":"                LOG.warn(_LW(\"%s is already mounted\"), cluster_name)"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_cb84600c","line":126,"updated":"2015-11-11 15:57:24.000000000","message":"Does pstorage-mount provide an exit value that would tell us this?  That\u0027d be much better to check than parsing an error message which might change underneath us.\n\nAlso, use six.text_text(exc) rather than relying on exc.message.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            if \u0027Device or resource busy\u0027 in exc.message:"},{"line_number":127,"context_line":"                LOG.warn(_LW(\"%s is already mounted\"), cluster_name)"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                raise"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _umount(self, vz_share, mount_path):"},{"line_number":132,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_abfb1c7a","line":129,"updated":"2015-11-11 15:57:24.000000000","message":"I feel we could do better using something like this:\n\nwith excutils.save_and_reraise_exception() as ctxt:\n    if \u0027Device or resource busy\u0027 in six.text_type(exc):\n        LOG.warning(...)\n        ctxt.reraise \u003d False\n\nSee:\n\nhttp://docs.openstack.org/developer/oslo.utils/api/excutils.html","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"a05efcb25973681435848706eca1038a3204675d","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            if \u0027Device or resource busy\u0027 in exc.message:"},{"line_number":127,"context_line":"                LOG.warn(_LW(\"%s is already mounted\"), cluster_name)"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                raise"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def _umount(self, vz_share, mount_path):"},{"line_number":132,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_407b21be","line":129,"in_reply_to":"da85f559_abfb1c7a","updated":"2015-11-12 18:11:50.000000000","message":"OK, I\u0027ll rewrite this part","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        try:"},{"line_number":133,"context_line":"            utils.execute(\u0027umount\u0027, mount_path, run_as_root\u003dTrue)"},{"line_number":134,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":135,"context_line":"            if (\u0027device is busy\u0027 in six.text_type(exc) or"},{"line_number":136,"context_line":"                \u0027target is busy\u0027 in six.text_type(exc)):"},{"line_number":137,"context_line":"                LOG.debug(\"The vzstorage share %s is still in use.\", vz_share)"},{"line_number":138,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_2b1e4cbb","line":135,"updated":"2015-11-11 15:57:24.000000000","message":"Would be better to check exit codes if we can.\n\nI see this is all copied from the NFS volume driver, maybe we should add a TODO to pull this code up into the base class, or move it into libvirt_utils.  I remember wanting to do some refactoring in the libvirt volume drivers around mount/unmount operations which are very similar in most cases (nfs/remotefs/glusterfs/quobyte/smbfs).","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"c41e99ac6dd3d7df25fe39ee1af9b07d55f30f8b","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        try:"},{"line_number":133,"context_line":"            utils.execute(\u0027umount\u0027, mount_path, run_as_root\u003dTrue)"},{"line_number":134,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":135,"context_line":"            if (\u0027device is busy\u0027 in six.text_type(exc) or"},{"line_number":136,"context_line":"                \u0027target is busy\u0027 in six.text_type(exc)):"},{"line_number":137,"context_line":"                LOG.debug(\"The vzstorage share %s is still in use.\", vz_share)"},{"line_number":138,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba8a016a_cf171dec","line":135,"in_reply_to":"da85f559_2b1e4cbb","updated":"2015-11-16 19:33:09.000000000","message":"Unfortunately there is a problem in this umount code, I described it in bug https://bugs.launchpad.net/nova/+bug/1516758","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":135,"context_line":"            if (\u0027device is busy\u0027 in six.text_type(exc) or"},{"line_number":136,"context_line":"                \u0027target is busy\u0027 in six.text_type(exc)):"},{"line_number":137,"context_line":"                LOG.debug(\"The vzstorage share %s is still in use.\", vz_share)"},{"line_number":138,"context_line":"            else:"},{"line_number":139,"context_line":"                LOG.exception(_LE(\"Couldn\u0027t unmount the vzstorage share %s\"),"},{"line_number":140,"context_line":"                              vz_share)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_ab80fcbf","line":137,"updated":"2015-11-11 15:57:24.000000000","message":"This should probably be an INFO level message.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1094f20fa0ba1c739c58c659c5e42381ba9e5e42","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        vz_share \u003d connection_info[\u0027data\u0027][\u0027export\u0027]"},{"line_number":156,"context_line":"        mount_path \u003d self._get_mount_path(connection_info)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        if not self._cinder_mount:"},{"line_number":159,"context_line":"            self._umount(vz_share, mount_path)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da85f559_cb0ea08b","line":158,"updated":"2015-11-11 15:57:24.000000000","message":"Let\u0027s not rely on this variable, just check is_mounted first.","commit_id":"da072b0dd8305e89e17a2ac1013ad89026425934"},{"author":{"_account_id":12408,"name":"Maxim Nestratov","email":"mnestratov@virtuozzo.com","username":"mnestratov"},"change_message_id":"63119e0a67b1482c185dff102f4ef94864d82ca9","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"class LibvirtVZStorageVolumeDriver(fs.LibvirtBaseFileSystemVolumeDriver):"},{"line_number":67,"context_line":"    \"\"\"Class implements libvirt part of volume driver for SMBFS.\"\"\""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    SHARE_FORMAT_REGEX \u003d r\u0027(?:(\\S+):/)?([a-zA-Z0-9_-]+)(?::(\\S+))?\u0027"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a8ffd7b_ecad3989","line":67,"updated":"2015-11-25 10:25:20.000000000","message":"SMBFS?","commit_id":"2a79a78ae3ba1f62bc4815b42cc2262c754916df"},{"author":{"_account_id":12408,"name":"Maxim Nestratov","email":"mnestratov@virtuozzo.com","username":"mnestratov"},"change_message_id":"63119e0a67b1482c185dff102f4ef94864d82ca9","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        cfg_opts_set \u003d set(CONF.libvirt.vzstorage_mount_opts)"},{"line_number":75,"context_line":"        invalid_opts_set \u003d set((\u0027-c\u0027, \u0027-l\u0027, \u0027-C\u0027, \u0027-u\u0027, \u0027-g\u0027, \u0027-m\u0027,))"},{"line_number":76,"context_line":"        invalid_cfg_opts \u003d cfg_opts_set.intersection(invalid_opts_set)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        if invalid_cfg_opts:"},{"line_number":79,"context_line":"            msg \u003d (_LE(\u0027You can\\\u0027t use %s options in vzstorage_mount_opts \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a8ffd7b_8cd6edc3","line":76,"updated":"2015-11-25 10:25:20.000000000","message":"Could you please describe which options you can use, and why this set of options is invalid.","commit_id":"2a79a78ae3ba1f62bc4815b42cc2262c754916df"},{"author":{"_account_id":12408,"name":"Maxim Nestratov","email":"mnestratov@virtuozzo.com","username":"mnestratov"},"change_message_id":"917dc70f4f16b24bf9c06df294fc556783182e1a","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        cfg_opts_set \u003d set(CONF.libvirt.vzstorage_mount_opts)"},{"line_number":75,"context_line":"        invalid_opts_set \u003d set((\u0027-c\u0027, \u0027-l\u0027, \u0027-C\u0027, \u0027-u\u0027, \u0027-g\u0027, \u0027-m\u0027,))"},{"line_number":76,"context_line":"        invalid_cfg_opts \u003d cfg_opts_set.intersection(invalid_opts_set)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        if invalid_cfg_opts:"},{"line_number":79,"context_line":"            msg \u003d (_LE(\u0027You can\\\u0027t use %s options in vzstorage_mount_opts \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a8ffd7b_a7698227","line":76,"in_reply_to":"9a8ffd7b_67ff1aab","updated":"2015-11-25 10:53:54.000000000","message":"Could you please put this in code as comments?","commit_id":"2a79a78ae3ba1f62bc4815b42cc2262c754916df"},{"author":{"_account_id":12661,"name":"Dmitry Guryanov","email":"dmitry.guryanov@gmail.com","username":"dguryanov"},"change_message_id":"1e723c65c42501fabc91d3e26b92bbe6721739b6","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        cfg_opts_set \u003d set(CONF.libvirt.vzstorage_mount_opts)"},{"line_number":75,"context_line":"        invalid_opts_set \u003d set((\u0027-c\u0027, \u0027-l\u0027, \u0027-C\u0027, \u0027-u\u0027, \u0027-g\u0027, \u0027-m\u0027,))"},{"line_number":76,"context_line":"        invalid_cfg_opts \u003d cfg_opts_set.intersection(invalid_opts_set)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        if invalid_cfg_opts:"},{"line_number":79,"context_line":"            msg \u003d (_LE(\u0027You can\\\u0027t use %s options in vzstorage_mount_opts \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a8ffd7b_67ff1aab","line":76,"in_reply_to":"9a8ffd7b_8cd6edc3","updated":"2015-11-25 10:48:59.000000000","message":"You can use all other options.\n\n-c  - cluster name\n\n-l - log file, can include %(cluster_name)s so handled separately\n\n-C - SSD cache file, the same thing with %(cluster_name)s\n\n-u, -g -, -m - owner and permissions, there are default values for these options.","commit_id":"2a79a78ae3ba1f62bc4815b42cc2262c754916df"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"17a7d2a94ec8ad0885195d291cea36b641ec4a55","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    ]"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"CONF \u003d cfg.CONF"},{"line_number":60,"context_line":"CONF.register_opts(volume_opts, \u0027libvirt\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"VzShare \u003d collections.namedtuple(\u0027VzShare\u0027,"},{"line_number":63,"context_line":"                                 [\u0027cluster_name\u0027, \u0027mds_list\u0027, \u0027password\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_197d66b1","line":60,"updated":"2016-05-10 09:00:01.000000000","message":"As a heads up, all new configuration values really need to go into the central location:\nhttps://github.com/openstack/nova/blob/master/nova/conf/libvirt.py","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"78d43206731e81a0491c765f7f152cba9b272059","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    ]"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"CONF \u003d cfg.CONF"},{"line_number":60,"context_line":"CONF.register_opts(volume_opts, \u0027libvirt\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"VzShare \u003d collections.namedtuple(\u0027VzShare\u0027,"},{"line_number":63,"context_line":"                                 [\u0027cluster_name\u0027, \u0027mds_list\u0027, \u0027password\u0027])"}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_dd86ae15","line":60,"in_reply_to":"dab17558_197d66b1","updated":"2016-05-12 10:25:13.000000000","message":"Done","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"17a7d2a94ec8ad0885195d291cea36b641ec4a55","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        # more than x86 architectures."},{"line_number":97,"context_line":"        self.connector \u003d connector.InitiatorConnector.factory("},{"line_number":98,"context_line":"            \u0027vzstorage\u0027, utils.get_root_helper(),"},{"line_number":99,"context_line":"            vzstorage_mount_point_base\u003dCONF.libvirt.vzstorage_mount_point_base)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _get_mount_point_base(self):"},{"line_number":102,"context_line":"        return CONF.libvirt.vzstorage_mount_point_base"}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_94cd9db9","line":99,"range":{"start_line":99,"start_character":39,"end_line":99,"end_character":78},"updated":"2016-05-10 09:00:01.000000000","message":"I liked how you called _get_mount_point_base() above","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"78d43206731e81a0491c765f7f152cba9b272059","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        # more than x86 architectures."},{"line_number":97,"context_line":"        self.connector \u003d connector.InitiatorConnector.factory("},{"line_number":98,"context_line":"            \u0027vzstorage\u0027, utils.get_root_helper(),"},{"line_number":99,"context_line":"            vzstorage_mount_point_base\u003dCONF.libvirt.vzstorage_mount_point_base)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _get_mount_point_base(self):"},{"line_number":102,"context_line":"        return CONF.libvirt.vzstorage_mount_point_base"}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_f73918f4","line":99,"range":{"start_line":99,"start_character":39,"end_line":99,"end_character":78},"in_reply_to":"dab17558_94cd9db9","updated":"2016-05-12 10:25:13.000000000","message":"Commented code will be removed in the next patchset","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"17a7d2a94ec8ad0885195d291cea36b641ec4a55","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def get_config(self, connection_info, disk_info):"},{"line_number":110,"context_line":"        \"\"\"Returns xml for libvirt.\"\"\""},{"line_number":111,"context_line":"        conf \u003d super(LibvirtVZStorageVolumeDriver,"},{"line_number":112,"context_line":"                     self).get_config(connection_info, disk_info)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        conf.source_type \u003d \u0027file\u0027"},{"line_number":115,"context_line":"        conf.driver_cache \u003d \u0027writethrough\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_54bdf5b5","line":112,"updated":"2016-05-10 09:00:01.000000000","message":"I wonder if you can \"fix\" get_config so it gets all the correct details out of the connection_info already?\n\nIf thats just an if vz thing, then here is probably better.","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"78d43206731e81a0491c765f7f152cba9b272059","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def get_config(self, connection_info, disk_info):"},{"line_number":110,"context_line":"        \"\"\"Returns xml for libvirt.\"\"\""},{"line_number":111,"context_line":"        conf \u003d super(LibvirtVZStorageVolumeDriver,"},{"line_number":112,"context_line":"                     self).get_config(connection_info, disk_info)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        conf.source_type \u003d \u0027file\u0027"},{"line_number":115,"context_line":"        conf.driver_cache \u003d \u0027writethrough\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_7a4a2d57","line":112,"in_reply_to":"dab17558_54bdf5b5","updated":"2016-05-12 10:25:13.000000000","message":"I don\u0027t see any following parameters set in base classes of LibvirtVZStorageVolumeDriver, if that\u0027s what you mean.","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"17a7d2a94ec8ad0885195d291cea36b641ec4a55","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        LOG.debug(\"Calling os-brick to mount vzstorage\")"},{"line_number":157,"context_line":"        vz_share \u003d connection_info[\u0027data\u0027][\u0027export\u0027]"},{"line_number":158,"context_line":"        connection_info[\u0027data\u0027][\u0027options\u0027] \u003d self._get_mount_opts(vz_share)"},{"line_number":159,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info[\u0027data\u0027])"},{"line_number":160,"context_line":"        LOG.debug(\"Attached vzstorage volume %s\", device_info)"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_f44189aa","line":158,"range":{"start_line":158,"start_character":33,"end_line":158,"end_character":40},"updated":"2016-05-10 09:00:01.000000000","message":"shouldn\u0027t that be mount_options?","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"78d43206731e81a0491c765f7f152cba9b272059","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        LOG.debug(\"Calling os-brick to mount vzstorage\")"},{"line_number":157,"context_line":"        vz_share \u003d connection_info[\u0027data\u0027][\u0027export\u0027]"},{"line_number":158,"context_line":"        connection_info[\u0027data\u0027][\u0027options\u0027] \u003d self._get_mount_opts(vz_share)"},{"line_number":159,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info[\u0027data\u0027])"},{"line_number":160,"context_line":"        LOG.debug(\"Attached vzstorage volume %s\", device_info)"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"dab17558_fd0c523d","line":158,"range":{"start_line":158,"start_character":33,"end_line":158,"end_character":40},"in_reply_to":"dab17558_f44189aa","updated":"2016-05-12 10:25:13.000000000","message":"Nope, AFAIU, mount_options is a parameter to provide options for mount(8) util. What we have here are \"flags\" in os-brick terms, and are passed as \"options\"","commit_id":"e775b60584eacb80d5025964b67f4b51f0bfc756"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"014f0e1acd3e0ee7d485e0d58b2f3a53c4c9d994","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        invalid_cfg_opts \u003d cfg_opts_set.intersection(invalid_opts_set)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        if invalid_cfg_opts:"},{"line_number":52,"context_line":"            msg \u003d (_LE(\u0027You can\\\u0027t use %s options in vzstorage_mount_opts \u0027"},{"line_number":53,"context_line":"                       \u0027configuration parameter.\u0027) %"},{"line_number":54,"context_line":"                   \u0027, \u0027.join(invalid_cfg_opts))"},{"line_number":55,"context_line":"            raise exception.NovaException(msg)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_a0af31e2","line":52,"updated":"2016-05-27 14:54:59.000000000","message":"You could use double quotes for the string to avoid needing to escape the single quote.\n\nSince this is used just for an exception message it should use _() instead of _LE()","commit_id":"decefae562551fe1d8f3846674417b7e2bec1c1e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"23d0aed03e30db214891fa6a58d08800255566d0","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        invalid_opts_set \u003d set((\u0027-c\u0027, \u0027-l\u0027, \u0027-C\u0027, \u0027-u\u0027, \u0027-g\u0027, \u0027-m\u0027,))"},{"line_number":49,"context_line":"        invalid_cfg_opts \u003d cfg_opts_set.intersection(invalid_opts_set)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        if invalid_cfg_opts:"},{"line_number":52,"context_line":"            msg \u003d (_(\"You can\u0027t use %s options in vzstorage_mount_opts \""},{"line_number":53,"context_line":"                     \"configuration parameter.\") %"},{"line_number":54,"context_line":"                     \u0027, \u0027.join(invalid_cfg_opts))"},{"line_number":55,"context_line":"            raise exception.NovaException(msg)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        # Call the factory here so we can support"},{"line_number":58,"context_line":"        # more than x86 architectures."}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_8da2b649","line":55,"range":{"start_line":51,"start_character":8,"end_line":55,"end_character":46},"updated":"2016-06-23 18:14:22.000000000","message":"I don\u0027t see a unit test for this.","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"f4345128c5ce3aa9f088dbf5078ed08959664c48","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        invalid_opts_set \u003d set((\u0027-c\u0027, \u0027-l\u0027, \u0027-C\u0027, \u0027-u\u0027, \u0027-g\u0027, \u0027-m\u0027,))"},{"line_number":49,"context_line":"        invalid_cfg_opts \u003d cfg_opts_set.intersection(invalid_opts_set)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        if invalid_cfg_opts:"},{"line_number":52,"context_line":"            msg \u003d (_(\"You can\u0027t use %s options in vzstorage_mount_opts \""},{"line_number":53,"context_line":"                     \"configuration parameter.\") %"},{"line_number":54,"context_line":"                     \u0027, \u0027.join(invalid_cfg_opts))"},{"line_number":55,"context_line":"            raise exception.NovaException(msg)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        # Call the factory here so we can support"},{"line_number":58,"context_line":"        # more than x86 architectures."}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_55a2f04b","line":55,"range":{"start_line":51,"start_character":8,"end_line":55,"end_character":46},"in_reply_to":"3aaa91ec_8da2b649","updated":"2016-06-24 13:31:24.000000000","message":"Done","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"23d0aed03e30db214891fa6a58d08800255566d0","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _parse_vz_share(self, vz_share):"},{"line_number":78,"context_line":"        m \u003d re.search(self.SHARE_FORMAT_REGEX, vz_share)"},{"line_number":79,"context_line":"        if not m:"},{"line_number":80,"context_line":"            msg \u003d _(\"Invalid share format: %s\") % vz_share"},{"line_number":81,"context_line":"            raise exception.InvalidVolume(msg)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if m.group(1):"},{"line_number":84,"context_line":"            mds_list \u003d m.group(1).split(\u0027,\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_cda2fe98","line":81,"range":{"start_line":80,"start_character":12,"end_line":81,"end_character":46},"updated":"2016-06-23 18:14:22.000000000","message":"This could include a password in it, right? So it seems we should scrub the password from vz_share, or just raise an exception and include the valid regex.","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"f4345128c5ce3aa9f088dbf5078ed08959664c48","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _parse_vz_share(self, vz_share):"},{"line_number":78,"context_line":"        m \u003d re.search(self.SHARE_FORMAT_REGEX, vz_share)"},{"line_number":79,"context_line":"        if not m:"},{"line_number":80,"context_line":"            msg \u003d _(\"Invalid share format: %s\") % vz_share"},{"line_number":81,"context_line":"            raise exception.InvalidVolume(msg)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if m.group(1):"},{"line_number":84,"context_line":"            mds_list \u003d m.group(1).split(\u0027,\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_f5915cf2","line":81,"range":{"start_line":80,"start_character":12,"end_line":81,"end_character":46},"in_reply_to":"3aaa91ec_cda2fe98","updated":"2016-06-24 13:31:24.000000000","message":"Done","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"23d0aed03e30db214891fa6a58d08800255566d0","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.connector.disconnect_volume(connection_info[\u0027data\u0027], None)"},{"line_number":126,"context_line":"        LOG.debug(\"Disconnected Vzstorage Volume %s\", disk_dev)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        super(LibvirtVZStorageVolumeDriver,"},{"line_number":129,"context_line":"              self).disconnect_volume(connection_info, disk_dev)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_eddd3ae1","line":129,"range":{"start_line":128,"start_character":8,"end_line":129,"end_character":64},"updated":"2016-06-23 18:14:22.000000000","message":"This doesn\u0027t hurt but it\u0027s not really needed.","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"},{"author":{"_account_id":13431,"name":"Evgeny Antyshev","email":"eantyshev@gmail.com","username":"eantyshev"},"change_message_id":"f4345128c5ce3aa9f088dbf5078ed08959664c48","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.connector.disconnect_volume(connection_info[\u0027data\u0027], None)"},{"line_number":126,"context_line":"        LOG.debug(\"Disconnected Vzstorage Volume %s\", disk_dev)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        super(LibvirtVZStorageVolumeDriver,"},{"line_number":129,"context_line":"              self).disconnect_volume(connection_info, disk_dev)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3aaa91ec_a7c68697","line":129,"range":{"start_line":128,"start_character":8,"end_line":129,"end_character":64},"in_reply_to":"3aaa91ec_eddd3ae1","updated":"2016-06-24 13:31:24.000000000","message":"Done","commit_id":"4688e30aa978061221f4a4aa022d0300a92e0bc8"}]}
