)]}'
{"nova/exception.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1455dc5e09e8b08910d0dd4ca261c0dbf746bfe9","unresolved":false,"context_lines":[{"line_number":1324,"context_line":"    msg_fmt \u003d _(\"Instance group %(group_uuid)s has no policy %(policy)s.\")"},{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"class DownloadModuleError(NovaException):"},{"line_number":1328,"context_line":"    msg_fmt \u003d _(\"There was an error with the download module %(module)s. \""},{"line_number":1329,"context_line":"                \"%(reason)s\")"},{"line_number":1330,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fu%2Fg%3D","line":1327,"updated":"2013-07-24 08:34:38.000000000","message":"Adding a \u0027Image\u0027 prefix for those 6 classes name? such as \u0027ImageDownloadModuleError\u0027 for this.","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":1324,"context_line":"    msg_fmt \u003d _(\"Instance group %(group_uuid)s has no policy %(policy)s.\")"},{"line_number":1325,"context_line":""},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"class DownloadModuleError(NovaException):"},{"line_number":1328,"context_line":"    msg_fmt \u003d _(\"There was an error with the download module %(module)s. \""},{"line_number":1329,"context_line":"                \"%(reason)s\")"},{"line_number":1330,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FtuU%3D","line":1327,"in_reply_to":"AAAAQn%2F%2Fu%2Fg%3D","updated":"2013-07-24 15:42:03.000000000","message":"Done","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"}],"nova/image/download/__init__.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    ex \u003d stevedore.extension.ExtensionManager(\u0027nova.download.modules\u0027)"},{"line_number":33,"context_line":"    for module_name in ex.names():"},{"line_number":34,"context_line":"        mgr \u003d stevedore.driver.DriverManager("},{"line_number":35,"context_line":"            namespace\u003d\u0027nova.download.modules\u0027,"},{"line_number":36,"context_line":"            name\u003dmodule_name,"},{"line_number":37,"context_line":"            invoke_on_load\u003dFalse)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzEQ%3D","line":35,"updated":"2013-07-23 03:30:29.000000000","message":"\u0027nova.image.download.modules\u0027 will be better.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    ex \u003d stevedore.extension.ExtensionManager(\u0027nova.download.modules\u0027)"},{"line_number":33,"context_line":"    for module_name in ex.names():"},{"line_number":34,"context_line":"        mgr \u003d stevedore.driver.DriverManager("},{"line_number":35,"context_line":"            namespace\u003d\u0027nova.download.modules\u0027,"},{"line_number":36,"context_line":"            name\u003dmodule_name,"},{"line_number":37,"context_line":"            invoke_on_load\u003dFalse)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyr0%3D","line":35,"in_reply_to":"AAAAQn%2F%2FzEQ%3D","updated":"2013-07-23 08:36:16.000000000","message":"Done","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"}],"nova/image/download/file.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"14fc445627e2e9fe6e0f56c90b692939a5f82522","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"file_download_opts \u003d ["},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027file_download_module_config\u0027,"},{"line_number":31,"context_line":"               default\u003dNone,"},{"line_number":32,"context_line":"               help\u003d\u0027A path to the configuration file for the file \u0027"},{"line_number":33,"context_line":"                     \u0027download module.\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2Fzuw%3D","line":30,"updated":"2013-07-22 22:21:54.000000000","message":"I really don\u0027t think we should be adding new config files\n\nCan this not be encoded in nova.conf? e.g. as a MultiStrOpt with id:mountpoint:hardlink\n\nYou could even register a config group per filesystem if you really didn\u0027t want to do that, see e.g. http://lists.openstack.org/pipermail/openstack-dev/2013-June/010463.html","commit_id":"de1a7072a5732c700d34cab8af7ecafa27e3deac"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"670188b70c6b564807406c1507f19aa7e9c1cfc1","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"file_download_opts \u003d ["},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027file_download_module_config\u0027,"},{"line_number":31,"context_line":"               default\u003dNone,"},{"line_number":32,"context_line":"               help\u003d\u0027A path to the configuration file for the file \u0027"},{"line_number":33,"context_line":"                     \u0027download module.\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2FzHA%3D","line":30,"in_reply_to":"AAAAQn%2F%2Fzr4%3D","updated":"2013-07-23 02:06:03.000000000","message":"Mark, I am sending in a patch that works as you requested.","commit_id":"de1a7072a5732c700d34cab8af7ecafa27e3deac"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"afea145c538c6a0c0a7d7e9bd88fddd460294ad2","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"file_download_opts \u003d ["},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027file_download_module_config\u0027,"},{"line_number":31,"context_line":"               default\u003dNone,"},{"line_number":32,"context_line":"               help\u003d\u0027A path to the configuration file for the file \u0027"},{"line_number":33,"context_line":"                     \u0027download module.\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2Fzr4%3D","line":30,"in_reply_to":"AAAAQn%2F%2Fzuw%3D","updated":"2013-07-22 22:32:54.000000000","message":"In the particular case of the included \u0027file\u0027 module, I am agreeable and can see it working either way.  However for future modules I have two concerns.\n\nThe first is that as the configuration gets more complicated (as might be the case for a bittorrent module that would need to have different configuration options per peer) that the additional configuration added to nova.conf will be messy and overly complicated to map to ini style.\n\nThe second is that this patch should support 3rd party downloads that are not part of the Nova proper distribution.  In such cases having the configuration live with module could be more convenient.\n\nThere was a similair discuss on a recent and related patch to Glance: https://review.openstack.org/#/c/36884/ and it was decided that a separate file would be best.","commit_id":"de1a7072a5732c700d34cab8af7ecafa27e3deac"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"40e5f54b41d8f9070dde76c1c35d56e9c34595b9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"opt_group \u003d cfg.ListOpt(name\u003d\u0027filesystems\u0027, default\u003d[])"},{"line_number":31,"context_line":"CONF.register_opt(opt_group, group\u003d\"file_download_module\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyy8%3D","line":30,"updated":"2013-07-23 05:54:52.000000000","message":"That\u0027s a confusing variable name ... it makes it sound like a cfg.OptGroup","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"opt_group \u003d cfg.ListOpt(name\u003d\u0027filesystems\u0027, default\u003d[])"},{"line_number":31,"context_line":"CONF.register_opt(opt_group, group\u003d\"file_download_module\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _get_options():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzDk%3D","line":31,"updated":"2013-07-23 03:30:29.000000000","message":"Change option name to tell user/admin, this is related to \u0027image\u0027 handling?","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"40e5f54b41d8f9070dde76c1c35d56e9c34595b9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"opt_group \u003d cfg.ListOpt(name\u003d\u0027filesystems\u0027, default\u003d[])"},{"line_number":31,"context_line":"CONF.register_opt(opt_group, group\u003d\"file_download_module\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _get_options():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FyzE%3D","line":31,"updated":"2013-07-23 05:54:52.000000000","message":"file_download_module is a bit clunky\n\nHow about\n\n  [images]\n  filesystems \u003d ...\n\n  [images_filesystem:gluster1]\n  id \u003d ...\n  mountpoint \u003d ...\n  hardlink \u003d ...\n\nI could see other stuff moving in under the images section","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"opt_group \u003d cfg.ListOpt(name\u003d\u0027filesystems\u0027, default\u003d[])"},{"line_number":31,"context_line":"CONF.register_opt(opt_group, group\u003d\"file_download_module\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _get_options():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FyX0%3D","line":31,"in_reply_to":"AAAAQn%2F%2FyzE%3D","updated":"2013-07-23 08:36:16.000000000","message":"I worry that \"images\" could imply many things beyond specifically downloading images via file system copies.  I am struggling to find something that captures that specific detail but is not so cumbersome.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    fs_dict \u003d {}"},{"line_number":36,"context_line":"    for fs in CONF.file_download_module.filesystems:"},{"line_number":37,"context_line":"        group_name \u003d \u0027file_download_module:\u0027 + fs"},{"line_number":38,"context_line":"        fs_dict[CONF[group_name].id] \u003d CONF[group_name]"},{"line_number":39,"context_line":"    return fs_dict"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"#  This module extends the configuration options for nova.conf.  If the user"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzAA%3D","line":38,"updated":"2013-07-23 03:30:29.000000000","message":"IMO, Adding a checking to ensure \u0027id\u0027 option is be assigned here.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":42,"context_line":"#  wishes to use the specific configuration settings the following needs to"},{"line_number":43,"context_line":"#  be added to nova.conf:"},{"line_number":44,"context_line":"#  [file_download_module]"},{"line_number":45,"context_line":"#  filesystem \u003d \u003ca list of file systems\u003e"},{"line_number":46,"context_line":"#"},{"line_number":47,"context_line":"#  For each entry in the filesystem list a new configuration section must be"},{"line_number":48,"context_line":"#  added with the following format:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzD4%3D","line":45,"updated":"2013-07-23 03:30:29.000000000","message":"Wrong hints/typing, \u0027filesystem\u0027 \u003d\u003e \u0027filesystems\u0027","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"#  wishes to use the specific configuration settings the following needs to"},{"line_number":43,"context_line":"#  be added to nova.conf:"},{"line_number":44,"context_line":"#  [file_download_module]"},{"line_number":45,"context_line":"#  filesystem \u003d \u003ca list of file systems\u003e"},{"line_number":46,"context_line":"#"},{"line_number":47,"context_line":"#  For each entry in the filesystem list a new configuration section must be"},{"line_number":48,"context_line":"#  added with the following format:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FyrI%3D","line":45,"in_reply_to":"AAAAQn%2F%2FzD4%3D","updated":"2013-07-23 08:36:16.000000000","message":"Done","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"40e5f54b41d8f9070dde76c1c35d56e9c34595b9","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        # create the needed options"},{"line_number":82,"context_line":"        filesystem_opts \u003d ["},{"line_number":83,"context_line":"             cfg.StrOpt(\u0027id\u0027),"},{"line_number":84,"context_line":"             cfg.StrOpt(\u0027mountpoint\u0027),"},{"line_number":85,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyzw%3D","line":82,"updated":"2013-07-23 05:54:52.000000000","message":"I\u0027d put this list at global module scope, also include some help","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        # create the needed options"},{"line_number":82,"context_line":"        filesystem_opts \u003d ["},{"line_number":83,"context_line":"             cfg.StrOpt(\u0027id\u0027),"},{"line_number":84,"context_line":"             cfg.StrOpt(\u0027mountpoint\u0027),"},{"line_number":85,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyq0%3D","line":82,"in_reply_to":"AAAAQn%2F%2Fyzw%3D","updated":"2013-07-23 08:36:16.000000000","message":"Done","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # create the needed options"},{"line_number":82,"context_line":"        filesystem_opts \u003d ["},{"line_number":83,"context_line":"             cfg.StrOpt(\u0027id\u0027),"},{"line_number":84,"context_line":"             cfg.StrOpt(\u0027mountpoint\u0027),"},{"line_number":85,"context_line":"        ]"},{"line_number":86,"context_line":"        for fs in CONF.file_download_module.filesystems:"},{"line_number":87,"context_line":"            group_name \u003d \u0027file_download_module:\u0027 + fs"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzCY%3D","line":84,"updated":"2013-07-23 03:30:29.000000000","message":"Where\u0027s \u0027hardlink\u0027 ?","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # create the needed options"},{"line_number":82,"context_line":"        filesystem_opts \u003d ["},{"line_number":83,"context_line":"             cfg.StrOpt(\u0027id\u0027),"},{"line_number":84,"context_line":"             cfg.StrOpt(\u0027mountpoint\u0027),"},{"line_number":85,"context_line":"        ]"},{"line_number":86,"context_line":"        for fs in CONF.file_download_module.filesystems:"},{"line_number":87,"context_line":"            group_name \u003d \u0027file_download_module:\u0027 + fs"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyqw%3D","line":84,"in_reply_to":"AAAAQn%2F%2FzCY%3D","updated":"2013-07-23 08:36:16.000000000","message":"That is a futuristic feature.  I did not want to confuse this submission with those details.  I will remove it from the documentation.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"40e5f54b41d8f9070dde76c1c35d56e9c34595b9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        for fs_key in self.filesystems:"},{"line_number":92,"context_line":"            for r in self.desc_required_keys:"},{"line_number":93,"context_line":"                fs_ent \u003d self.filesystems[fs_key]"},{"line_number":94,"context_line":"                x \u003d fs_ent.get(r)"},{"line_number":95,"context_line":"                if x is None:"},{"line_number":96,"context_line":"                    msg \u003d _(\u0027The key %s is required in all file system \u0027"},{"line_number":97,"context_line":"                            \u0027descriptions.\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyyw%3D","line":94,"updated":"2013-07-23 05:54:52.000000000","message":"You shouldn\u0027t need to use get() here - if the option is registered, the key will be set and will default to None","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        for fs_key in self.filesystems:"},{"line_number":92,"context_line":"            for r in self.desc_required_keys:"},{"line_number":93,"context_line":"                fs_ent \u003d self.filesystems[fs_key]"},{"line_number":94,"context_line":"                x \u003d fs_ent.get(r)"},{"line_number":95,"context_line":"                if x is None:"},{"line_number":96,"context_line":"                    msg \u003d _(\u0027The key %s is required in all file system \u0027"},{"line_number":97,"context_line":"                            \u0027descriptions.\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyqk%3D","line":94,"in_reply_to":"AAAAQn%2F%2Fyyw%3D","updated":"2013-07-23 08:36:16.000000000","message":"Done","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    raise exception.DownloadModuleConfigurationError("},{"line_number":100,"context_line":"                        module\u003dstr(self), reason\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _check_metadata(self, metadata, url_parts):"},{"line_number":103,"context_line":"        for r in self.desc_required_keys:"},{"line_number":104,"context_line":"            if r not in metadata:"},{"line_number":105,"context_line":"                url \u003d url_parts.geturl()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fy%2Fw%3D","line":102,"updated":"2013-07-23 03:30:29.000000000","message":"this name seems not good enough, like just a \u0027checking\u0027 function, but it return a particular module configuration.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    raise exception.DownloadModuleConfigurationError("},{"line_number":100,"context_line":"                        module\u003dstr(self), reason\u003dmsg)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _check_metadata(self, metadata, url_parts):"},{"line_number":103,"context_line":"        for r in self.desc_required_keys:"},{"line_number":104,"context_line":"            if r not in metadata:"},{"line_number":105,"context_line":"                url \u003d url_parts.geturl()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FyqE%3D","line":102,"in_reply_to":"AAAAQn%2F%2Fy%2Fw%3D","updated":"2013-07-23 08:36:16.000000000","message":"I do not understand the comment.  This function returns a value or raises an error.  I will rename it to reflect that it does not simply check, will that address your concern?","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        source_file \u003d self._normalize_destination(nova_mountpoint,"},{"line_number":141,"context_line":"                                                  glance_mountpoint,"},{"line_number":142,"context_line":"                                                  url_parts.path)"},{"line_number":143,"context_line":"        with open(source_file, \"r\") as f:"},{"line_number":144,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzAY%3D","line":142,"updated":"2013-07-23 03:30:29.000000000","message":"involve \u0027hardlink\u0027 magic here?","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        source_file \u003d self._normalize_destination(nova_mountpoint,"},{"line_number":141,"context_line":"                                                  glance_mountpoint,"},{"line_number":142,"context_line":"                                                  url_parts.path)"},{"line_number":143,"context_line":"        with open(source_file, \"r\") as f:"},{"line_number":144,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyp4%3D","line":142,"in_reply_to":"AAAAQn%2F%2FzAY%3D","updated":"2013-07-23 08:36:16.000000000","message":"That would probably be a good place for such a thing in the future.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"def get_download_hander():"},{"line_number":148,"context_line":"    return FileTransfer()"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzCo%3D","line":147,"updated":"2013-07-23 03:30:29.000000000","message":"do you think pass in \u0027GlanceImageService\u0027 instance (and other worth objects)  within context for this stub will be better? since other sub-class (of TransferBase) probable need that to help initialization IMO.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"def get_download_hander():"},{"line_number":148,"context_line":"    return FileTransfer()"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FypE%3D","line":147,"in_reply_to":"AAAAQn%2F%2FzCo%3D","updated":"2013-07-23 08:36:16.000000000","message":"I do not think I have access to the context at the time of this call but perhaps there are other things that should be considered.  Would a **kwargs work for you?","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"def get_scheme():"},{"line_number":152,"context_line":"    return \u0027file\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzC8%3D","line":152,"updated":"2013-07-23 03:30:29.000000000","message":"IMO, \u0027get_scheme()\u0027 return a \u0027set\u0027/\u0027list\u0027 will be better, since a handler probable can support multiple schemes of image locations, for example for here: \u0027return (\u0027file\u0027, \u0027filesystem\u0027)\u0027. https://github.com/openstack/glance/blob/master/glance/store/filesystem.py#L116","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"def get_scheme():"},{"line_number":152,"context_line":"    return \u0027file\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fypo%3D","line":152,"in_reply_to":"AAAAQn%2F%2FzC8%3D","updated":"2013-07-23 08:36:16.000000000","message":"That sounds wise","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1455dc5e09e8b08910d0dd4ca261c0dbf746bfe9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                        help\u003d_(\u0027A list of filesystems that will be configured \u0027"},{"line_number":32,"context_line":"                               \u0027in this file under the sections \u0027"},{"line_number":33,"context_line":"                               \u0027image_file_url:list entry name\u003e\u0027))"},{"line_number":34,"context_line":"CONF.register_opt(opt_group, group\u003d\"image_file_url\")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"#  This module extends the configuration options for nova.conf.  If the user"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fu5Q%3D","line":34,"updated":"2013-07-24 08:34:38.000000000","message":"do you think name it to \u0027image_file_transfer\u0027 for this group will be better?","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                        help\u003d_(\u0027A list of filesystems that will be configured \u0027"},{"line_number":32,"context_line":"                               \u0027in this file under the sections \u0027"},{"line_number":33,"context_line":"                               \u0027image_file_url:list entry name\u003e\u0027))"},{"line_number":34,"context_line":"CONF.register_opt(opt_group, group\u003d\"image_file_url\")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"#  This module extends the configuration options for nova.conf.  If the user"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Ft4Q%3D","line":34,"in_reply_to":"AAAAQn%2F%2Fu5Q%3D","updated":"2013-07-24 15:42:03.000000000","message":"I think that \"file transfer\" does not imply a file system copy (think of FTP).  file_url at least brings to mind file:///.  In other words, if we were downloading from swift (which I think would be the next likely download module) it would still be a file transfer.","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1455dc5e09e8b08910d0dd4ca261c0dbf746bfe9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        fs_dict \u003d {}"},{"line_number":88,"context_line":"        for fs in CONF.image_file_url.filesystems:"},{"line_number":89,"context_line":"            group_name \u003d \u0027image_file_url:\u0027 + fs"},{"line_number":90,"context_line":"            fs_dict[CONF[group_name].id] \u003d CONF[group_name]"},{"line_number":91,"context_line":"        return fs_dict"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fu4o%3D","line":90,"updated":"2013-07-24 08:34:38.000000000","message":"do we need check \u0027CONF[group_name]\u0027 is not None here before using it? And how about the result here if user not assign \u0027id\u0027 option in nova.conf?","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        fs_dict \u003d {}"},{"line_number":88,"context_line":"        for fs in CONF.image_file_url.filesystems:"},{"line_number":89,"context_line":"            group_name \u003d \u0027image_file_url:\u0027 + fs"},{"line_number":90,"context_line":"            fs_dict[CONF[group_name].id] \u003d CONF[group_name]"},{"line_number":91,"context_line":"        return fs_dict"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2FtvU%3D","line":90,"in_reply_to":"AAAAQn%2F%2Fu4o%3D","updated":"2013-07-24 15:42:03.000000000","message":"Done","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"d7c42134fa1baccc5360bccdbd788037dbef74c2","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                                  glance_mountpoint,"},{"line_number":150,"context_line":"                                                  url_parts.path)"},{"line_number":151,"context_line":"        with open(source_file, \"r\") as f:"},{"line_number":152,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":153,"context_line":"            LOG.info(_(\u0027Copied %(source_file)s using %(module_str)s\u0027) %"},{"line_number":154,"context_line":"                     {\u0027source_file\u0027: source_file, \u0027module_str\u0027: str(self)})"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fus4%3D","line":152,"updated":"2013-07-24 09:32:50.000000000","message":"It would be good to provide a name at this level so virt.libvirt.copy_image() could be used for example to efficiently read and write these very large files","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"82690267449ab1ae97167c1e24c5653c76318f1d","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                                  glance_mountpoint,"},{"line_number":150,"context_line":"                                                  url_parts.path)"},{"line_number":151,"context_line":"        with open(source_file, \"r\") as f:"},{"line_number":152,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":153,"context_line":"            LOG.info(_(\u0027Copied %(source_file)s using %(module_str)s\u0027) %"},{"line_number":154,"context_line":"                     {\u0027source_file\u0027: source_file, \u0027module_str\u0027: str(self)})"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Ftmw%3D","line":152,"in_reply_to":"AAAAQn%2F%2Ftyo%3D","updated":"2013-07-24 16:04:24.000000000","message":"Dependent patch would be even better.\nNow seems like a good time to do it since we\u0027re thinking about these interfaces","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                                  glance_mountpoint,"},{"line_number":150,"context_line":"                                                  url_parts.path)"},{"line_number":151,"context_line":"        with open(source_file, \"r\") as f:"},{"line_number":152,"context_line":"            shutil.copyfileobj(f, destination)"},{"line_number":153,"context_line":"            LOG.info(_(\u0027Copied %(source_file)s using %(module_str)s\u0027) %"},{"line_number":154,"context_line":"                     {\u0027source_file\u0027: source_file, \u0027module_str\u0027: str(self)})"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Ftyo%3D","line":152,"in_reply_to":"AAAAQn%2F%2Fus4%3D","updated":"2013-07-24 15:42:03.000000000","message":"I completely agree wit this, the problem is that it will require a change to the higher level objects, GlanceImageService.download() specifically.  While I agree that this would be an important thing to have (download modules like bittorrent would require it), I am concerned that it will make this too large and complicated of a patch.  How do you feel about having this as a dependent patched?","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1455dc5e09e8b08910d0dd4ca261c0dbf746bfe9","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"def get_schemes():"},{"line_number":162,"context_line":"    return [\u0027file\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fu98%3D","line":162,"updated":"2013-07-24 08:34:38.000000000","message":"using this? \"return (\u0027file\u0027, \u0027filesystem\u0027)\"","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"def get_schemes():"},{"line_number":162,"context_line":"    return [\u0027file\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Ft2Q%3D","line":162,"in_reply_to":"AAAAQn%2F%2Fu98%3D","updated":"2013-07-24 15:42:03.000000000","message":"Done","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"}],"nova/image/glance.py":[{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"5297090c3df4fd515235a068deca936b9dfb1da9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                     \u0027class which implements \u0027"},{"line_number":75,"context_line":"                     \u0027nova.image.xfers.base.TransferBase.  Everything else in \u0027"},{"line_number":76,"context_line":"                     \u0027the file is determined by the module implementation \u0027"},{"line_number":77,"context_line":"                     \u0027itself.\u0027),"},{"line_number":78,"context_line":"    ]"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F3oE%3D","line":77,"updated":"2013-07-20 13:53:54.000000000","message":"You really want to use stevedore and entry points for loading the modules\n\nFor example, in nova/setup.cfg you\u0027d have\n\n  nova.image.download_module \u003d\n      file \u003d nova.image.xfers.file:FileTransfer\n\nAny scheme specific configuration should be handled by having the module register its own config options","commit_id":"767ca884236bcdc43dce1d56d37c20c4f10036a1"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"be0bceeca858fc557adacc331a0f4bfac47a2e65","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                     \u0027class which implements \u0027"},{"line_number":75,"context_line":"                     \u0027nova.image.xfers.base.TransferBase.  Everything else in \u0027"},{"line_number":76,"context_line":"                     \u0027the file is determined by the module implementation \u0027"},{"line_number":77,"context_line":"                     \u0027itself.\u0027),"},{"line_number":78,"context_line":"    ]"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAQn%2F%2F3YA%3D","line":77,"in_reply_to":"AAAAQn%2F%2F3oE%3D","updated":"2013-07-20 19:27:27.000000000","message":"Thanks Mark, will do.","commit_id":"767ca884236bcdc43dce1d56d37c20c4f10036a1"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"98e5c2a780d38063d037643221d95fc66e615182","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        base_image_meta \u003d self._translate_from_glance(image)"},{"line_number":268,"context_line":"        return base_image_meta"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def _get_location(self, context, image_id):"},{"line_number":271,"context_line":"        \"\"\"Returns the direct url representing the backend storage location,"},{"line_number":272,"context_line":"        or None if this attribute is not shown by Glance."},{"line_number":273,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FzDQ%3D","line":270,"updated":"2013-07-23 03:30:29.000000000","message":"change function name to \u0027_get_locations()\u0027 will be better IMO.","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"0d21361334384959e3a3742f4aede0ea9f2ffba0","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        base_image_meta \u003d self._translate_from_glance(image)"},{"line_number":268,"context_line":"        return base_image_meta"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def _get_location(self, context, image_id):"},{"line_number":271,"context_line":"        \"\"\"Returns the direct url representing the backend storage location,"},{"line_number":272,"context_line":"        or None if this attribute is not shown by Glance."},{"line_number":273,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fyr8%3D","line":270,"in_reply_to":"AAAAQn%2F%2FzDQ%3D","updated":"2013-07-23 08:36:16.000000000","message":"Done","commit_id":"f5ad3cd4350a4d6becd2764ca1b7bef4502a577c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1455dc5e09e8b08910d0dd4ca261c0dbf746bfe9","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            if scheme in CONF.allowed_direct_url_schemes:"},{"line_number":218,"context_line":"                mod \u003d _DOWNLOAD_MODULES[scheme]"},{"line_number":219,"context_line":"                try:"},{"line_number":220,"context_line":"                    self._download_handlers[scheme] \u003d mod.get_download_hander()"},{"line_number":221,"context_line":"                except Exception as ex:"},{"line_number":222,"context_line":"                    msg \u003d _(\u0027When loading the module %(module_str)s the \u0027"},{"line_number":223,"context_line":"                            \u0027following error occurred: %(ex)s\u0027)\\"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fu8U%3D","line":220,"updated":"2013-07-24 08:34:38.000000000","message":"I still think maybe we need pass \u0027self\u0027 in \u0027get_download_handler()\u0027, since other xfers maybe need it.","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            if scheme in CONF.allowed_direct_url_schemes:"},{"line_number":218,"context_line":"                mod \u003d _DOWNLOAD_MODULES[scheme]"},{"line_number":219,"context_line":"                try:"},{"line_number":220,"context_line":"                    self._download_handlers[scheme] \u003d mod.get_download_hander()"},{"line_number":221,"context_line":"                except Exception as ex:"},{"line_number":222,"context_line":"                    msg \u003d _(\u0027When loading the module %(module_str)s the \u0027"},{"line_number":223,"context_line":"                            \u0027following error occurred: %(ex)s\u0027)\\"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Ft5I%3D","line":220,"in_reply_to":"AAAAQn%2F%2Fu8U%3D","updated":"2013-07-24 15:42:03.000000000","message":"While I agree that a download module could benefit from more information I am not yet sure what the use case for giving it an image service would be, further I am slightly concerned about how the image service would react to be reentered.  In the absence of a use case I would prefer to hide this object from the download modules.","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1455dc5e09e8b08910d0dd4ca261c0dbf746bfe9","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        locations \u003d getattr(image_meta, \u0027locations\u0027, [])"},{"line_number":284,"context_line":"        du \u003d getattr(image_meta, \u0027direct_url\u0027, None)"},{"line_number":285,"context_line":"        if du:"},{"line_number":286,"context_line":"            locations.append({\u0027url\u0027: du, \u0027metadata\u0027: {}})"},{"line_number":287,"context_line":"        return locations"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def _get_transfer_module(self, scheme):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Fu8E%3D","line":286,"updated":"2013-07-24 08:34:38.000000000","message":"I consider you don\u0027t need this, since in glance-api code, \u0027locations\u0027 field of the response has always including \u0027direct_url\u0027 value.","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"3b0ecad44a17439dd0899ad6443ef60796cdb613","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        locations \u003d getattr(image_meta, \u0027locations\u0027, [])"},{"line_number":284,"context_line":"        du \u003d getattr(image_meta, \u0027direct_url\u0027, None)"},{"line_number":285,"context_line":"        if du:"},{"line_number":286,"context_line":"            locations.append({\u0027url\u0027: du, \u0027metadata\u0027: {}})"},{"line_number":287,"context_line":"        return locations"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def _get_transfer_module(self, scheme):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQn%2F%2Ft6U%3D","line":286,"in_reply_to":"AAAAQn%2F%2Fu8E%3D","updated":"2013-07-24 15:42:03.000000000","message":"That is not always true.  Glance could be configured with show_direct_url \u003d True and show_multiple_locations \u003d False.  Further nova could be speaking to an older version of glance.","commit_id":"8f586f8ad9a6d4b481b7785a47892553803243b5"}]}
