)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Vladyslav Drok \u003cvdrok@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-11-02 17:00:57 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for downloading images via proxy in agent driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently agent only supports downloading images by HTTP(S) link"},{"line_number":10,"context_line":"directly, but there are cases when using a proxy has some advantages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1a26ad4f_dc1f5306","line":7,"updated":"2015-11-02 21:51:42.000000000","message":"This message makes it sound like after this commit there is now support for downloading images using a proxy server. But it seems like this is only a step in the process to do it.\n\nAlso this seems to add image caching and I don\u0027t see any mention of that.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"80fabb10cda6c64355218ede4f3e160dc5480b32","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Vladyslav Drok \u003cvdrok@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-11-02 17:00:57 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for downloading images via proxy in agent driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently agent only supports downloading images by HTTP(S) link"},{"line_number":10,"context_line":"directly, but there are cases when using a proxy has some advantages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"fa80f949_35697a8c","line":7,"in_reply_to":"1a26ad4f_dc1f5306","updated":"2015-11-03 10:15:46.000000000","message":"+1","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Vladyslav Drok \u003cvdrok@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-11-02 17:00:57 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support for downloading images via proxy in agent driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently agent only supports downloading images by HTTP(S) link"},{"line_number":10,"context_line":"directly, but there are cases when using a proxy has some advantages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"fa80f949_abbcf76c","line":7,"in_reply_to":"1a26ad4f_dc1f5306","updated":"2015-11-04 12:54:44.000000000","message":"Well, this change contains everything needed on ironic side. By image caching you mean temp url caching? Will add it.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"}],"ironic/common/glance_service/v2/image_service.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                      \u0027values are \"swift\" and \"radosgw\".\u0027)),"},{"line_number":100,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_cachetime\u0027,"},{"line_number":101,"context_line":"               default\u003d0,"},{"line_number":102,"context_line":"               help\u003d_(\u0027Number of seconds to store temporary URLs in cache.\u0027)),"},{"line_number":103,"context_line":"]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_95ad3386","line":102,"updated":"2015-11-02 21:51:42.000000000","message":"Please add that 0 disables the cache.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                      \u0027values are \"swift\" and \"radosgw\".\u0027)),"},{"line_number":100,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_cachetime\u0027,"},{"line_number":101,"context_line":"               default\u003d0,"},{"line_number":102,"context_line":"               help\u003d_(\u0027Number of seconds to store temporary URLs in cache.\u0027)),"},{"line_number":103,"context_line":"]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_cb94db38","line":102,"in_reply_to":"1a26ad4f_95ad3386","updated":"2015-11-04 12:54:44.000000000","message":"Done","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def decorator(f):"},{"line_number":110,"context_line":"    @functools.wraps(f)"},{"line_number":111,"context_line":"    def wrapper(self, image_info):"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self._validate_temp_url_config()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_359a1f6f","line":110,"updated":"2015-11-02 21:51:42.000000000","message":"Can this be:\n\n @six.wraps","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def decorator(f):"},{"line_number":110,"context_line":"    @functools.wraps(f)"},{"line_number":111,"context_line":"    def wrapper(self, image_info):"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self._validate_temp_url_config()"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_6b992f6e","line":110,"in_reply_to":"1a26ad4f_359a1f6f","updated":"2015-11-04 12:54:44.000000000","message":"Done","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                \u0027cache_expires_at\u0027: int(exp_time_string)"},{"line_number":138,"context_line":"            }"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        return temp_url"},{"line_number":141,"context_line":"    return wrapper"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_55d31b04","line":140,"updated":"2015-11-02 21:51:42.000000000","message":"I wonder if it would be clearer if did something like this?\n\n temp_url \u003d f(self, image_info)\n if cache_enabled:\n\n   if image_id in self._cache\n      ....\n   query \u003d urlparse.urlparse(temp_url).query\n   exp_time_string \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]\n   self._cache[image_id] \u003d { ... }\n\n return temp_url","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                \u0027cache_expires_at\u0027: int(exp_time_string)"},{"line_number":138,"context_line":"            }"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        return temp_url"},{"line_number":141,"context_line":"    return wrapper"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_6b260f6a","line":140,"in_reply_to":"1a26ad4f_55d31b04","updated":"2015-11-04 12:54:44.000000000","message":"Maybe it would be a bit clearer, but getting temp_url requires some computations, so I think it\u0027s better to avoid it if not necessary.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        return self._delete(image_id, method\u003d\u0027delete\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @decorator"},{"line_number":171,"context_line":"    def swift_temp_url(self, image_info):"},{"line_number":172,"context_line":"        \"\"\"Generate a no-auth Swift temporary URL."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function will generate the temporary Swift URL using the image"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_fcda4f4a","line":171,"updated":"2015-11-02 21:51:42.000000000","message":"Is there any usage of this as a decorator?","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        return self._delete(image_id, method\u003d\u0027delete\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @decorator"},{"line_number":171,"context_line":"    def swift_temp_url(self, image_info):"},{"line_number":172,"context_line":"        \"\"\"Generate a no-auth Swift temporary URL."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function will generate the temporary Swift URL using the image"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_ab8f1722","line":171,"in_reply_to":"1a26ad4f_fcda4f4a","updated":"2015-11-04 12:54:44.000000000","message":"It is not used anywhere apart from this function, it just seemed to produce clearer code - decorator does validation and caching, function does the actual work.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"a595271d74e690e029b1d5c3982bc7b7e3ee08f5","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        return self._delete(image_id, method\u003d\u0027delete\u0027)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    @decorator"},{"line_number":171,"context_line":"    def swift_temp_url(self, image_info):"},{"line_number":172,"context_line":"        \"\"\"Generate a no-auth Swift temporary URL."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function will generate the temporary Swift URL using the image"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_287562ca","line":171,"in_reply_to":"fa80f949_ab8f1722","updated":"2015-11-04 15:41:54.000000000","message":"Ah, renaming it made it much clearer!  I was thinking \u0027@decorator\u0027 was a built-in. Whoops.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"b4e1ddbfb28f3685ef45b2c24a58053b0c7c3c88","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_cachetime\u0027,"},{"line_number":101,"context_line":"               default\u003d0,"},{"line_number":102,"context_line":"               help\u003d_(\u0027Number of seconds to store temporary URLs in cache, \u0027"},{"line_number":103,"context_line":"                      \u0027zero disables the cache.\u0027)),"},{"line_number":104,"context_line":"]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_d9810e91","line":103,"updated":"2015-11-17 09:04:09.000000000","message":"It should be numeric \u00270\u0027?","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c951840ad58690821bca71ac210be2d0e75e18aa","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_cachetime\u0027,"},{"line_number":101,"context_line":"               default\u003d0,"},{"line_number":102,"context_line":"               help\u003d_(\u0027Number of seconds to store temporary URLs in cache, \u0027"},{"line_number":103,"context_line":"                      \u0027zero disables the cache.\u0027)),"},{"line_number":104,"context_line":"]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_2b031d0f","line":103,"in_reply_to":"ba8a016a_d9810e91","updated":"2015-11-17 11:23:43.000000000","message":"I thought these are the same :D Will update.","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"b4e1ddbfb28f3685ef45b2c24a58053b0c7c3c88","unresolved":false,"context_lines":[{"line_number":107,"context_line":"CONF.register_opts(glance_opts, group\u003d\u0027glance\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def validate_config_and_cache_temp_url(f):"},{"line_number":111,"context_line":"    @six.wraps(f)"},{"line_number":112,"context_line":"    def wrapper(self, image_info):"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_f41df7bd","line":110,"updated":"2015-11-17 09:04:09.000000000","message":"Better to add docstring","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c951840ad58690821bca71ac210be2d0e75e18aa","unresolved":false,"context_lines":[{"line_number":107,"context_line":"CONF.register_opts(glance_opts, group\u003d\u0027glance\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def validate_config_and_cache_temp_url(f):"},{"line_number":111,"context_line":"    @six.wraps(f)"},{"line_number":112,"context_line":"    def wrapper(self, image_info):"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_97b02645","line":110,"in_reply_to":"ba8a016a_f41df7bd","updated":"2015-11-17 11:23:43.000000000","message":"Done","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"b4e1ddbfb28f3685ef45b2c24a58053b0c7c3c88","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if (\u0027id\u0027 not in image_info or not"},{"line_number":117,"context_line":"                uuidutils.is_uuid_like(image_info[\u0027id\u0027])):"},{"line_number":118,"context_line":"            raise exc.ImageUnacceptable(_("},{"line_number":119,"context_line":"                \u0027The given image info does not have a valid image id: %s\u0027)"},{"line_number":120,"context_line":"                % image_info)"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_34db7f7e","line":118,"updated":"2015-11-17 09:04:09.000000000","message":"Need to add testcase for this exception path.","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c951840ad58690821bca71ac210be2d0e75e18aa","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if (\u0027id\u0027 not in image_info or not"},{"line_number":117,"context_line":"                uuidutils.is_uuid_like(image_info[\u0027id\u0027])):"},{"line_number":118,"context_line":"            raise exc.ImageUnacceptable(_("},{"line_number":119,"context_line":"                \u0027The given image info does not have a valid image id: %s\u0027)"},{"line_number":120,"context_line":"                % image_info)"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_b7abead5","line":118,"in_reply_to":"ba8a016a_34db7f7e","updated":"2015-11-17 11:23:43.000000000","message":"Done","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"b4e1ddbfb28f3685ef45b2c24a58053b0c7c3c88","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def swift_temp_url(self, image_info):"},{"line_number":172,"context_line":"        \"\"\"Generate a no-auth Swift temporary URL."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function will generate the temporary Swift URL using the image"},{"line_number":175,"context_line":"        id from Glance and the config options: \u0027swift_endpoint_url\u0027,"},{"line_number":176,"context_line":"        \u0027swift_api_version\u0027, \u0027swift_account\u0027 and \u0027swift_container\u0027."},{"line_number":177,"context_line":"        The temporary URL will be valid for \u0027swift_temp_url_duration\u0027 seconds."}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_34ccdf88","line":174,"updated":"2015-11-17 09:04:09.000000000","message":"Would it be better to update this docstring as this function will not always \u0027generate\u0027 but can serve cached one as well.","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c951840ad58690821bca71ac210be2d0e75e18aa","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def swift_temp_url(self, image_info):"},{"line_number":172,"context_line":"        \"\"\"Generate a no-auth Swift temporary URL."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        This function will generate the temporary Swift URL using the image"},{"line_number":175,"context_line":"        id from Glance and the config options: \u0027swift_endpoint_url\u0027,"},{"line_number":176,"context_line":"        \u0027swift_api_version\u0027, \u0027swift_account\u0027 and \u0027swift_container\u0027."},{"line_number":177,"context_line":"        The temporary URL will be valid for \u0027swift_temp_url_duration\u0027 seconds."}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_1783d657","line":174,"in_reply_to":"ba8a016a_34ccdf88","updated":"2015-11-17 11:23:43.000000000","message":"Done","commit_id":"01c1dc6badddd6d79f0e31963a09962bc21583a0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"09b594029b584ed4bf576ee268147b2a5f53e0cd","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            if self._cache[image_id][\u0027cache_expires_at\u0027] \u003e int(time.time()):"},{"line_number":137,"context_line":"                return self._cache[image_id][\u0027url\u0027]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        temp_url \u003d f(self, image_info)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if cache_enabled:"},{"line_number":142,"context_line":"            query \u003d urlparse.urlparse(temp_url).query"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_f04ac382","line":139,"updated":"2015-11-17 18:23:03.000000000","message":"Is there any reason to make this a decorator? Seems like it\u0027s very specific to the method you\u0027re wrapping and so I don\u0027t see the point.","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"bcaabea6e39c5d1de48da31eb4533026b40430e9","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            if self._cache[image_id][\u0027cache_expires_at\u0027] \u003e int(time.time()):"},{"line_number":137,"context_line":"                return self._cache[image_id][\u0027url\u0027]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        temp_url \u003d f(self, image_info)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if cache_enabled:"},{"line_number":142,"context_line":"            query \u003d urlparse.urlparse(temp_url).query"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_3f0e618c","line":139,"in_reply_to":"ba8a016a_f04ac382","updated":"2015-11-19 16:30:05.000000000","message":"Done","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"09b594029b584ed4bf576ee268147b2a5f53e0cd","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        url_path \u003d template.format(**url_fragments)"},{"line_number":230,"context_line":"        path \u003d swift_utils.generate_temp_url("},{"line_number":231,"context_line":"            path\u003durl_path,"},{"line_number":232,"context_line":"            seconds\u003d(CONF.glance.swift_temp_url_cachetime or"},{"line_number":233,"context_line":"                     CONF.glance.swift_temp_url_duration),"},{"line_number":234,"context_line":"            key\u003dCONF.glance.swift_temp_url_key,"},{"line_number":235,"context_line":"            method\u003d\u0027GET\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_7026d3cf","line":232,"updated":"2015-11-17 18:23:03.000000000","message":"I know it\u0027s in the spec, but I don\u0027t see a reason for this second config being a duration. Why not just use it for enabled/disabled, and use CONF.glance.swift_temp_url_duration as the cache duration?","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"bcaabea6e39c5d1de48da31eb4533026b40430e9","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        url_path \u003d template.format(**url_fragments)"},{"line_number":230,"context_line":"        path \u003d swift_utils.generate_temp_url("},{"line_number":231,"context_line":"            path\u003durl_path,"},{"line_number":232,"context_line":"            seconds\u003d(CONF.glance.swift_temp_url_cachetime or"},{"line_number":233,"context_line":"                     CONF.glance.swift_temp_url_duration),"},{"line_number":234,"context_line":"            key\u003dCONF.glance.swift_temp_url_key,"},{"line_number":235,"context_line":"            method\u003d\u0027GET\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_df2955e7","line":232,"in_reply_to":"ba8a016a_7026d3cf","updated":"2015-11-19 16:30:05.000000000","message":"Done","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"39b181d7cc41553b257d105ae0c1c5bbb52f10f0","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    return temp_url"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_b4d91359","line":151,"updated":"2015-11-19 18:03:42.000000000","message":"Why cast this to an int?","commit_id":"ed6505a28bb1ee57be6102767d5e0cbde816fe00"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"74c463e189058c99b2a314572455b746b798229c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    return temp_url"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_4af8174a","line":151,"in_reply_to":"ba8a016a_b4d91359","updated":"2015-11-20 12:27:38.000000000","message":"on L137 it is compared to time.time, which is a number, so converting string to number here too.","commit_id":"ed6505a28bb1ee57be6102767d5e0cbde816fe00"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"39b181d7cc41553b257d105ae0c1c5bbb52f10f0","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                \u0027The given image info does not have a valid image id: %s\u0027)"},{"line_number":214,"context_line":"                % image_info)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        image_id \u003d image_info[\u0027id\u0027]"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        url_fragments \u003d {"},{"line_number":219,"context_line":"            \u0027api_version\u0027: CONF.glance.swift_api_version,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_14581f87","line":216,"updated":"2015-11-19 18:03:42.000000000","message":"Why move image_id deserialization out of the dict url_fragments?\n\nThis is inconsistent with how it\u0027s done in the \"container\" value below (L221). There, you use image_info[\u0027id\u0027], but for \"object_id\", you use \"image_id.\"\n\nI think it\u0027d be preferable to either use image_info[\u0027id\u0027] both places in the dict or use this new image_id variable in both places in the dict.","commit_id":"ed6505a28bb1ee57be6102767d5e0cbde816fe00"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"74c463e189058c99b2a314572455b746b798229c","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                \u0027The given image info does not have a valid image id: %s\u0027)"},{"line_number":214,"context_line":"                % image_info)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        image_id \u003d image_info[\u0027id\u0027]"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        url_fragments \u003d {"},{"line_number":219,"context_line":"            \u0027api_version\u0027: CONF.glance.swift_api_version,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_ca7087df","line":216,"in_reply_to":"ba8a016a_14581f87","updated":"2015-11-20 12:27:38.000000000","message":"Yep, will change, thanks.","commit_id":"ed6505a28bb1ee57be6102767d5e0cbde816fe00"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"39b181d7cc41553b257d105ae0c1c5bbb52f10f0","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        return getattr(image_meta, \u0027direct_url\u0027, None)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def remove_temp_url_from_cache(self, image_id):"},{"line_number":326,"context_line":"        self._cache.pop(image_id, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_c5c3c336","line":326,"updated":"2015-11-19 18:03:42.000000000","message":"I think the None is unnecessary here because we aren\u0027t using the return value.","commit_id":"ed6505a28bb1ee57be6102767d5e0cbde816fe00"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"74c463e189058c99b2a314572455b746b798229c","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        return getattr(image_meta, \u0027direct_url\u0027, None)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def remove_temp_url_from_cache(self, image_id):"},{"line_number":326,"context_line":"        self._cache.pop(image_id, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_6a5ddb47","line":326,"in_reply_to":"ba8a016a_c5c3c336","updated":"2015-11-20 12:27:38.000000000","message":"It is pop, not get :) it will throw KeyError without None if image_id is not in dict.","commit_id":"ed6505a28bb1ee57be6102767d5e0cbde816fe00"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"57dad86f92e63f6d46cff59de2fbdc605a991505","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \u003cimage_id\u003e : {"},{"line_number":127,"context_line":"            \u0027url\u0027: \u003ctemp_url\u003e,"},{"line_number":128,"context_line":"            \u0027cache_expires_at\u0027: \u003cexpiration_time\u003e"},{"line_number":129,"context_line":"        }"},{"line_number":130,"context_line":"        }"},{"line_number":131,"context_line":"    :raises: ValueError if seconds is not a positive integer"},{"line_number":132,"context_line":"    :raises: TypeError if seconds is not an integer"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_83721ee2","line":129,"updated":"2015-11-23 13:56:54.000000000","message":"Nit: should indent this block, looks weird with two { lined up","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5fd36726c008a62a6e096d9bc793337114ddf723","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \u003cimage_id\u003e : {"},{"line_number":127,"context_line":"            \u0027url\u0027: \u003ctemp_url\u003e,"},{"line_number":128,"context_line":"            \u0027cache_expires_at\u0027: \u003cexpiration_time\u003e"},{"line_number":129,"context_line":"        }"},{"line_number":130,"context_line":"        }"},{"line_number":131,"context_line":"    :raises: ValueError if seconds is not a positive integer"},{"line_number":132,"context_line":"    :raises: TypeError if seconds is not an integer"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_38f90d81","line":129,"in_reply_to":"ba8a016a_83721ee2","updated":"2015-11-23 17:46:11.000000000","message":"Done","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"ab4ad39bf1af09b9ae8c773d9a80f6ccc665a614","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        query \u003d urlparse.urlparse(temp_url).query"},{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_e4220da3","line":150,"updated":"2015-11-23 15:16:53.000000000","message":"IMO use of dicts for cache elements is overkill here, how about tuple or named tuple?","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5fd36726c008a62a6e096d9bc793337114ddf723","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        query \u003d urlparse.urlparse(temp_url).query"},{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_18ee89b4","line":150,"in_reply_to":"ba8a016a_6b3fc825","updated":"2015-11-23 17:46:11.000000000","message":"Done","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"41dab8e93c27b105489098669cfa132bd5c2baa0","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        query \u003d urlparse.urlparse(temp_url).query"},{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_6b3fc825","line":150,"in_reply_to":"ba8a016a_e4220da3","updated":"2015-11-23 16:06:23.000000000","message":"s/for cache elements/as cache values","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"57dad86f92e63f6d46cff59de2fbdc605a991505","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    return temp_url"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_4e68ddba","line":151,"updated":"2015-11-23 13:56:54.000000000","message":"So, I know I\u0027m the one that asked for this, but just realized a thing. This is called before the node is powered on to boot the agent. So, if it expires in one minute, it will be expired by the time the agent is actually started and ready to download the image. Not sure what the right thing to do here is, a config could work maybe?","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"ab4ad39bf1af09b9ae8c773d9a80f6ccc665a614","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    return temp_url"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_b77bd57a","line":151,"in_reply_to":"ba8a016a_4e68ddba","updated":"2015-11-23 15:16:53.000000000","message":"+1. Maybe configure \"extra\" time for booting? Alike problem is present even w/o caching, \u0027swift_temp_url_duration\u0027 can be configured too low.","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5fd36726c008a62a6e096d9bc793337114ddf723","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":149,"context_line":"        cache[image_id] \u003d {"},{"line_number":150,"context_line":"            \u0027url\u0027: temp_url,"},{"line_number":151,"context_line":"            \u0027cache_expires_at\u0027: int(exp_time_str)"},{"line_number":152,"context_line":"        }"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    return temp_url"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_b82bbdea","line":151,"in_reply_to":"ba8a016a_b77bd57a","updated":"2015-11-23 17:46:11.000000000","message":"Done","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                      \u0027with RADOS gateway, use \"radosgw\".\u0027)),"},{"line_number":100,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":101,"context_line":"                default\u003dFalse,"},{"line_number":102,"context_line":"                help\u003d_(\u0027Whether to cache generated swift temp URLs. Defaults \u0027"},{"line_number":103,"context_line":"                       \u0027to False.\u0027)),"},{"line_number":104,"context_line":"]"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_f16c329e","line":102,"updated":"2015-11-25 07:17:59.000000000","message":"s/generated swift temp URLs. /swift generated temp URLs.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"43f315a5724a448e5b3e53a7f2db0f36b242c598","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                      \u0027with RADOS gateway, use \"radosgw\".\u0027)),"},{"line_number":100,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":101,"context_line":"                default\u003dFalse,"},{"line_number":102,"context_line":"                help\u003d_(\u0027Whether to cache generated swift temp URLs. Defaults \u0027"},{"line_number":103,"context_line":"                       \u0027to False.\u0027)),"},{"line_number":104,"context_line":"]"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_c2a2624b","line":102,"in_reply_to":"9a8ffd7b_f16c329e","updated":"2015-11-25 15:23:33.000000000","message":"I think the current wording is fine. Swift doesn\u0027t generate these, ironic does.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"615e6b81136af19f020cdf8835d4c82e14b4ea28","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"CONF \u003d cfg.CONF"},{"line_number":118,"context_line":"CONF.register_opts(glance_opts, group\u003d\u0027glance\u0027)"},{"line_number":119,"context_line":"CONF.register_opts(agent_opts, group\u003d\u0027agent\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"TempUrlCacheElement \u003d collections.namedtuple(\u0027TempUrlCacheElement\u0027,"},{"line_number":122,"context_line":"                                             [\u0027url\u0027, \u0027cache_expires_at\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_e7457d17","line":119,"updated":"2015-11-24 14:34:38.000000000","message":"Please move new option to agent.py and use import here.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"263aef2e13e2cb36ac6159cfa5eef1527368fe55","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"CONF \u003d cfg.CONF"},{"line_number":118,"context_line":"CONF.register_opts(glance_opts, group\u003d\u0027glance\u0027)"},{"line_number":119,"context_line":"CONF.register_opts(agent_opts, group\u003d\u0027agent\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"TempUrlCacheElement \u003d collections.namedtuple(\u0027TempUrlCacheElement\u0027,"},{"line_number":122,"context_line":"                                             [\u0027url\u0027, \u0027cache_expires_at\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_bddc6247","line":119,"in_reply_to":"9a8ffd7b_c79e3907","updated":"2015-11-24 15:00:05.000000000","message":"Yes, but agent option in image service looks strange. Maybe to find different solution?","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b53e94dff84080432a1480714f3aee75e75f3baa","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"CONF \u003d cfg.CONF"},{"line_number":118,"context_line":"CONF.register_opts(glance_opts, group\u003d\u0027glance\u0027)"},{"line_number":119,"context_line":"CONF.register_opts(agent_opts, group\u003d\u0027agent\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"TempUrlCacheElement \u003d collections.namedtuple(\u0027TempUrlCacheElement\u0027,"},{"line_number":122,"context_line":"                                             [\u0027url\u0027, \u0027cache_expires_at\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_c79e3907","line":119,"in_reply_to":"9a8ffd7b_e7457d17","updated":"2015-11-24 14:40:19.000000000","message":"Yeah, tried that on previous patch set, but it seems to cause circular import, so if swift_temp_url_cache_enabled will be referenced from agent module, this should be this way.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                             [\u0027url\u0027, \u0027cache_expires_at\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def generate_temp_url(path, seconds, key, method, endpoint, image_id, cache):"},{"line_number":126,"context_line":"    \"\"\"Get Swift temporary URL."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    Generates (or returns the cached one if caching is enabled) a"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_31787ac4","line":125,"updated":"2015-11-25 07:17:59.000000000","message":"this can be _generate_temp_url() as its internal to this module.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"938f4321cf792b95bbac525bf971b90b0a62cf1d","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    if CONF.glance.swift_temp_url_cache_enabled and image_id in cache:"},{"line_number":154,"context_line":"        if (cache[image_id].cache_expires_at \u003e"},{"line_number":155,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time):"},{"line_number":156,"context_line":"            return cache[image_id].url"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    path \u003d swift_utils.generate_temp_url("},{"line_number":159,"context_line":"        path\u003dpath, seconds\u003dseconds, key\u003dkey, method\u003dmethod)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba8a016a_dc1b07c9","line":156,"updated":"2015-11-23 23:20:50.000000000","message":"We could do an else here that calls remove_expired_items_from_cache, instead of putting it in node teardown.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"43f315a5724a448e5b3e53a7f2db0f36b242c598","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    if CONF.glance.swift_temp_url_cache_enabled and image_id in cache:"},{"line_number":154,"context_line":"        if (cache[image_id].cache_expires_at \u003e"},{"line_number":155,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time):"},{"line_number":156,"context_line":"            return cache[image_id].url"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    path \u003d swift_utils.generate_temp_url("},{"line_number":159,"context_line":"        path\u003dpath, seconds\u003dseconds, key\u003dkey, method\u003dmethod)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_0d35fbd8","line":156,"in_reply_to":"9a8ffd7b_2294d335","updated":"2015-11-25 15:23:33.000000000","message":"Meh, a deployment already takes at least 5 minutes, usually more. Even at 10000 objects in this cache I don\u0027t think it will significantly slow things down.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a3fb889c46a9c2292590e8350bfd5591de1a9129","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    if CONF.glance.swift_temp_url_cache_enabled and image_id in cache:"},{"line_number":154,"context_line":"        if (cache[image_id].cache_expires_at \u003e"},{"line_number":155,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time):"},{"line_number":156,"context_line":"            return cache[image_id].url"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    path \u003d swift_utils.generate_temp_url("},{"line_number":159,"context_line":"        path\u003dpath, seconds\u003dseconds, key\u003dkey, method\u003dmethod)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_2294d335","line":156,"in_reply_to":"ba8a016a_dc1b07c9","updated":"2015-11-24 15:05:15.000000000","message":"Yes, it seems a valid alternative, although in a scenario when lots of nodes with different images are deployed simultaneously, it may slow down the deployments as dictionary will be big, which may be worse than longer teardown I guess :)","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            raise exc.InvalidParameterValue(_("},{"line_number":287,"context_line":"                \u0027\"swift_temp_url_duration\" must be greater than \u0027"},{"line_number":288,"context_line":"                \u0027\"[agent]agent_startup_time\" option, otherwise agent will not \u0027"},{"line_number":289,"context_line":"                \u0027be able to boot before temp URL expires.\u0027))"},{"line_number":290,"context_line":"        seed_num_chars \u003d CONF.glance.swift_store_multiple_containers_seed"},{"line_number":291,"context_line":"        if (seed_num_chars is None or seed_num_chars \u003c 0"},{"line_number":292,"context_line":"                or seed_num_chars \u003e 32):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_0cbc3d04","line":289,"updated":"2015-11-25 07:17:59.000000000","message":"s/\"otherwise agent will not be able to boot before temp URL expires.\" /\n\"otherwise temp URL may expire before agent boots up.\"","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8ff221928a998dfd6afedabc13be258a1e1bf0ce","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def remove_expired_items_from_cache(self):"},{"line_number":332,"context_line":"        keys_to_remove \u003d ["},{"line_number":333,"context_line":"            k for k, v in self._cache.items()"},{"line_number":334,"context_line":"            if (v.cache_expires_at \u003c"},{"line_number":335,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time)]"},{"line_number":336,"context_line":"        for k in keys_to_remove:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a8ffd7b_6ee79811","line":333,"updated":"2015-11-26 16:55:15.000000000","message":"items() in Python 2 creates new list with full dict content. This is OK for small dicts, but for potentially big is better to use \"for\" loop (dict keys iterator).","commit_id":"6c3e79be87d94150c77bdda5e5f274c36885125a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4dddf5fa888c2c8e706b6abaee63c9e75ad51373","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def remove_expired_items_from_cache(self):"},{"line_number":332,"context_line":"        keys_to_remove \u003d ["},{"line_number":333,"context_line":"            k for k, v in self._cache.items()"},{"line_number":334,"context_line":"            if (v.cache_expires_at \u003c"},{"line_number":335,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time)]"},{"line_number":336,"context_line":"        for k in keys_to_remove:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a8ffd7b_fbd4a320","line":333,"in_reply_to":"9a8ffd7b_6ee79811","updated":"2015-11-26 18:14:01.000000000","message":"Done","commit_id":"6c3e79be87d94150c77bdda5e5f274c36885125a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                      \u0027with RADOS gateway, use \"radosgw\".\u0027)),"},{"line_number":101,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":102,"context_line":"                default\u003dFalse,"},{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated swift temp URLs. Defaults \u0027"},{"line_number":104,"context_line":"                       \u0027to False.\u0027)),"},{"line_number":105,"context_line":"]"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_de366d50","line":103,"updated":"2015-12-02 23:14:39.000000000","message":"The other help strings here use \u0027Swift\u0027 not \u0027swift\u0027, and \u0027temporary\u0027 not \u0027temp\u0027, so I think it would be good for this to be consistent. ie\n\ns/swift temp/Swift temporary/","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                      \u0027with RADOS gateway, use \"radosgw\".\u0027)),"},{"line_number":101,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":102,"context_line":"                default\u003dFalse,"},{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated swift temp URLs. Defaults \u0027"},{"line_number":104,"context_line":"                       \u0027to False.\u0027)),"},{"line_number":105,"context_line":"]"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_f7a33841","line":103,"in_reply_to":"9a8ffd7b_de366d50","updated":"2015-12-03 10:38:18.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"59152c705d2df63d4bf630be157af5606c655c8c","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        \"\"\""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":170,"context_line":"            self.remove_expired_items_from_cache()"},{"line_number":171,"context_line":"            if image_id in self._cache:"},{"line_number":172,"context_line":"                return self._cache[image_id].url"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_94684b89","line":170,"updated":"2015-11-30 22:12:38.000000000","message":"Hey Mario, it is being cleared here now, instead of checking expiration time on L171","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"c9d103f5f8fa0f3659046ba6dd84eb9c030ab373","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        \"\"\""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":170,"context_line":"            self.remove_expired_items_from_cache()"},{"line_number":171,"context_line":"            if image_id in self._cache:"},{"line_number":172,"context_line":"                return self._cache[image_id].url"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_744847cd","line":170,"in_reply_to":"9a8ffd7b_94684b89","updated":"2015-11-30 22:25:06.000000000","message":"Missed that. Thanks!","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":170,"context_line":"            self.remove_expired_items_from_cache()"},{"line_number":171,"context_line":"            if image_id in self._cache:"},{"line_number":172,"context_line":"                return self._cache[image_id].url"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        path \u003d swift_utils.generate_temp_url("},{"line_number":175,"context_line":"            path\u003dpath, seconds\u003dseconds, key\u003dkey, method\u003dmethod)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_4a0077ab","line":172,"updated":"2015-12-02 23:14:39.000000000","message":"Just wondering if there might be a race condition here. You check that image_id is in self._cache, but before this call is made, what if something else called .remove_expired_items_from_cache() and it is now no longer there. Would it be safer to get the item, eg cache_element \u003d self._cache.get(image_id, None) etc?","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":170,"context_line":"            self.remove_expired_items_from_cache()"},{"line_number":171,"context_line":"            if image_id in self._cache:"},{"line_number":172,"context_line":"                return self._cache[image_id].url"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        path \u003d swift_utils.generate_temp_url("},{"line_number":175,"context_line":"            path\u003dpath, seconds\u003dseconds, key\u003dkey, method\u003dmethod)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_5739e4f0","line":172,"in_reply_to":"9a8ffd7b_4a0077ab","updated":"2015-12-03 10:38:18.000000000","message":"I think there can not be a race here. This piece of code does not do any io, and does not request to switch greenthread to another one, so it will not be interrupted by some other greenthread.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":181,"context_line":"            query \u003d urlparse.urlparse(temp_url).query"},{"line_number":182,"context_line":"            exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":183,"context_line":"            self._cache[image_id] \u003d TempUrlCacheElement("},{"line_number":184,"context_line":"                url\u003dtemp_url, cache_expires_at\u003dint(exp_time_str)"},{"line_number":185,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_4a4637c1","line":182,"updated":"2015-12-02 23:14:39.000000000","message":"I wonder if we should be cautious and check in case an exception is raised here. (I don\u0027t trust other packages.)","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":181,"context_line":"            query \u003d urlparse.urlparse(temp_url).query"},{"line_number":182,"context_line":"            exp_time_str \u003d dict(urlparse.parse_qsl(query))[\u0027temp_url_expires\u0027]"},{"line_number":183,"context_line":"            self._cache[image_id] \u003d TempUrlCacheElement("},{"line_number":184,"context_line":"                url\u003dtemp_url, cache_expires_at\u003dint(exp_time_str)"},{"line_number":185,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_fa89dd6f","line":182,"in_reply_to":"9a8ffd7b_4a4637c1","updated":"2015-12-03 10:38:18.000000000","message":"urlparse.parse_qsl has a strict_parsing argument, by default it is false, which means it ignores all the errors, and generate_temp_url explicitly adds temp_url_expires to the query in the correct format, so idk, it seems that it should be all good here.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                \u0027You must provide \"swift_account\" as a config option.\u0027))"},{"line_number":273,"context_line":"        if CONF.glance.swift_temp_url_duration \u003c CONF.agent.agent_startup_time:"},{"line_number":274,"context_line":"            raise exc.InvalidParameterValue(_("},{"line_number":275,"context_line":"                \u0027\"swift_temp_url_duration\" must be greater than \u0027"},{"line_number":276,"context_line":"                \u0027\"[agent]agent_startup_time\" option, otherwise temp URL may \u0027"},{"line_number":277,"context_line":"                \u0027expire before agent boots up.\u0027))"},{"line_number":278,"context_line":"        seed_num_chars \u003d CONF.glance.swift_store_multiple_containers_seed"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_e4ff2464","line":275,"updated":"2015-12-02 23:14:39.000000000","message":"\u0027or equal to\u0027. Doesn\u0027t seem worth mentioning but if we don\u0027t mention it someone one day will complain ...","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                \u0027You must provide \"swift_account\" as a config option.\u0027))"},{"line_number":273,"context_line":"        if CONF.glance.swift_temp_url_duration \u003c CONF.agent.agent_startup_time:"},{"line_number":274,"context_line":"            raise exc.InvalidParameterValue(_("},{"line_number":275,"context_line":"                \u0027\"swift_temp_url_duration\" must be greater than \u0027"},{"line_number":276,"context_line":"                \u0027\"[agent]agent_startup_time\" option, otherwise temp URL may \u0027"},{"line_number":277,"context_line":"                \u0027expire before agent boots up.\u0027))"},{"line_number":278,"context_line":"        seed_num_chars \u003d CONF.glance.swift_store_multiple_containers_seed"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_9ad5311d","line":275,"in_reply_to":"9a8ffd7b_e4ff2464","updated":"2015-12-03 10:38:18.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            raise exc.InvalidParameterValue(_("},{"line_number":275,"context_line":"                \u0027\"swift_temp_url_duration\" must be greater than \u0027"},{"line_number":276,"context_line":"                \u0027\"[agent]agent_startup_time\" option, otherwise temp URL may \u0027"},{"line_number":277,"context_line":"                \u0027expire before agent boots up.\u0027))"},{"line_number":278,"context_line":"        seed_num_chars \u003d CONF.glance.swift_store_multiple_containers_seed"},{"line_number":279,"context_line":"        if (seed_num_chars is None or seed_num_chars \u003c 0"},{"line_number":280,"context_line":"                or seed_num_chars \u003e 32):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_04c82821","line":277,"updated":"2015-12-02 23:14:39.000000000","message":"If anyone had configured swift_temp_url_duration to be \u003c 300, this will fail, whereas it might have worked before, right? Seems like the default for agent_startup_time should be 0, not 300.\n\nWe should mention it in the release notes, especially if we leave the default as 300.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            raise exc.InvalidParameterValue(_("},{"line_number":275,"context_line":"                \u0027\"swift_temp_url_duration\" must be greater than \u0027"},{"line_number":276,"context_line":"                \u0027\"[agent]agent_startup_time\" option, otherwise temp URL may \u0027"},{"line_number":277,"context_line":"                \u0027expire before agent boots up.\u0027))"},{"line_number":278,"context_line":"        seed_num_chars \u003d CONF.glance.swift_store_multiple_containers_seed"},{"line_number":279,"context_line":"        if (seed_num_chars is None or seed_num_chars \u003c 0"},{"line_number":280,"context_line":"                or seed_num_chars \u003e 32):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_ddabb373","line":277,"in_reply_to":"9a8ffd7b_04c82821","updated":"2015-12-03 10:38:18.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"eb4c1574fad9bd70fe0f052d7606be7e8447f4d9","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        return getattr(image_meta, \u0027direct_url\u0027, None)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def remove_expired_items_from_cache(self):"},{"line_number":333,"context_line":"        keys_to_remove \u003d ["},{"line_number":334,"context_line":"            k for k, v in six.iteritems(self._cache)"},{"line_number":335,"context_line":"            if (v.cache_expires_at \u003c"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_ab2f0ef5","line":332,"updated":"2015-12-03 11:27:18.000000000","message":"docstring and potentially this should be a private method (name prefixed with \u0027_\u0027 )","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f8f1fa1fc8af2fb855c873457a4c70920c52f4d1","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        return getattr(image_meta, \u0027direct_url\u0027, None)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def remove_expired_items_from_cache(self):"},{"line_number":333,"context_line":"        keys_to_remove \u003d ["},{"line_number":334,"context_line":"            k for k, v in six.iteritems(self._cache)"},{"line_number":335,"context_line":"            if (v.cache_expires_at \u003c"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_40cd9764","line":332,"in_reply_to":"9a8ffd7b_ab2f0ef5","updated":"2015-12-03 11:35:06.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        keys_to_remove \u003d ["},{"line_number":334,"context_line":"            k for k, v in six.iteritems(self._cache)"},{"line_number":335,"context_line":"            if (v.cache_expires_at \u003c"},{"line_number":336,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time)]"},{"line_number":337,"context_line":"        for k in keys_to_remove:"},{"line_number":338,"context_line":"            del self._cache[k]"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_4f4649c1","line":336,"updated":"2015-12-02 23:14:39.000000000","message":"This could be calculated once. Not sure it is worth it or not.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        keys_to_remove \u003d ["},{"line_number":334,"context_line":"            k for k, v in six.iteritems(self._cache)"},{"line_number":335,"context_line":"            if (v.cache_expires_at \u003c"},{"line_number":336,"context_line":"                int(time.time()) + CONF.agent.agent_startup_time)]"},{"line_number":337,"context_line":"        for k in keys_to_remove:"},{"line_number":338,"context_line":"            del self._cache[k]"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_dda89322","line":336,"in_reply_to":"9a8ffd7b_4f4649c1","updated":"2015-12-03 10:38:18.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"61ece75cac4049295632fe99a52e6a0efce0699e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                default\u003dFalse,"},{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated Swift temporary URLs. \u0027"},{"line_number":104,"context_line":"                       \u0027Defaults to False.\u0027)),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_expected_download_start_delay\u0027,"},{"line_number":106,"context_line":"               default\u003d0, min\u003d0,"},{"line_number":107,"context_line":"               help\u003d_(\u0027Usually, some amount of time passes before the \u0027"},{"line_number":108,"context_line":"                      \u0027generated temporary URL is actually used for image \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"9a8ffd7b_6c652d1c","line":105,"updated":"2015-12-03 14:01:18.000000000","message":"Please don\u0027t beat me for this :)","commit_id":"e9e6dc0609d778e319173095f6844960b95f51b6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                      \u0027with RADOS gateway, use \"radosgw\".\u0027)),"},{"line_number":101,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":102,"context_line":"                default\u003dFalse,"},{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated Swift temporary URLs. \u0027"},{"line_number":104,"context_line":"                       \u0027Defaults to False.\u0027)),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_expected_download_start_delay\u0027,"},{"line_number":106,"context_line":"               default\u003d0, min\u003d0,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_b8e53da9","line":103,"updated":"2015-12-04 02:51:20.000000000","message":"It might be good to mention \u0027This is useful when using an image caching proxy\u0027 (or something like that, \u0027This is *only* useful...\u0027 is more accurate but ... Or \u0027This should be enabled when using an image caching proxy\u0027... ?)","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                      \u0027with RADOS gateway, use \"radosgw\".\u0027)),"},{"line_number":101,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":102,"context_line":"                default\u003dFalse,"},{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated Swift temporary URLs. \u0027"},{"line_number":104,"context_line":"                       \u0027Defaults to False.\u0027)),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_expected_download_start_delay\u0027,"},{"line_number":106,"context_line":"               default\u003d0, min\u003d0,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_9d129ab3","line":103,"in_reply_to":"7a740942_b8e53da9","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":106,"context_line":"               default\u003d0, min\u003d0,"},{"line_number":107,"context_line":"               help\u003d_(\u0027Usually, some amount of time passes before the \u0027"},{"line_number":108,"context_line":"                      \u0027generated temporary URL is actually used for image \u0027"},{"line_number":109,"context_line":"                      \u0027download. This value (amount of time in seconds) is \u0027"},{"line_number":110,"context_line":"                      \u0027used to check if the Swift temporary URL duration is \u0027"},{"line_number":111,"context_line":"                      \u0027big enough to let the image download to start, and, if \u0027"},{"line_number":112,"context_line":"                      \u0027temporary URL caching is enabled, to determine if a \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_f8b0a58d","line":109,"updated":"2015-12-04 02:51:20.000000000","message":"It would help to know when the clock starts ticking. Is it from the time a \u0027deploy\u0027 request is initiated to after the agent ramdisk is heartbeating? (word it in such a way that the Operator can figure out what value to use here.)","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":106,"context_line":"               default\u003d0, min\u003d0,"},{"line_number":107,"context_line":"               help\u003d_(\u0027Usually, some amount of time passes before the \u0027"},{"line_number":108,"context_line":"                      \u0027generated temporary URL is actually used for image \u0027"},{"line_number":109,"context_line":"                      \u0027download. This value (amount of time in seconds) is \u0027"},{"line_number":110,"context_line":"                      \u0027used to check if the Swift temporary URL duration is \u0027"},{"line_number":111,"context_line":"                      \u0027big enough to let the image download to start, and, if \u0027"},{"line_number":112,"context_line":"                      \u0027temporary URL caching is enabled, to determine if a \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_20733982","line":109,"in_reply_to":"7a740942_f8b0a58d","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                      \u0027generated temporary URL is actually used for image \u0027"},{"line_number":109,"context_line":"                      \u0027download. This value (amount of time in seconds) is \u0027"},{"line_number":110,"context_line":"                      \u0027used to check if the Swift temporary URL duration is \u0027"},{"line_number":111,"context_line":"                      \u0027big enough to let the image download to start, and, if \u0027"},{"line_number":112,"context_line":"                      \u0027temporary URL caching is enabled, to determine if a \u0027"},{"line_number":113,"context_line":"                      \u0027cached entry will be still valid when download starts. \u0027"},{"line_number":114,"context_line":"                      \u0027Defaults to 0.\u0027)),"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_9b307b58","line":111,"updated":"2015-12-04 02:51:20.000000000","message":"It might be clearer with something like \u0027The duration of the swift temporary URL (configured via swift_temp_url_duration) needs to be long enough so that it is valid when the image download starts.\n\nOk, now that I wrote the above, here\u0027s a dumb question. Why not just ask folks to bump up swift_temp_url_duration by this amount. In fact, even without this patch/this caching stuff, wouldn\u0027t you need the swift temp url to be valid for this amount of time anyway?\n\nOh. You need this value cuz you want to know when might be a good time to remove the urls from the cache.\n\nI looked at the code, and we\u0027re generating this temp url in the prepare() part of the deploy process. Why don\u0027t we generate this temp url just before we need to use it, like in the agent\u0027s continue_deploy()? Wouldn\u0027t that make more sense? The delay between the conductor getting the info to the agent ramdisk and it being used should be really short then; I don\u0027t know that we\u0027d need a config for that.\n\nHaving said that, I see that ilo prepares a floppy image with a swift url and I\u0027m way too tired to think about what all this means for that case.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                      \u0027generated temporary URL is actually used for image \u0027"},{"line_number":109,"context_line":"                      \u0027download. This value (amount of time in seconds) is \u0027"},{"line_number":110,"context_line":"                      \u0027used to check if the Swift temporary URL duration is \u0027"},{"line_number":111,"context_line":"                      \u0027big enough to let the image download to start, and, if \u0027"},{"line_number":112,"context_line":"                      \u0027temporary URL caching is enabled, to determine if a \u0027"},{"line_number":113,"context_line":"                      \u0027cached entry will be still valid when download starts. \u0027"},{"line_number":114,"context_line":"                      \u0027Defaults to 0.\u0027)),"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_ca1db674","line":111,"in_reply_to":"7a740942_9b307b58","updated":"2015-12-04 14:07:22.000000000","message":"ilo_deploy_iso can be a glance image too, and temp url for it needs to be generated on prepare phase. I\u0027m not sure how much does it take for virtual media to start deploy iso download after powering on. So it seems that as of now this option is needed.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                      \u0027big enough to let the image download to start, and, if \u0027"},{"line_number":112,"context_line":"                      \u0027temporary URL caching is enabled, to determine if a \u0027"},{"line_number":113,"context_line":"                      \u0027cached entry will be still valid when download starts. \u0027"},{"line_number":114,"context_line":"                      \u0027Defaults to 0.\u0027)),"},{"line_number":115,"context_line":"]"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_182331bf","line":114,"updated":"2015-12-04 02:51:20.000000000","message":"We should mention that this value must be less than the value for swift_temp_url_duration.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                      \u0027big enough to let the image download to start, and, if \u0027"},{"line_number":112,"context_line":"                      \u0027temporary URL caching is enabled, to determine if a \u0027"},{"line_number":113,"context_line":"                      \u0027cached entry will be still valid when download starts. \u0027"},{"line_number":114,"context_line":"                      \u0027Defaults to 0.\u0027)),"},{"line_number":115,"context_line":"]"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_3d3da62b","line":114,"in_reply_to":"7a740942_182331bf","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":352,"context_line":"            CONF.glance.swift_temp_url_expected_download_start_delay)"},{"line_number":353,"context_line":"        keys_to_remove \u003d ["},{"line_number":354,"context_line":"            k for k, v in six.iteritems(self._cache)"},{"line_number":355,"context_line":"            if (v.cache_expires_at \u003c max_valid_time)]"},{"line_number":356,"context_line":"        for k in keys_to_remove:"},{"line_number":357,"context_line":"            del self._cache[k]"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_fbcadf4e","line":355,"updated":"2015-12-04 02:51:20.000000000","message":"I don\u0027t know why, but I\u0027m looking at this now and thinking that it would be more descriptive if it was v.url_expires_at or v.expires_at. The \u0027cache\u0027 part doesn\u0027t help. If I read/think of it as url_expires_at \u003c X, then yeah, it seems clearer that we want a new url!\n\n(But then, I\u0027m tired and want to get this reviewed before I leave.)","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":352,"context_line":"            CONF.glance.swift_temp_url_expected_download_start_delay)"},{"line_number":353,"context_line":"        keys_to_remove \u003d ["},{"line_number":354,"context_line":"            k for k, v in six.iteritems(self._cache)"},{"line_number":355,"context_line":"            if (v.cache_expires_at \u003c max_valid_time)]"},{"line_number":356,"context_line":"        for k in keys_to_remove:"},{"line_number":357,"context_line":"            del self._cache[k]"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_5d351244","line":355,"in_reply_to":"7a740942_fbcadf4e","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"96b2d16c7d9162e8cd2a4355a6557bb9e4b8d03f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    cfg.BoolOpt(\u0027swift_temp_url_cache_enabled\u0027,"},{"line_number":102,"context_line":"                default\u003dFalse,"},{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated Swift temporary URLs. \u0027"},{"line_number":104,"context_line":"                       \u0027Setting it to true is only useful when image caching \u0027"},{"line_number":105,"context_line":"                       \u0027proxy is used. Defaults to False.\u0027)),"},{"line_number":106,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_expected_download_start_delay\u0027,"},{"line_number":107,"context_line":"               default\u003d0, min\u003d0,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a740942_bc40a6a6","line":104,"updated":"2015-12-04 19:39:58.000000000","message":"s/when image/when an image/","commit_id":"8abe1cba751cf9f1ac705a269c17ddec1cd44b47"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"021a76b5350f1c039b68f8b4e69d59f9dfce7186","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                help\u003d_(\u0027Whether to cache generated Swift temporary URLs. \u0027"},{"line_number":104,"context_line":"                       \u0027Setting it to true is only useful when image caching \u0027"},{"line_number":105,"context_line":"                       \u0027proxy is used. Defaults to False.\u0027)),"},{"line_number":106,"context_line":"    cfg.IntOpt(\u0027swift_temp_url_expected_download_start_delay\u0027,"},{"line_number":107,"context_line":"               default\u003d0, min\u003d0,"},{"line_number":108,"context_line":"               help\u003d_(\u0027Usually, there is some amount of time between deploy \u0027"},{"line_number":109,"context_line":"                      \u0027request (which is roughly the time when temporary URL \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a740942_db3b3fea","line":106,"updated":"2015-12-04 17:12:35.000000000","message":"that\u0027s a very explicit name, I like it :-)","commit_id":"8abe1cba751cf9f1ac705a269c17ddec1cd44b47"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"96b2d16c7d9162e8cd2a4355a6557bb9e4b8d03f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                      \u0027determine if a cached entry will be still valid when \u0027"},{"line_number":116,"context_line":"                      \u0027download starts. If set, it should be ensured that \u0027"},{"line_number":117,"context_line":"                      \u0027swift_temp_url_duration is bigger than this value. \u0027"},{"line_number":118,"context_line":"                      \u0027Defaults to 0.\u0027)),"},{"line_number":119,"context_line":"]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a740942_9cffeaa9","line":118,"updated":"2015-12-04 19:39:58.000000000","message":"Usually there is some amount of time between the deploy request (which is approximately the time when the temporary URL is generated) and the actual usage of the temporary URL for the image download. This value (amount of time in seconds) is used to check if the Swift temporary URL duration is large enough to let the image download begin. Also if temporary URL caching is enabled this will determine if a cached entry will still be valid when the download starts. If the swift_temp_url_duration value is set it must be greater than or equal to this value. Defaults to 0.","commit_id":"8abe1cba751cf9f1ac705a269c17ddec1cd44b47"}],"ironic/common/utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    Check if no_proxy value that will be written to environment variable by"},{"line_number":238,"context_line":"    ironic-python-agent is valid."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    :param no_proxy: the value that requires validity check."},{"line_number":241,"context_line":"    :returns: True if no_proxy is valid, False otherwise."},{"line_number":242,"context_line":"    \"\"\""},{"line_number":243,"context_line":"    if not isinstance(no_proxy, six.string_types):"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_83581b58","line":240,"updated":"2015-12-04 02:51:20.000000000","message":"expected to be a comma-separated list of hostnames, right?","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    Check if no_proxy value that will be written to environment variable by"},{"line_number":238,"context_line":"    ironic-python-agent is valid."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    :param no_proxy: the value that requires validity check."},{"line_number":241,"context_line":"    :returns: True if no_proxy is valid, False otherwise."},{"line_number":242,"context_line":"    \"\"\""},{"line_number":243,"context_line":"    if not isinstance(no_proxy, six.string_types):"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_20e819e2","line":240,"in_reply_to":"7a740942_83581b58","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"96b2d16c7d9162e8cd2a4355a6557bb9e4b8d03f","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        return False"},{"line_number":246,"context_line":"    for hostname in no_proxy.split(\u0027,\u0027):"},{"line_number":247,"context_line":"        hostname \u003d hostname.strip()"},{"line_number":248,"context_line":"        if len(hostname) \u003d\u003d 0:"},{"line_number":249,"context_line":"            continue"},{"line_number":250,"context_line":"        max_length \u003d 253"},{"line_number":251,"context_line":"        if hostname[0] \u003d\u003d \".\":"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a740942_c1b02946","line":248,"updated":"2015-12-04 19:39:58.000000000","message":"nit:\n if not hostname:","commit_id":"8abe1cba751cf9f1ac705a269c17ddec1cd44b47"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"96b2d16c7d9162e8cd2a4355a6557bb9e4b8d03f","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        if len(hostname) \u003d\u003d 0:"},{"line_number":249,"context_line":"            continue"},{"line_number":250,"context_line":"        max_length \u003d 253"},{"line_number":251,"context_line":"        if hostname[0] \u003d\u003d \".\":"},{"line_number":252,"context_line":"            # It is allowed to specify a dot in the beginning of the value to"},{"line_number":253,"context_line":"            # indicate that it is a domain name, which means there will be at"},{"line_number":254,"context_line":"            # least one additional character in full hostname. *. is also"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a740942_414e7970","line":251,"updated":"2015-12-04 19:39:58.000000000","message":"nit:\n If hostname.startswith(\u0027.\u0027):","commit_id":"8abe1cba751cf9f1ac705a269c17ddec1cd44b47"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"c3027281e8e8d5737592f46599ef61fdfa96814a","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        return False"},{"line_number":246,"context_line":"    for hostname in no_proxy.split(\u0027,\u0027):"},{"line_number":247,"context_line":"        hostname \u003d hostname.strip()"},{"line_number":248,"context_line":"        if not hostname:"},{"line_number":249,"context_line":"            continue"},{"line_number":250,"context_line":"        max_length \u003d 253"},{"line_number":251,"context_line":"        if hostname.startswith(\u0027.\u0027):"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a740942_c3b5ad31","line":248,"updated":"2015-12-10 04:05:21.000000000","message":"This method would return True when there is a trailing \u0027,\u0027 in no_proxy.It may be valid... but better to confirm.","commit_id":"ff84d86c104264fa06ad558a00955cb96836542d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"af2788d84a06a72964f1a480deb3f3b36d8e5db4","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        return False"},{"line_number":246,"context_line":"    for hostname in no_proxy.split(\u0027,\u0027):"},{"line_number":247,"context_line":"        hostname \u003d hostname.strip()"},{"line_number":248,"context_line":"        if not hostname:"},{"line_number":249,"context_line":"            continue"},{"line_number":250,"context_line":"        max_length \u003d 253"},{"line_number":251,"context_line":"        if hostname.startswith(\u0027.\u0027):"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a740942_446fe4c3","line":248,"in_reply_to":"7a740942_c3b5ad31","updated":"2015-12-14 09:40:40.000000000","message":"Yep, it works fine with trailing comma, or with double commas","commit_id":"ff84d86c104264fa06ad558a00955cb96836542d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a4a9f0d3bc4b8d88f464aa664ab8878a9e22571d","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        if len(hostname) \u003e max_length:"},{"line_number":261,"context_line":"            return False"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        hostname_re \u003d re.compile(\u0027(?!-)[A-Z\\d-]{1,63}(?\u003c!-)$\u0027, re.IGNORECASE)"},{"line_number":264,"context_line":"        if not all(hostname_re.match(part) for part in hostname.split(\u0027.\u0027)):"},{"line_number":265,"context_line":"            return False"},{"line_number":266,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a740942_830bfe7c","line":263,"updated":"2015-12-10 16:27:10.000000000","message":"Please move regex compilation outside the loop.","commit_id":"ff84d86c104264fa06ad558a00955cb96836542d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"af2788d84a06a72964f1a480deb3f3b36d8e5db4","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        if len(hostname) \u003e max_length:"},{"line_number":261,"context_line":"            return False"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        hostname_re \u003d re.compile(\u0027(?!-)[A-Z\\d-]{1,63}(?\u003c!-)$\u0027, re.IGNORECASE)"},{"line_number":264,"context_line":"        if not all(hostname_re.match(part) for part in hostname.split(\u0027.\u0027)):"},{"line_number":265,"context_line":"            return False"},{"line_number":266,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a740942_e2c123e5","line":263,"in_reply_to":"7a740942_830bfe7c","updated":"2015-12-14 09:40:40.000000000","message":"Done","commit_id":"ff84d86c104264fa06ad558a00955cb96836542d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a4a9f0d3bc4b8d88f464aa664ab8878a9e22571d","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            return False"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        hostname_re \u003d re.compile(\u0027(?!-)[A-Z\\d-]{1,63}(?\u003c!-)$\u0027, re.IGNORECASE)"},{"line_number":264,"context_line":"        if not all(hostname_re.match(part) for part in hostname.split(\u0027.\u0027)):"},{"line_number":265,"context_line":"            return False"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a740942_e3be8263","line":264,"updated":"2015-12-10 16:27:10.000000000","message":"Requests lib https://github.com/kennethreitz/requests/blob/6d0017ee6a242433b2a05e78ae57ae0b84ad4b13/requests/utils.py#L509 also works with :port syntax for no_proxy, but current code invalidates it.","commit_id":"ff84d86c104264fa06ad558a00955cb96836542d"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"af2788d84a06a72964f1a480deb3f3b36d8e5db4","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            return False"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        hostname_re \u003d re.compile(\u0027(?!-)[A-Z\\d-]{1,63}(?\u003c!-)$\u0027, re.IGNORECASE)"},{"line_number":264,"context_line":"        if not all(hostname_re.match(part) for part in hostname.split(\u0027.\u0027)):"},{"line_number":265,"context_line":"            return False"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a740942_248098f6","line":264,"in_reply_to":"7a740942_e3be8263","updated":"2015-12-14 09:40:40.000000000","message":"Thanks for noticing, done (but the port value seems to be just ignored...).","commit_id":"ff84d86c104264fa06ad558a00955cb96836542d"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"OPTIONAL_PROPERTIES \u003d {"},{"line_number":94,"context_line":"    \u0027image_http_proxy\u0027: _(\u0027URL of a proxy for http:// addresses. Optional.\u0027),"},{"line_number":95,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy for https:// addresses. Optional.\u0027),"},{"line_number":96,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":97,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_9cfebbac","line":94,"updated":"2015-11-02 21:51:42.000000000","message":"s/proxy for/proxy server for/","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"OPTIONAL_PROPERTIES \u003d {"},{"line_number":94,"context_line":"    \u0027image_http_proxy\u0027: _(\u0027URL of a proxy for http:// addresses. Optional.\u0027),"},{"line_number":95,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy for https:// addresses. Optional.\u0027),"},{"line_number":96,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":97,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_6bfe0f6d","line":94,"in_reply_to":"1a26ad4f_9cfebbac","updated":"2015-11-04 12:54:44.000000000","message":"Done","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":274,"context_line":"                task.driver.boot.prepare_ramdisk(task, deploy_opts)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    @base.driver_periodic_task("},{"line_number":277,"context_line":"        run_immediately\u003dFalse, spacing\u003dCONF.glance.swift_temp_url_cachetime,"},{"line_number":278,"context_line":"        enabled\u003dbool(CONF.glance.swift_temp_url_cachetime))"},{"line_number":279,"context_line":"    def _clean_swift_tempurl_cache(self, manager, context):"},{"line_number":280,"context_line":"        img_service \u003d image_service.GlanceImageService("}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_99ec8df4","line":277,"updated":"2015-11-02 21:51:42.000000000","message":"Do we want the periodic time tied to the cachetime?\n\nNot sure we need to run this every 10 seconds if they specify 10 seconds.\n\nTo me this seems like something that should run every few minutes.\n\nThoughts?","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":274,"context_line":"                task.driver.boot.prepare_ramdisk(task, deploy_opts)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    @base.driver_periodic_task("},{"line_number":277,"context_line":"        run_immediately\u003dFalse, spacing\u003dCONF.glance.swift_temp_url_cachetime,"},{"line_number":278,"context_line":"        enabled\u003dbool(CONF.glance.swift_temp_url_cachetime))"},{"line_number":279,"context_line":"    def _clean_swift_tempurl_cache(self, manager, context):"},{"line_number":280,"context_line":"        img_service \u003d image_service.GlanceImageService("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_915da4eb","line":277,"in_reply_to":"1a26ad4f_99ec8df4","updated":"2015-11-04 12:54:44.000000000","message":"Done","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"80fabb10cda6c64355218ede4f3e160dc5480b32","unresolved":false,"context_lines":[{"line_number":274,"context_line":"                task.driver.boot.prepare_ramdisk(task, deploy_opts)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    @base.driver_periodic_task("},{"line_number":277,"context_line":"        run_immediately\u003dFalse, spacing\u003dCONF.glance.swift_temp_url_cachetime,"},{"line_number":278,"context_line":"        enabled\u003dbool(CONF.glance.swift_temp_url_cachetime))"},{"line_number":279,"context_line":"    def _clean_swift_tempurl_cache(self, manager, context):"},{"line_number":280,"context_line":"        img_service \u003d image_service.GlanceImageService("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_5568beba","line":277,"in_reply_to":"1a26ad4f_99ec8df4","updated":"2015-11-03 10:15:46.000000000","message":"I tend to agree it should not be tied to cachetime. May be providing a separate config could provide flexibility to operator as cleaning-up frequency could have impact on conductor process size..","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1b170882b72de738a53016e21d644b1441ef2b4b","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                \u0027image_container_format\u0027)"},{"line_number":408,"context_line":"        }"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        http_proxy \u003d node.driver_info.get(\u0027image_http_proxy\u0027)"},{"line_number":411,"context_line":"        https_proxy \u003d node.driver_info.get(\u0027image_https_proxy\u0027)"},{"line_number":412,"context_line":"        proxies \u003d {}"},{"line_number":413,"context_line":"        if http_proxy:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_3914599e","line":410,"updated":"2015-11-02 21:51:42.000000000","message":"nit: maybe this could be a for loop?\n\n proxies \u003d {}\n for scheme in (\u0027http\u0027, \u0027https):\n   proxy \u003d node.driver_info.get(\u0027image_{}_proxy\u0027.format(scheme))\n  if proxy:\n    proxies[scheme] \u003d proxy\n    chunks \u003d urlparse.urlparse(proxy)\n    if chunks.scheme not in ....:\n      .....","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e0813cebe63a01a4e24578fda600ff577fc515a","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                \u0027image_container_format\u0027)"},{"line_number":408,"context_line":"        }"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        http_proxy \u003d node.driver_info.get(\u0027image_http_proxy\u0027)"},{"line_number":411,"context_line":"        https_proxy \u003d node.driver_info.get(\u0027image_https_proxy\u0027)"},{"line_number":412,"context_line":"        proxies \u003d {}"},{"line_number":413,"context_line":"        if http_proxy:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_4b00eb34","line":410,"in_reply_to":"1a26ad4f_3914599e","updated":"2015-11-04 12:54:44.000000000","message":"Thanks for the suggestion, done.","commit_id":"658f04ec627e0133214d51f923313bc7c3aee53e"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"09b594029b584ed4bf576ee268147b2a5f53e0cd","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    def _clean_swift_tempurl_cache(self, manager, context):"},{"line_number":274,"context_line":"        img_service \u003d image_service.GlanceImageService("},{"line_number":275,"context_line":"            version\u003d2, context\u003dcontext)"},{"line_number":276,"context_line":"        img_service.remove_expired_items_from_cache()"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def clean_up(self, task):"},{"line_number":279,"context_line":"        \"\"\"Clean up the deployment environment for this node."}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_ebff38ff","line":276,"updated":"2015-11-17 18:23:03.000000000","message":"Do we actually need a periodic task for this? It doesn\u0027t actually save much, except for maybe a small amount of RAM","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"bcaabea6e39c5d1de48da31eb4533026b40430e9","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    def _clean_swift_tempurl_cache(self, manager, context):"},{"line_number":274,"context_line":"        img_service \u003d image_service.GlanceImageService("},{"line_number":275,"context_line":"            version\u003d2, context\u003dcontext)"},{"line_number":276,"context_line":"        img_service.remove_expired_items_from_cache()"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    def clean_up(self, task):"},{"line_number":279,"context_line":"        \"\"\"Clean up the deployment environment for this node."}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_3fd3c1d6","line":276,"in_reply_to":"ba8a016a_ebff38ff","updated":"2015-11-19 16:30:05.000000000","message":"I now added removal of an image from cache during node teardown, I think not clearing cache at all may be bad if conductor runs for a long time.","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"09b594029b584ed4bf576ee268147b2a5f53e0cd","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                if chunks.scheme not in (\u0027http\u0027, \u0027https\u0027):"},{"line_number":410,"context_line":"                    LOG.warning(_LW("},{"line_number":411,"context_line":"                        \"Proxy URL should be HTTP(S) URLs, but given %s \""},{"line_number":412,"context_line":"                        \"instead.\"), proxy)"},{"line_number":413,"context_line":"                proxies.update({scheme: proxy})"},{"line_number":414,"context_line":"        if proxies:"},{"line_number":415,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_4b19a478","line":412,"updated":"2015-11-17 18:23:03.000000000","message":"I assume we don\u0027t want to add a bad proxy URL to the list here?","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"bcaabea6e39c5d1de48da31eb4533026b40430e9","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                if chunks.scheme not in (\u0027http\u0027, \u0027https\u0027):"},{"line_number":410,"context_line":"                    LOG.warning(_LW("},{"line_number":411,"context_line":"                        \"Proxy URL should be HTTP(S) URLs, but given %s \""},{"line_number":412,"context_line":"                        \"instead.\"), proxy)"},{"line_number":413,"context_line":"                proxies.update({scheme: proxy})"},{"line_number":414,"context_line":"        if proxies:"},{"line_number":415,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba8a016a_5fbfa560","line":412,"in_reply_to":"ba8a016a_4b19a478","updated":"2015-11-19 16:30:05.000000000","message":"Actually, it can work even without scheme, like 192.168.122.20:3128, so I\u0027m not sure about it. wdyt?","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"ab4ad39bf1af09b9ae8c773d9a80f6ccc665a614","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        :param task: a TaskManager instance."},{"line_number":244,"context_line":"        :returns: status of the deploy. One of ironic.common.states."},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":247,"context_line":"            img_service \u003d image_service.GlanceImageService("},{"line_number":248,"context_line":"                version\u003d2, context\u003dtask.context)"},{"line_number":249,"context_line":"            img_service.remove_expired_items_from_cache()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_8489c1cc","line":246,"updated":"2015-11-23 15:16:53.000000000","message":"This code here looks like a hack, maybe do not remove at all, we do update expired in image_service, and we should have really a lot (\u003e 100000) Glance images for a visible RAM consumption.","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5fd36726c008a62a6e096d9bc793337114ddf723","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        :param task: a TaskManager instance."},{"line_number":244,"context_line":"        :returns: status of the deploy. One of ironic.common.states."},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":247,"context_line":"            img_service \u003d image_service.GlanceImageService("},{"line_number":248,"context_line":"                version\u003d2, context\u003dtask.context)"},{"line_number":249,"context_line":"            img_service.remove_expired_items_from_cache()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_d8632140","line":246,"in_reply_to":"ba8a016a_8489c1cc","updated":"2015-11-23 17:46:11.000000000","message":"That\u0027s true, but images get deleted and added, so I\u0027m not sure if 100000 is a big number or not compared to conductor lifetime without restart. Will wait what others think.","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"dabc0b370dbd69f034557292004eb25eacbec36d","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        :param task: a TaskManager instance."},{"line_number":244,"context_line":"        :returns: status of the deploy. One of ironic.common.states."},{"line_number":245,"context_line":"        \"\"\""},{"line_number":246,"context_line":"        if CONF.glance.swift_temp_url_cache_enabled:"},{"line_number":247,"context_line":"            img_service \u003d image_service.GlanceImageService("},{"line_number":248,"context_line":"                version\u003d2, context\u003dtask.context)"},{"line_number":249,"context_line":"            img_service.remove_expired_items_from_cache()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_1ccd0f5d","line":246,"in_reply_to":"ba8a016a_d8632140","updated":"2015-11-23 23:17:59.000000000","message":"I doubt that the cache would ever get big enough to take up a significant amount of RAM on a conductor, but it probably depends on the use case.\n\nI do think pruning the cache is good practice even if it\u0027s a hack here, though. Maybe a better place would be a configurable periodic task somewhere.","commit_id":"11f898d30dd0960d06af0ee00eef2544dd44103f"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":88,"context_line":"}"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"OPTIONAL_PROPERTIES \u003d {"},{"line_number":91,"context_line":"    \u0027image_http_proxy\u0027: _(\u0027URL of a proxy server for http:// addresses. \u0027"},{"line_number":92,"context_line":"                          \u0027Optional.\u0027),"},{"line_number":93,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for https:// addresses. \u0027"},{"line_number":94,"context_line":"                           \u0027Optional.\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_8c882de9","line":91,"updated":"2015-11-25 07:17:59.000000000","message":"s/\"for http:// addresses.\" / \"for HTTP connections\"","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":90,"context_line":"OPTIONAL_PROPERTIES \u003d {"},{"line_number":91,"context_line":"    \u0027image_http_proxy\u0027: _(\u0027URL of a proxy server for http:// addresses. \u0027"},{"line_number":92,"context_line":"                          \u0027Optional.\u0027),"},{"line_number":93,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for https:// addresses. \u0027"},{"line_number":94,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":95,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":96,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_2c55814f","line":93,"updated":"2015-11-25 07:17:59.000000000","message":"s/\"for http:// addresses.\"/ \"for HTTPS connections.\"","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            if proxy:"},{"line_number":399,"context_line":"                chunks \u003d urlparse.urlparse(proxy)"},{"line_number":400,"context_line":"                if chunks.scheme not in (\u0027http\u0027, \u0027https\u0027):"},{"line_number":401,"context_line":"                    LOG.warning(_LW("},{"line_number":402,"context_line":"                        \"Proxy URL should be HTTP(S) URLs, but given %s \""},{"line_number":403,"context_line":"                        \"instead.\"), proxy)"},{"line_number":404,"context_line":"                proxies.update({scheme: proxy})"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_373b8ad3","line":401,"updated":"2015-11-25 07:17:59.000000000","message":"Need to add testcase for this warning path","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":400,"context_line":"                if chunks.scheme not in (\u0027http\u0027, \u0027https\u0027):"},{"line_number":401,"context_line":"                    LOG.warning(_LW("},{"line_number":402,"context_line":"                        \"Proxy URL should be HTTP(S) URLs, but given %s \""},{"line_number":403,"context_line":"                        \"instead.\"), proxy)"},{"line_number":404,"context_line":"                proxies.update({scheme: proxy})"},{"line_number":405,"context_line":"        if proxies:"},{"line_number":406,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_4cc80556","line":403,"updated":"2015-11-25 07:17:59.000000000","message":"Would it be better to add to message that proxy variable would not be used in image download. Also can it be made as a single message after parsing http and https proxy parameters in driver_info.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"8ff221928a998dfd6afedabc13be258a1e1bf0ce","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":113,"context_line":"}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def build_instance_info_for_deploy(task):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a8ffd7b_3319f979","line":115,"updated":"2015-11-26 16:55:15.000000000","message":"Should be updated with OPTIONAL_PROPERTIES.","commit_id":"6c3e79be87d94150c77bdda5e5f274c36885125a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4dddf5fa888c2c8e706b6abaee63c9e75ad51373","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":113,"context_line":"}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def build_instance_info_for_deploy(task):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a8ffd7b_5b15afe2","line":115,"in_reply_to":"9a8ffd7b_3319f979","updated":"2015-11-26 18:14:01.000000000","message":"Forgot about it, thanks!","commit_id":"6c3e79be87d94150c77bdda5e5f274c36885125a"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"eb4c1574fad9bd70fe0f052d7606be7e8447f4d9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    cfg.IntOpt(\u0027agent_startup_time\u0027,"},{"line_number":71,"context_line":"               default\u003d300, min\u003d0,"},{"line_number":72,"context_line":"               help\u003d_(\u0027Amount of time (in seconds) needed for agent ramdisk \u0027"},{"line_number":73,"context_line":"                      \u0027to boot up on a node and start image download. It is \u0027"},{"line_number":74,"context_line":"                      \u0027used for checking if the swift temp URL duration is \u0027"},{"line_number":75,"context_line":"                      \u0027big enough to let the agent start downloading image, \u0027"},{"line_number":76,"context_line":"                      \u0027and, if temp URL caching is enabled, to determine if \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_f0474349","line":73,"updated":"2015-12-03 11:27:18.000000000","message":"(mostly nits, not sure if you want to change it)\n\nShouldn\u0027t this be at image_service.py ? I mean it\u0027s more related to swift and the option is only used on that module, not this one.\n\nIt\u0027s mostly a nit, but I think that the name is also a bit confusing, again this is more about swift. A suggestion would be having something like, e.g:\n\nswift_temp_url_expire_threshold: The time before expiration of the swift URL to be considered valid ...","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f8f1fa1fc8af2fb855c873457a4c70920c52f4d1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    cfg.IntOpt(\u0027agent_startup_time\u0027,"},{"line_number":71,"context_line":"               default\u003d300, min\u003d0,"},{"line_number":72,"context_line":"               help\u003d_(\u0027Amount of time (in seconds) needed for agent ramdisk \u0027"},{"line_number":73,"context_line":"                      \u0027to boot up on a node and start image download. It is \u0027"},{"line_number":74,"context_line":"                      \u0027used for checking if the swift temp URL duration is \u0027"},{"line_number":75,"context_line":"                      \u0027big enough to let the agent start downloading image, \u0027"},{"line_number":76,"context_line":"                      \u0027and, if temp URL caching is enabled, to determine if \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_e094cb37","line":73,"in_reply_to":"9a8ffd7b_f0474349","updated":"2015-12-03 11:35:06.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                          \u0027Optional.\u0027),"},{"line_number":110,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for HTTPS connections. \u0027"},{"line_number":111,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":112,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":113,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":114,"context_line":"}"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_f5590cfe","line":112,"updated":"2015-12-02 23:14:39.000000000","message":"if you do another revision, it is more correct: \u0027comma-separated\u0027","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                          \u0027Optional.\u0027),"},{"line_number":110,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for HTTPS connections. \u0027"},{"line_number":111,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":112,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":113,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":114,"context_line":"}"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_1a570159","line":112,"in_reply_to":"9a8ffd7b_f5590cfe","updated":"2015-12-03 10:38:18.000000000","message":"Done","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for HTTPS connections. \u0027"},{"line_number":111,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":112,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":113,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":114,"context_line":"}"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES.copy()"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_95cbe052","line":113,"updated":"2015-12-02 23:14:39.000000000","message":"Maybe we should mention the default values are none.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for HTTPS connections. \u0027"},{"line_number":111,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":112,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma separated URLs \u0027"},{"line_number":113,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":114,"context_line":"}"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"COMMON_PROPERTIES \u003d REQUIRED_PROPERTIES.copy()"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_5a58298a","line":113,"in_reply_to":"9a8ffd7b_95cbe052","updated":"2015-12-03 10:38:18.000000000","message":"Not sure about it, there is no actual default as these are not config options, if they are not set they are not used :)","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            LOG.warning(_LW("},{"line_number":436,"context_line":"                \"Proxy URL should either have HTTP(S) scheme or no scheme at \""},{"line_number":437,"context_line":"                \"all, but given %s instead. These proxies are invalid and \""},{"line_number":438,"context_line":"                \"will not be used for image download.\"), invalid_proxies)"},{"line_number":439,"context_line":"        if proxies:"},{"line_number":440,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"},{"line_number":441,"context_line":"            no_proxy \u003d node.driver_info.get(\u0027image_no_proxy\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_d00bb6d3","line":438,"updated":"2015-12-02 23:14:39.000000000","message":"What do you think about checking for this in eg AgentDeploy.validate() call?","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            LOG.warning(_LW("},{"line_number":436,"context_line":"                \"Proxy URL should either have HTTP(S) scheme or no scheme at \""},{"line_number":437,"context_line":"                \"all, but given %s instead. These proxies are invalid and \""},{"line_number":438,"context_line":"                \"will not be used for image download.\"), invalid_proxies)"},{"line_number":439,"context_line":"        if proxies:"},{"line_number":440,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"},{"line_number":441,"context_line":"            no_proxy \u003d node.driver_info.get(\u0027image_no_proxy\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_8bf405f1","line":438,"in_reply_to":"9a8ffd7b_d00bb6d3","updated":"2015-12-03 10:38:18.000000000","message":"It could be done, but then it will have to raise InvalidParameterValue and stop the deploy, but incorrect proxies does not necessarily mean that deploy is impossible, so I\u0027m not sure.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"304db55b9d8e7ec13938a684b2edeaefd59e08ee","unresolved":false,"context_lines":[{"line_number":440,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"},{"line_number":441,"context_line":"            no_proxy \u003d node.driver_info.get(\u0027image_no_proxy\u0027)"},{"line_number":442,"context_line":"            if no_proxy:"},{"line_number":443,"context_line":"                image_info[\u0027no_proxy\u0027] \u003d no_proxy"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        # Tell the client to download and write the image with the given args"},{"line_number":446,"context_line":"        self._client.prepare_image(node, image_info)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_b0ccf289","line":443,"updated":"2015-12-02 23:14:39.000000000","message":"and i wonder if we should validate that this is actually a list of urls","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"17b87bc6fe0a3a0770fd804f61ea798aebcb7251","unresolved":false,"context_lines":[{"line_number":440,"context_line":"            image_info[\u0027proxies\u0027] \u003d proxies"},{"line_number":441,"context_line":"            no_proxy \u003d node.driver_info.get(\u0027image_no_proxy\u0027)"},{"line_number":442,"context_line":"            if no_proxy:"},{"line_number":443,"context_line":"                image_info[\u0027no_proxy\u0027] \u003d no_proxy"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        # Tell the client to download and write the image with the given args"},{"line_number":446,"context_line":"        self._client.prepare_image(node, image_info)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a8ffd7b_6080e0f7","line":443,"in_reply_to":"9a8ffd7b_b0ccf289","updated":"2015-12-03 10:38:18.000000000","message":"Will add.","commit_id":"8a101c6b280c7c707fdd98cf5036c31ff8090eaa"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                          \u0027Optional.\u0027),"},{"line_number":102,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for HTTPS connections. \u0027"},{"line_number":103,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":104,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma-separated URLs \u0027"},{"line_number":105,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":106,"context_line":"}"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_e637ade1","line":104,"updated":"2015-12-04 02:51:20.000000000","message":"Looks like these are hostnames, not urls.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                          \u0027Optional.\u0027),"},{"line_number":102,"context_line":"    \u0027image_https_proxy\u0027: _(\u0027URL of a proxy server for HTTPS connections. \u0027"},{"line_number":103,"context_line":"                           \u0027Optional.\u0027),"},{"line_number":104,"context_line":"    \u0027image_no_proxy\u0027: _(\u0027A string containing a list of comma-separated URLs \u0027"},{"line_number":105,"context_line":"                        \u0027that will be excluded from proxying. Optional.\u0027),"},{"line_number":106,"context_line":"}"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a740942_60e701e5","line":104,"in_reply_to":"7a740942_e637ade1","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"}],"ironic/tests/unit/common/test_utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6aaf280c08bb9f5bdb4dd40fe27a6279a22f1d93","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        self.assertFalse(utils.is_valid_no_proxy(proxy7))"},{"line_number":471,"context_line":"        self.assertFalse(utils.is_valid_no_proxy(proxy8))"},{"line_number":472,"context_line":"        self.assertFalse(utils.is_valid_no_proxy(proxy9))"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"class MkfsTestCase(base.TestCase):"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_4b93e5a3","line":473,"updated":"2015-12-17 22:17:49.000000000","message":"don\u0027t know if we want to test an empty string but might be good to have an IP address.","commit_id":"30125908f669ba270f33a487803eaf584d7670fc"}],"ironic/tests/unit/drivers/modules/test_agent.py":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        self.node.provision_state \u003d states.DEPLOYWAIT"},{"line_number":468,"context_line":"        self.node.target_provision_state \u003d states.ACTIVE"},{"line_number":469,"context_line":"        driver_info \u003d self.node.driver_info"},{"line_number":470,"context_line":"        driver_info[\u0027image_https_proxy\u0027] \u003d \u0027https://spam.ni\u0027"},{"line_number":471,"context_line":"        driver_info[\u0027image_no_proxy\u0027] \u003d \u0027.eggs.com\u0027"},{"line_number":472,"context_line":"        self.node.driver_info \u003d driver_info"},{"line_number":473,"context_line":"        self.node.save()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_970ef632","line":470,"updated":"2015-11-25 07:17:59.000000000","message":"Add http proxy as well\n\ndriver_info[\u0027image_http_proxy\u0027] \u003d \u0027https://spam.ni\u0027","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"2da2222f83067feecd315ec42b1688023bcc4a33","unresolved":false,"context_lines":[{"line_number":478,"context_line":"            \u0027checksum\u0027: \u0027checksum\u0027,"},{"line_number":479,"context_line":"            \u0027disk_format\u0027: \u0027qcow2\u0027,"},{"line_number":480,"context_line":"            \u0027container_format\u0027: \u0027bare\u0027,"},{"line_number":481,"context_line":"            \u0027proxies\u0027: {\u0027https\u0027: \u0027https://spam.ni\u0027},"},{"line_number":482,"context_line":"            \u0027no_proxy\u0027: \u0027.eggs.com\u0027"},{"line_number":483,"context_line":"        }"},{"line_number":484,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a8ffd7b_8c17cd50","line":481,"updated":"2015-11-25 07:17:59.000000000","message":"validate for http proxy as well.","commit_id":"eb6197fb469489806ecd6b789a517388a2489e35"}],"releasenotes/notes/add-agent-proxy-support-790e629634ca2eb7.yaml":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"09b594029b584ed4bf576ee268147b2a5f53e0cd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"ba8a016a_eb4df872","line":3,"updated":"2015-11-17 18:23:03.000000000","message":"++ thank you for doing this.","commit_id":"1ee13028626597768ccf073d964ac5ff6a6c13a5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."},{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_1b66cbed","line":3,"updated":"2015-12-04 02:51:20.000000000","message":"maybe add \u0027so that images can be cached on the proxy server\u0027","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."},{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_6035c144","line":3,"in_reply_to":"7a740942_1b66cbed","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."},{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"},{"line_number":7,"context_line":"    bigger than the value of swift_temp_url_duration option."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_bb3457de","line":5,"updated":"2015-12-04 02:51:20.000000000","message":"I think (take a look at the other release notes) you can use [glance]/swift_temp_url... Yeah, the others are worded like \u0027Adds a configuration option [glance]/swift_temp... \u0027\n\nActually, you added two config options. swift_temp_url_cache_enabled too.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."},{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"},{"line_number":7,"context_line":"    bigger than the value of swift_temp_url_duration option."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_00915df0","line":5,"in_reply_to":"7a740942_bb3457de","updated":"2015-12-04 14:07:22.000000000","message":"Aha, in one of the previous patch sets I started description with [glance]... and the job complained about it. So it seems that [] cannot be used only at the beginning of the string.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."},{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"},{"line_number":7,"context_line":"    bigger than the value of swift_temp_url_duration option."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_9b3cfb94","line":6,"updated":"2015-12-04 02:51:20.000000000","message":"I think this is missing a description of what the config is used for :)","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Pass proxy information from agent driver to IPA ramdisk."},{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"},{"line_number":7,"context_line":"    bigger than the value of swift_temp_url_duration option."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_a0188985","line":6,"in_reply_to":"7a740942_9b3cfb94","updated":"2015-12-04 14:07:22.000000000","message":"These descriptions get too long :\u0027(","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d3e00d166e9a32fc35d6d9009fd734902e9266b4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"},{"line_number":7,"context_line":"    bigger than the value of swift_temp_url_duration option."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_bbe7773f","line":7,"updated":"2015-12-04 02:51:20.000000000","message":"Instead of \u0027which, if set, ...\u0027, what about \u0027This value must be less than the value for the configuration option swift_temp_url_duration\u0027.","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"0c7d51e91164bec982d311e571ebedf8de356437","unresolved":false,"context_lines":[{"line_number":4,"context_line":"upgrade:"},{"line_number":5,"context_line":"  - swift_temp_url_expected_download_start_delay configuration option in glance"},{"line_number":6,"context_line":"    section is introduced, which, if set, may fail the deployment when it is"},{"line_number":7,"context_line":"    bigger than the value of swift_temp_url_duration option."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7a740942_4023e5bd","line":7,"in_reply_to":"7a740942_bbe7773f","updated":"2015-12-04 14:07:22.000000000","message":"Done","commit_id":"12148a243c9454e863b5db038c82ec4b35853133"}]}
