)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8a7a01166b1fcae95fb86ab51150586337c2c34f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"network-attached file systems such as Gluster or NFS. This patch"},{"line_number":11,"context_line":"adds a new volume driver in order to support attaching volumes"},{"line_number":12,"context_line":"hosted on SMB shares."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Co-Authored-By: Gabriel Samfira \u003cgsamfira@cloudbasesolutions.com\u003e"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I1db3d2a6d8ee94932348c63cc03698fdefff0b5c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5a890539_6337ddfe","line":13,"updated":"2014-12-03 13:16:23.000000000","message":"I think that you need a DocImpact flag for the new configuration variables","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"c25a7ac984422b50a12f695ccad0ba1f0d3b5468","unresolved":false,"context_lines":[{"line_number":10,"context_line":"network-attached file systems such as Gluster or NFS. This patch"},{"line_number":11,"context_line":"adds a new volume driver in order to support attaching volumes"},{"line_number":12,"context_line":"hosted on SMB shares."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Co-Authored-By: Gabriel Samfira \u003cgsamfira@cloudbasesolutions.com\u003e"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I1db3d2a6d8ee94932348c63cc03698fdefff0b5c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5a890539_19892a6f","line":13,"in_reply_to":"5a890539_6337ddfe","updated":"2014-12-03 14:24:16.000000000","message":"Done","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"}],"nova/tests/unit/virt/libvirt/test_volume.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8a7a01166b1fcae95fb86ab51150586337c2c34f","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"    def test_libvirt_smbfs_driver(self):"},{"line_number":1163,"context_line":"        mnt_base \u003d \u0027/mnt\u0027"},{"line_number":1164,"context_line":"        self.flags(smbfs_mount_point_base\u003dmnt_base, group\u003d\u0027libvirt\u0027)"},{"line_number":1165,"context_line":"        self.stubs.Set(libvirt_utils, \u0027is_mounted\u0027, lambda x, d: False)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":"        libvirt_driver \u003d volume.LibvirtSMBFSVolumeDriver(self.fake_conn)"},{"line_number":1168,"context_line":"        export_string \u003d \u0027//192.168.1.1/volumes\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_23c79513","line":1165,"updated":"2014-12-03 13:16:23.000000000","message":"can you use mock here instead of stubs?","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"c25a7ac984422b50a12f695ccad0ba1f0d3b5468","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"    def test_libvirt_smbfs_driver(self):"},{"line_number":1163,"context_line":"        mnt_base \u003d \u0027/mnt\u0027"},{"line_number":1164,"context_line":"        self.flags(smbfs_mount_point_base\u003dmnt_base, group\u003d\u0027libvirt\u0027)"},{"line_number":1165,"context_line":"        self.stubs.Set(libvirt_utils, \u0027is_mounted\u0027, lambda x, d: False)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":"        libvirt_driver \u003d volume.LibvirtSMBFSVolumeDriver(self.fake_conn)"},{"line_number":1168,"context_line":"        export_string \u003d \u0027//192.168.1.1/volumes\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_cfb0afff","line":1165,"in_reply_to":"5a890539_23c79513","updated":"2014-12-03 14:24:16.000000000","message":"Done","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a6db875c1742f75983435483067a9c2f4eef6306","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"            (\u0027mount\u0027, \u0027-t\u0027, \u0027cifs\u0027, \u0027-o\u0027, \u0027user\u003dguest,uid\u003d107,gid\u003d105\u0027,"},{"line_number":1241,"context_line":"             export_string, export_mnt_base),"},{"line_number":1242,"context_line":"            (\u0027umount\u0027, export_mnt_base)]"},{"line_number":1243,"context_line":"        self.assertEqual(expected_commands, self.executes)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_55e11399","line":1243,"updated":"2014-12-09 17:15:05.000000000","message":"++ good tests.","commit_id":"561f8afa5fbc7d94cd65616225597850585d909f"}],"nova/virt/libvirt/remotefs.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8a7a01166b1fcae95fb86ab51150586337c2c34f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        utils.execute(\u0027umount\u0027, mount_path, run_as_root\u003dTrue)"},{"line_number":46,"context_line":"    except processutils.ProcessExecutionError as exc:"},{"line_number":47,"context_line":"        if \u0027target is busy\u0027 in exc.message:"},{"line_number":48,"context_line":"            LOG.debug(\"The share %s is still in use.\", export_path)"},{"line_number":49,"context_line":"        else:"},{"line_number":50,"context_line":"            LOG.exception(_LE(\"Couldn\u0027t unmount the share %s\"),"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_c3c6d148","line":47,"updated":"2014-12-03 13:16:23.000000000","message":"do you maybe want to think about a retry mechanism here?","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"c25a7ac984422b50a12f695ccad0ba1f0d3b5468","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        utils.execute(\u0027umount\u0027, mount_path, run_as_root\u003dTrue)"},{"line_number":46,"context_line":"    except processutils.ProcessExecutionError as exc:"},{"line_number":47,"context_line":"        if \u0027target is busy\u0027 in exc.message:"},{"line_number":48,"context_line":"            LOG.debug(\"The share %s is still in use.\", export_path)"},{"line_number":49,"context_line":"        else:"},{"line_number":50,"context_line":"            LOG.exception(_LE(\"Couldn\u0027t unmount the share %s\"),"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_cfab50d4","line":47,"in_reply_to":"5a890539_c3c6d148","updated":"2014-12-03 14:24:16.000000000","message":"The easiest thing would be to simply pass a number of attempts to the execute method, but this would cause a retry even if the share is used by another volume (in which case we would not want to unmount it).\n\nAnyway, this could be helpfull if for any other reason the share appears to be still in use.","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d901a5e25051e142f421e65d9d3cef810dcc4a24","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def mount_share(mount_path, export_path, share_type,"},{"line_number":26,"context_line":"                options\u003dNone, ensure\u003dFalse):"},{"line_number":27,"context_line":"    utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    mount_cmd \u003d [\u0027mount\u0027, \u0027-t\u0027, share_type]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_f86ff3c1","line":26,"updated":"2014-12-03 14:59:58.000000000","message":"Can you python API docs for this explaining what each param should be","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f7146b4ab53f4389b3d20bb08814507a54b72910","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def mount_share(mount_path, export_path, share_type,"},{"line_number":26,"context_line":"                options\u003dNone, ensure\u003dFalse):"},{"line_number":27,"context_line":"    utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    mount_cmd \u003d [\u0027mount\u0027, \u0027-t\u0027, share_type]"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_1edae777","line":26,"in_reply_to":"5a890539_f86ff3c1","updated":"2014-12-03 15:33:18.000000000","message":"Done","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d901a5e25051e142f421e65d9d3cef810dcc4a24","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            raise"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def unmount_share(mount_path, export_path):"},{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        utils.execute(\u0027umount\u0027, mount_path, run_as_root\u003dTrue,"},{"line_number":46,"context_line":"                      attempts\u003d3, delay_on_retry\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_38ac1bed","line":43,"updated":"2014-12-03 14:59:58.000000000","message":"Likewise API docs here","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f7146b4ab53f4389b3d20bb08814507a54b72910","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            raise"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def unmount_share(mount_path, export_path):"},{"line_number":44,"context_line":"    try:"},{"line_number":45,"context_line":"        utils.execute(\u0027umount\u0027, mount_path, run_as_root\u003dTrue,"},{"line_number":46,"context_line":"                      attempts\u003d3, delay_on_retry\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_5ee0ef25","line":43,"in_reply_to":"5a890539_38ac1bed","updated":"2014-12-03 15:33:18.000000000","message":"Done","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a6db875c1742f75983435483067a9c2f4eef6306","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        utils.execute(*mount_cmd, run_as_root\u003dTrue)"},{"line_number":43,"context_line":"    except processutils.ProcessExecutionError as exc:"},{"line_number":44,"context_line":"        if \u0027Device or resource busy\u0027 in exc.message:"},{"line_number":45,"context_line":"            LOG.warn(_LW(\"%s is already mounted\"), export_path)"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            raise"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_75efef87","line":45,"updated":"2014-12-09 17:15:05.000000000","message":"LOG.warning instead of LOG.warn (it generates a pep8 error about py3k compat)","commit_id":"561f8afa5fbc7d94cd65616225597850585d909f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a6db875c1742f75983435483067a9c2f4eef6306","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                      attempts\u003d3, delay_on_retry\u003dTrue)"},{"line_number":59,"context_line":"    except processutils.ProcessExecutionError as exc:"},{"line_number":60,"context_line":"        if \u0027target is busy\u0027 in exc.message:"},{"line_number":61,"context_line":"            LOG.debug(\"The share %s is still in use.\", export_path)"},{"line_number":62,"context_line":"        else:"},{"line_number":63,"context_line":"            LOG.exception(_LE(\"Couldn\u0027t unmount the share %s\"),"},{"line_number":64,"context_line":"                          export_path)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a961159_95f29b6d","line":61,"updated":"2014-12-09 17:15:05.000000000","message":"What makes this particular failure case special? If the share cannot be unmounted for any reason, I would expect the LOG.exception() to be called here, no?","commit_id":"561f8afa5fbc7d94cd65616225597850585d909f"}],"nova/virt/libvirt/volume.py":[{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"bcd6681fad45c2807dff5f67b3d6c8e2faf3bae8","unresolved":false,"context_lines":[{"line_number":739,"context_line":"        super(LibvirtSMBFSVolumeDriver,"},{"line_number":740,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":741,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":742,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def connect_volume(self, connection_info, disk_info):"},{"line_number":745,"context_line":"        \"\"\"Connect the volume. Returns xml for libvirt.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_b4dd0a17","line":742,"updated":"2014-11-10 23:22:28.000000000","message":"Is there an existing parser we can leverage for this? If not, could we create the necessary parser(s) to match and replace?","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"d4f20a3e447b67ba5421fbbe100d3e3d24e812cd","unresolved":false,"context_lines":[{"line_number":739,"context_line":"        super(LibvirtSMBFSVolumeDriver,"},{"line_number":740,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":741,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":742,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def connect_volume(self, connection_info, disk_info):"},{"line_number":745,"context_line":"        \"\"\"Connect the volume. Returns xml for libvirt.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_957a4875","line":742,"in_reply_to":"5a890539_1714d34c","updated":"2014-11-14 15:29:24.000000000","message":"I was just wondering if it would be more robust to walk the string to retrieve the username from the mount options rather then using a regex. You know the adage: You have a problem, and you think, \"I know, I\u0027ll use a regex.\" Now you have two problems.","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"c06623aa48b2d5db6945b0a69c98db40f9688c63","unresolved":false,"context_lines":[{"line_number":739,"context_line":"        super(LibvirtSMBFSVolumeDriver,"},{"line_number":740,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":741,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":742,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def connect_volume(self, connection_info, disk_info):"},{"line_number":745,"context_line":"        \"\"\"Connect the volume. Returns xml for libvirt.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_567626a5","line":742,"in_reply_to":"5a890539_957a4875","updated":"2014-11-14 16:46:44.000000000","message":"Oh, I see. Well, sure, that\u0027s a point. I just thought that a regex may be cleaner in this case.","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"aa876c648abaffef659e3cbe23020678da93d28e","unresolved":false,"context_lines":[{"line_number":739,"context_line":"        super(LibvirtSMBFSVolumeDriver,"},{"line_number":740,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":741,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":742,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def connect_volume(self, connection_info, disk_info):"},{"line_number":745,"context_line":"        \"\"\"Connect the volume. Returns xml for libvirt.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_1714d34c","line":742,"in_reply_to":"5a890539_b4dd0a17","updated":"2014-11-13 11:37:53.000000000","message":"I\u0027m not sure I get it. This compiled regex is actually used in order to retrieve the username from the mount options and remove the domain name, if exists.","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"bcd6681fad45c2807dff5f67b3d6c8e2faf3bae8","unresolved":false,"context_lines":[{"line_number":740,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":741,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":742,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def connect_volume(self, connection_info, disk_info):"},{"line_number":745,"context_line":"        \"\"\"Connect the volume. Returns xml for libvirt.\"\"\""},{"line_number":746,"context_line":"        conf \u003d super(LibvirtSMBFSVolumeDriver,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_54cea65b","line":743,"updated":"2014-11-10 23:22:28.000000000","message":"Should there be a get_config method?","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"aa876c648abaffef659e3cbe23020678da93d28e","unresolved":false,"context_lines":[{"line_number":740,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":741,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":742,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def connect_volume(self, connection_info, disk_info):"},{"line_number":745,"context_line":"        \"\"\"Connect the volume. Returns xml for libvirt.\"\"\""},{"line_number":746,"context_line":"        conf \u003d super(LibvirtSMBFSVolumeDriver,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_b7e13f9c","line":743,"in_reply_to":"5a890539_54cea65b","updated":"2014-11-13 11:37:53.000000000","message":"You are right. When this was written, the conf part was not split up from the connect_volume method. I\u0027m updating this accordingly.","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"bcd6681fad45c2807dff5f67b3d6c8e2faf3bae8","unresolved":false,"context_lines":[{"line_number":770,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":771,"context_line":"            if (\u0027device is busy\u0027 in exc.message or"},{"line_number":772,"context_line":"                \u0027target is busy\u0027 in exc.message):"},{"line_number":773,"context_line":"                LOG.debug(\"The NFS share %s is still in use.\", export)"},{"line_number":774,"context_line":"            else:"},{"line_number":775,"context_line":"                LOG.exception(_LE(\"Couldn\u0027t unmount the SMB share %s\"), export)"},{"line_number":776,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_74fc823f","line":773,"updated":"2014-11-10 23:22:28.000000000","message":"s/NFS/SMB/ ?","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"aa876c648abaffef659e3cbe23020678da93d28e","unresolved":false,"context_lines":[{"line_number":770,"context_line":"        except processutils.ProcessExecutionError as exc:"},{"line_number":771,"context_line":"            if (\u0027device is busy\u0027 in exc.message or"},{"line_number":772,"context_line":"                \u0027target is busy\u0027 in exc.message):"},{"line_number":773,"context_line":"                LOG.debug(\"The NFS share %s is still in use.\", export)"},{"line_number":774,"context_line":"            else:"},{"line_number":775,"context_line":"                LOG.exception(_LE(\"Couldn\u0027t unmount the SMB share %s\"), export)"},{"line_number":776,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_7750b75e","line":773,"in_reply_to":"5a890539_74fc823f","updated":"2014-11-13 11:37:53.000000000","message":"Whops, my bad.","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":11642,"name":"Jesse J. Cook","email":"jesse.cook@rackspace.com","username":"crashenx"},"change_message_id":"bcd6681fad45c2807dff5f67b3d6c8e2faf3bae8","unresolved":false,"context_lines":[{"line_number":797,"context_line":"        mount_options \u003d ((options or \"\") + \" \" +"},{"line_number":798,"context_line":"                         CONF.libvirt.smbfs_mount_options)"},{"line_number":799,"context_line":"        mnt_flags \u003d self._parse_credentials(mount_options)"},{"line_number":800,"context_line":"        smbfs_cmd.extend(mnt_flags.strip(\", \").split(\u0027 \u0027))"},{"line_number":801,"context_line":"        smbfs_cmd.extend([smbfs_share, mount_path])"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_34775ad6","line":800,"updated":"2014-11-10 23:22:28.000000000","message":"_parse_credentials only seems to be used for this call. Perhaps have it return in desired format rather than additional data manipulation after call.","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"aa876c648abaffef659e3cbe23020678da93d28e","unresolved":false,"context_lines":[{"line_number":797,"context_line":"        mount_options \u003d ((options or \"\") + \" \" +"},{"line_number":798,"context_line":"                         CONF.libvirt.smbfs_mount_options)"},{"line_number":799,"context_line":"        mnt_flags \u003d self._parse_credentials(mount_options)"},{"line_number":800,"context_line":"        smbfs_cmd.extend(mnt_flags.strip(\", \").split(\u0027 \u0027))"},{"line_number":801,"context_line":"        smbfs_cmd.extend([smbfs_share, mount_path])"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_375f0f74","line":800,"in_reply_to":"5a890539_34775ad6","updated":"2014-11-13 11:37:53.000000000","message":"Done","commit_id":"a11029a36417e11013edab8584791ab8d10df1bf"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"de3312d24bd5508eca2fd661f0ccb3e66c459c8a","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":815,"context_line":"        # Construct the SMBFS mount command."},{"line_number":816,"context_line":"        smbfs_cmd \u003d [\u0027mount\u0027, \u0027-t\u0027, \u0027cifs\u0027]"},{"line_number":817,"context_line":"        mount_options \u003d ((options or \"\") + \" \" +"},{"line_number":818,"context_line":"                         CONF.libvirt.smbfs_mount_options)"},{"line_number":819,"context_line":"        mnt_flags \u003d self._parse_credentials(mount_options)"},{"line_number":820,"context_line":"        smbfs_cmd.extend(mnt_flags)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_e353f613","line":817,"updated":"2014-12-02 14:24:10.000000000","message":"why not have default value for options\u003d\"\"?","commit_id":"7e0e099c509198dfea03f9fac4db5210420fa46c"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"41180c672a2427efabb0281a7b5126de79413bb7","unresolved":false,"context_lines":[{"line_number":826,"context_line":"            if ensure and \u0027Device or resource busy\u0027 in exc.message:"},{"line_number":827,"context_line":"                LOG.warn(_(\"%s is already mounted\"), smbfs_share)"},{"line_number":828,"context_line":"            else:"},{"line_number":829,"context_line":"                raise"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"class LibvirtAOEVolumeDriver(LibvirtBaseVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_a52e5740","line":829,"updated":"2014-12-02 12:58:12.000000000","message":"We\u0027re trying to get away from mixing CLI tool invocation with the volume driver code.\n\nPlease create a standlone file\n\n nova/virt/libvirt/smb.py\n\nto provide helpers along the lines of:\n\n  def mount_share(share_name, path)\n    ....\n  def unmount_share(path)\n    ...\n\nSo that this volume.py file only has todo  smb.mount_share(..)  smb.unmount_share(...)","commit_id":"7e0e099c509198dfea03f9fac4db5210420fa46c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8a7a01166b1fcae95fb86ab51150586337c2c34f","unresolved":false,"context_lines":[{"line_number":748,"context_line":"    def __init__(self, connection):"},{"line_number":749,"context_line":"        super(LibvirtSMBFSVolumeDriver,"},{"line_number":750,"context_line":"              self).__init__(connection, is_block_dev\u003dFalse)"},{"line_number":751,"context_line":"        self.username_regex \u003d re.compile("},{"line_number":752,"context_line":"            r\"(user(?:name)?)\u003d(?:[^ ,]+\\\\)?([^ ,]+)\")"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"    def _get_device_path(self, connection_info):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_c3cdf15e","line":751,"updated":"2014-12-03 13:16:23.000000000","message":"nice!","commit_id":"8a122fd774ae84231aa08ed76abaca7b3c432a60"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d901a5e25051e142f421e65d9d3cef810dcc4a24","unresolved":false,"context_lines":[{"line_number":792,"context_line":"    def _ensure_mounted(self, smbfs_export, options\u003dNone):"},{"line_number":793,"context_line":"        mount_path \u003d self._get_mount_path(smbfs_export)"},{"line_number":794,"context_line":"        if not libvirt_utils.is_mounted(mount_path, smbfs_export):"},{"line_number":795,"context_line":"            self._mount_smbfs(mount_path, smbfs_export, options, ensure\u003dTrue)"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"    def _parse_credentials(self, mnt_flags):"},{"line_number":798,"context_line":"        if not self.username_regex.findall(mnt_flags):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_f53c5ee3","line":795,"updated":"2014-12-03 14:59:58.000000000","message":"I think this should just be inlined in connect_volume - it doesn\u0027t really need to be split out anymore.","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f7146b4ab53f4389b3d20bb08814507a54b72910","unresolved":false,"context_lines":[{"line_number":792,"context_line":"    def _ensure_mounted(self, smbfs_export, options\u003dNone):"},{"line_number":793,"context_line":"        mount_path \u003d self._get_mount_path(smbfs_export)"},{"line_number":794,"context_line":"        if not libvirt_utils.is_mounted(mount_path, smbfs_export):"},{"line_number":795,"context_line":"            self._mount_smbfs(mount_path, smbfs_export, options, ensure\u003dTrue)"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"    def _parse_credentials(self, mnt_flags):"},{"line_number":798,"context_line":"        if not self.username_regex.findall(mnt_flags):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_1e3e67b8","line":795,"in_reply_to":"5a890539_f53c5ee3","updated":"2014-12-03 15:33:18.000000000","message":"Done","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"d901a5e25051e142f421e65d9d3cef810dcc4a24","unresolved":false,"context_lines":[{"line_number":809,"context_line":"                         CONF.libvirt.smbfs_mount_options)"},{"line_number":810,"context_line":"        mnt_flags \u003d self._parse_credentials(mount_options)"},{"line_number":811,"context_line":"        remotefs.mount_share(mount_path, smbfs_share, share_type\u003d\u0027cifs\u0027,"},{"line_number":812,"context_line":"                             options\u003dmnt_flags)"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"class LibvirtAOEVolumeDriver(LibvirtBaseVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_183affcc","line":812,"updated":"2014-12-03 14:59:58.000000000","message":"This should just be inlined in connect_volume too.\n\nThe \u0027mount_options\u0027 line could then be simplified\n\n  options \u003d connection_info[\u0027data\u0027].get(\u0027options\u0027, \n                                                       CONF.libvirt.smbfs_mount_options)","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"},{"author":{"_account_id":8543,"name":"Lucian Petrut","email":"lpetrut@cloudbasesolutions.com","username":"plucian"},"change_message_id":"f7146b4ab53f4389b3d20bb08814507a54b72910","unresolved":false,"context_lines":[{"line_number":809,"context_line":"                         CONF.libvirt.smbfs_mount_options)"},{"line_number":810,"context_line":"        mnt_flags \u003d self._parse_credentials(mount_options)"},{"line_number":811,"context_line":"        remotefs.mount_share(mount_path, smbfs_share, share_type\u003d\u0027cifs\u0027,"},{"line_number":812,"context_line":"                             options\u003dmnt_flags)"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"class LibvirtAOEVolumeDriver(LibvirtBaseVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_de7dbf6e","line":812,"in_reply_to":"5a890539_183affcc","updated":"2014-12-03 15:33:18.000000000","message":"I think that both the connection info and pre-configured mount options must be used.\n\nFor example, you may want to set the libvirt-qemu uid/gid as mount options in your nova.conf (which may not be the same across nodes) while auth credentials may be specified in the volume connection info.","commit_id":"43a7cd10bb642e4b8f3d27be38e70b653de9baa8"}]}
