)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u0027total_storage_quota\u0027.  Most of the patch is about enforcement so"},{"line_number":13,"context_line":"when a separate service for quota management emerges in OpenStack the"},{"line_number":14,"context_line":"per user value to enforce can be obtained from that service but the"},{"line_number":15,"context_line":"enforcement code will remain the same.  The logic only protects the v2"},{"line_number":16,"context_line":"API."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"blueprint glance-basic-quotas"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAQn%2F%2Fj7M%3D","line":15,"updated":"2013-07-29 06:59:34.000000000","message":"Why we not add it to v1 equally? IMO it\u0027s necessary.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u0027total_storage_quota\u0027.  Most of the patch is about enforcement so"},{"line_number":13,"context_line":"when a separate service for quota management emerges in OpenStack the"},{"line_number":14,"context_line":"per user value to enforce can be obtained from that service but the"},{"line_number":15,"context_line":"enforcement code will remain the same.  The logic only protects the v2"},{"line_number":16,"context_line":"API."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"blueprint glance-basic-quotas"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAQn%2F%2FYXI%3D","line":15,"in_reply_to":"AAAAQn%2F%2Fads%3D","updated":"2013-08-01 03:32:54.000000000","message":"Sure, thanks.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":12,"context_line":"\u0027total_storage_quota\u0027.  Most of the patch is about enforcement so"},{"line_number":13,"context_line":"when a separate service for quota management emerges in OpenStack the"},{"line_number":14,"context_line":"per user value to enforce can be obtained from that service but the"},{"line_number":15,"context_line":"enforcement code will remain the same.  The logic only protects the v2"},{"line_number":16,"context_line":"API."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"blueprint glance-basic-quotas"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAQn%2F%2Fads%3D","line":15,"in_reply_to":"AAAAQn%2F%2Fj7M%3D","updated":"2013-07-31 20:41:34.000000000","message":"I agree it is needed in v1 also.  My plan was to either add it in a dependent patch or add it in a follow up patch here depending on the comments I received.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"}],"etc/glance-api.conf":[{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"050c9be5a0a8d585f9061aadb4cbf32f1ebd7def","unresolved":false,"context_lines":[{"line_number":98,"context_line":"#send_identity_headers \u003d False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"# Set a system wide quota for every user.  This value is the total number"},{"line_number":101,"context_line":"# of bytes that a user can user across all storage systems."},{"line_number":102,"context_line":"#user_storage_quota \u003d 0"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Syslog Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":8,"id":"AAAARH%2F%2F1Vg%3D","line":101,"updated":"2013-08-16 15:20:18.000000000","message":"I guess setting to \u00270\u0027 means no quota? Maybe state explicitly here if so?\n\nAlso should we change the doc (.rst) files?","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"88d08bfcd2f37a3f65d4732f586c4c7b35967f64","unresolved":false,"context_lines":[{"line_number":98,"context_line":"#send_identity_headers \u003d False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"# Set a system wide quota for every user.  This value is the total number"},{"line_number":101,"context_line":"# of bytes that a user can user across all storage systems."},{"line_number":102,"context_line":"#user_storage_quota \u003d 0"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Syslog Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":8,"id":"AAAARn%2F%2F9Ag%3D","line":101,"in_reply_to":"AAAARH%2F%2F1Vg%3D","updated":"2013-08-19 19:53:41.000000000","message":"Done","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1a049b3fad5bb7331dfb923becc44d85b934278f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"#send_identity_headers \u003d False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"# Set a system wide quota for every user.  This value is the total number"},{"line_number":101,"context_line":"# of bytes that a user can user across all storage systems."},{"line_number":102,"context_line":"#user_storage_quota \u003d 0"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Syslog Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":8,"id":"AAAARH%2F%2FzYI%3D","line":101,"in_reply_to":"AAAARH%2F%2F1Vg%3D","updated":"2013-08-17 03:49:04.000000000","message":"If so probably other \u0027conf\u0027 files in \u0027glance/etc\u0027 also need add this new option?","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"}],"glance/api/common.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    #NOTE(jbresnah) in the future this value will come from a call to"},{"line_number":95,"context_line":"    # keystone."},{"line_number":96,"context_line":"    users_quota \u003d CONF.total_storage_quota"},{"line_number":97,"context_line":"    if users_quota \u003c\u003d 0:"},{"line_number":98,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj5I%3D","line":95,"updated":"2013-07-29 06:59:34.000000000","message":"Do you think it will be better if we move this two new functions to a new file such as \u0027quota.py\u0027 ? I\u0027m worried the code logic will be complicated after we involve keystone in future.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    #NOTE(jbresnah) in the future this value will come from a call to"},{"line_number":95,"context_line":"    # keystone."},{"line_number":96,"context_line":"    users_quota \u003d CONF.total_storage_quota"},{"line_number":97,"context_line":"    if users_quota \u003c\u003d 0:"},{"line_number":98,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYXM%3D","line":95,"in_reply_to":"AAAAQn%2F%2FZ34%3D","updated":"2013-08-01 03:32:54.000000000","message":"Ok, make sense, let\u0027s do it later if we needed.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    #NOTE(jbresnah) in the future this value will come from a call to"},{"line_number":95,"context_line":"    # keystone."},{"line_number":96,"context_line":"    users_quota \u003d CONF.total_storage_quota"},{"line_number":97,"context_line":"    if users_quota \u003c\u003d 0:"},{"line_number":98,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZ34%3D","line":95,"in_reply_to":"AAAAQn%2F%2Fj5I%3D","updated":"2013-07-31 20:41:34.000000000","message":"That is a fair point but I would rather wait until that complications happens before we introduce another file.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    This method is called to see if the user is allowed to store an image"},{"line_number":87,"context_line":"    of the given size in glance based on their quota and current usage."},{"line_number":88,"context_line":"    :param context:"},{"line_number":89,"context_line":"    :param size:  The size of the image we hope to store"},{"line_number":90,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":91,"context_line":"    :return:"},{"line_number":92,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FGFU%3D","line":89,"updated":"2013-08-07 11:43:11.000000000","message":"Did you mean db_api?","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"69b87298b905feecb86e70470e73f2cfeabbaab1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    This method is called to see if the user is allowed to store an image"},{"line_number":87,"context_line":"    of the given size in glance based on their quota and current usage."},{"line_number":88,"context_line":"    :param context:"},{"line_number":89,"context_line":"    :param size:  The size of the image we hope to store"},{"line_number":90,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":91,"context_line":"    :return:"},{"line_number":92,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQ3%2F%2F6lI%3D","line":89,"in_reply_to":"AAAAQn%2F%2FGFU%3D","updated":"2013-08-13 01:58:01.000000000","message":"Done","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    This method is called to see if the user is allowed to store an image"},{"line_number":109,"context_line":"    of the given size in glance based on their quota and current usage."},{"line_number":110,"context_line":"    :param context:"},{"line_number":111,"context_line":"    :param size:  The size of the image we hope to store"},{"line_number":112,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":113,"context_line":"    :return:"},{"line_number":114,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FGFQ%3D","line":111,"updated":"2013-08-07 11:43:11.000000000","message":"image_size* ?","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"69b87298b905feecb86e70470e73f2cfeabbaab1","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    This method is called to see if the user is allowed to store an image"},{"line_number":109,"context_line":"    of the given size in glance based on their quota and current usage."},{"line_number":110,"context_line":"    :param context:"},{"line_number":111,"context_line":"    :param size:  The size of the image we hope to store"},{"line_number":112,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":113,"context_line":"    :return:"},{"line_number":114,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQ3%2F%2F6kw%3D","line":111,"in_reply_to":"AAAAQn%2F%2FGFQ%3D","updated":"2013-08-13 01:58:01.000000000","message":"Done","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    of the given size in glance based on their quota and current usage."},{"line_number":110,"context_line":"    :param context:"},{"line_number":111,"context_line":"    :param size:  The size of the image we hope to store"},{"line_number":112,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":113,"context_line":"    :return:"},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FGFM%3D","line":112,"updated":"2013-08-07 11:43:11.000000000","message":"db_api docstring is missing","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"69b87298b905feecb86e70470e73f2cfeabbaab1","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    of the given size in glance based on their quota and current usage."},{"line_number":110,"context_line":"    :param context:"},{"line_number":111,"context_line":"    :param size:  The size of the image we hope to store"},{"line_number":112,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":113,"context_line":"    :return:"},{"line_number":114,"context_line":"    \"\"\""},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQ3%2F%2F6ks%3D","line":112,"in_reply_to":"AAAAQn%2F%2FGFM%3D","updated":"2013-08-13 01:58:01.000000000","message":"Done","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1b4d88d102b2ff883b3dde44f10b6bdf1f14503e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    if remaining is None:"},{"line_number":120,"context_line":"        return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    if image_size \u003e remaining:"},{"line_number":123,"context_line":"        raise exception.StorageQuotaFull({\u0027image_size\u0027: image_size,"},{"line_number":124,"context_line":"                                          \u0027remaining\u0027: remaining})"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARn%2F%2F1io%3D","line":122,"updated":"2013-08-21 11:26:17.000000000","message":"We need check image_size to prevent None value.","commit_id":"bfac25aedcaac74bb98d741822697f4b990fa131"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"b2043b03520bb1e3bd14029777e7343c86314422","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    :param context:"},{"line_number":89,"context_line":"    :param db_api:  The db_api in use for this configuration"},{"line_number":90,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":91,"context_line":"    :return:"},{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    #NOTE(jbresnah) in the future this value will come from a call to"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAASn%2F%2F%2B9Y%3D","line":91,"updated":"2013-08-27 08:35:46.000000000","message":"Mind adding something to the return docstring?","commit_id":"a072dee0f052915b01cf063d46655ff118d28f92"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"7027c499043680552694d8809742172c366a248d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    :param context:"},{"line_number":89,"context_line":"    :param db_api:  The db_api in use for this configuration"},{"line_number":90,"context_line":"    :param image_id: The image that will be replaced with this new data size"},{"line_number":91,"context_line":"    :return:"},{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    #NOTE(jbresnah) in the future this value will come from a call to"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAASn%2F%2F%2Btc%3D","line":91,"in_reply_to":"AAAASn%2F%2F%2B9Y%3D","updated":"2013-08-27 08:57:08.000000000","message":"Done","commit_id":"a072dee0f052915b01cf063d46655ff118d28f92"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"4bd9546cc08a4c110c2c92a36af28408ea28be86","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    if remaining is None:"},{"line_number":121,"context_line":"        return"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    if image_size is None:"},{"line_number":124,"context_line":"        if remaining \u003c\u003d 0:"},{"line_number":125,"context_line":"            raise exception.StorageQuotaFull(image_size\u003dimage_size,"},{"line_number":126,"context_line":"                                             remaining\u003dremaining)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2F1f4%3D","line":123,"updated":"2013-08-29 00:04:02.000000000","message":"A note about why this is a valid case would be appreciated (I *think* I understand why, but it is a bit counterintuitive at first).","commit_id":"46e08d08b94bc78929577fa5b6d2ead485c673ba"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"cc62613cc66ae0dcdb68afe3a99328f58b9dcd40","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    if remaining is None:"},{"line_number":121,"context_line":"        return"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    if image_size is None:"},{"line_number":124,"context_line":"        if remaining \u003c\u003d 0:"},{"line_number":125,"context_line":"            raise exception.StorageQuotaFull(image_size\u003dimage_size,"},{"line_number":126,"context_line":"                                             remaining\u003dremaining)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2F1F8%3D","line":123,"in_reply_to":"AAAASn%2F%2F1f4%3D","updated":"2013-08-29 02:52:39.000000000","message":"will do","commit_id":"46e08d08b94bc78929577fa5b6d2ead485c673ba"}],"glance/api/v1/images.py":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        if remaining is not None:"},{"line_number":452,"context_line":"            image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":453,"context_line":"            if image_size is not None and image_size \u003e remaining:"},{"line_number":454,"context_line":"                raise exception.StorageQuotaFull(locals())"},{"line_number":455,"context_line":"            image_data \u003d utils.LimitingReader(image_data, remaining)"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        image_meta, location, loc_meta \u003d upload_utils.upload_data_to_store("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FGDg%3D","line":454,"updated":"2013-08-07 11:43:11.000000000","message":"can you use an explicit dict here instead?","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"69b87298b905feecb86e70470e73f2cfeabbaab1","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        if remaining is not None:"},{"line_number":452,"context_line":"            image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":453,"context_line":"            if image_size is not None and image_size \u003e remaining:"},{"line_number":454,"context_line":"                raise exception.StorageQuotaFull(locals())"},{"line_number":455,"context_line":"            image_data \u003d utils.LimitingReader(image_data, remaining)"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        image_meta, location, loc_meta \u003d upload_utils.upload_data_to_store("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQ3%2F%2F6ko%3D","line":454,"in_reply_to":"AAAAQn%2F%2FGDg%3D","updated":"2013-08-13 01:58:01.000000000","message":"Done","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2af629a71bfb693034f437d8404d407c8d299a60","unresolved":false,"context_lines":[{"line_number":453,"context_line":"            if image_size is not None and image_size \u003e remaining:"},{"line_number":454,"context_line":"                raise exception.StorageQuotaFull({\u0027image_size\u0027: image_size,"},{"line_number":455,"context_line":"                                                  \u0027remaining\u0027: remaining})"},{"line_number":456,"context_line":"            image_data \u003d utils.LimitingReader(image_data, remaining)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        image_meta, location, loc_meta \u003d upload_utils.upload_data_to_store("},{"line_number":459,"context_line":"            req, image_meta, image_data, store, self.notifier)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F6R0%3D","line":456,"updated":"2013-08-13 04:54:37.000000000","message":"I\u0027m not pretty sure but it seems here have a race condition under a concurrent upload situation, since at this position the location record has not be saved into DB but other upload process could reach here.","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"6a5320132cd9512dc361069ab9ecdd5b779cee4c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"from glance.common import exception"},{"line_number":43,"context_line":"from glance.common import utils"},{"line_number":44,"context_line":"from glance.common import wsgi"},{"line_number":45,"context_line":"import glance.db"},{"line_number":46,"context_line":"from glance import notifier"},{"line_number":47,"context_line":"import glance.openstack.common.log as logging"},{"line_number":48,"context_line":"from glance.openstack.common import strutils"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7fI%3D","line":45,"updated":"2013-08-20 04:55:20.000000000","message":"Need to move this to glance/api/v1/upload_utils.py also.","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"78863fb129ff0377e74632a451de60d92801ac94","unresolved":false,"context_lines":[{"line_number":42,"context_line":"from glance.common import exception"},{"line_number":43,"context_line":"from glance.common import utils"},{"line_number":44,"context_line":"from glance.common import wsgi"},{"line_number":45,"context_line":"import glance.db"},{"line_number":46,"context_line":"from glance import notifier"},{"line_number":47,"context_line":"import glance.openstack.common.log as logging"},{"line_number":48,"context_line":"from glance.openstack.common import strutils"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7QY%3D","line":45,"in_reply_to":"AAAARn%2F%2F7fI%3D","updated":"2013-08-20 06:32:01.000000000","message":"Done","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"}],"glance/api/v1/upload_utils.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"6a5320132cd9512dc361069ab9ecdd5b779cee4c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        req.context, db_api, image_id\u003dimage_id)"},{"line_number":86,"context_line":"    if remaining is not None:"},{"line_number":87,"context_line":"        image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":88,"context_line":"        if image_size is not None and image_size \u003e remaining:"},{"line_number":89,"context_line":"            raise exception.StorageQuotaFull({\u0027image_size\u0027: image_size,"},{"line_number":90,"context_line":"                                              \u0027remaining\u0027: remaining})"},{"line_number":91,"context_line":"        image_data \u003d utils.LimitingReader(image_data, remaining)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7fg%3D","line":88,"updated":"2013-08-20 04:55:20.000000000","message":"Why not using \u0027check_quota()\u0027 to reduce this checing?","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"78863fb129ff0377e74632a451de60d92801ac94","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        req.context, db_api, image_id\u003dimage_id)"},{"line_number":86,"context_line":"    if remaining is not None:"},{"line_number":87,"context_line":"        image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":88,"context_line":"        if image_size is not None and image_size \u003e remaining:"},{"line_number":89,"context_line":"            raise exception.StorageQuotaFull({\u0027image_size\u0027: image_size,"},{"line_number":90,"context_line":"                                              \u0027remaining\u0027: remaining})"},{"line_number":91,"context_line":"        image_data \u003d utils.LimitingReader(image_data, remaining)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7K4%3D","line":88,"in_reply_to":"AAAARn%2F%2F7fg%3D","updated":"2013-08-20 06:32:01.000000000","message":"I think that you are correct.  There is a small difference wen image_size is None.  I will work something out here, thanks!","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"6a5320132cd9512dc361069ab9ecdd5b779cee4c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            req.context, db_api, image_id\u003dimage_id)"},{"line_number":107,"context_line":"        if remaining is not None:"},{"line_number":108,"context_line":"            image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":109,"context_line":"            if image_size is not None and image_size \u003e remaining:"},{"line_number":110,"context_line":"                raise exception.StorageQuotaFull({\u0027image_size\u0027: image_size,"},{"line_number":111,"context_line":"                                                  \u0027remaining\u0027: remaining})"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7fU%3D","line":109,"updated":"2013-08-20 04:55:20.000000000","message":"1. Question as my above comment.\n\n2. You have to using real image size here, that\u0027s \u0027size\u0027 variable which we defined at L95.\n\n3. Below code (L160~232) has not handle \u0027StorageQuotaFull\u0027 exception, it will cause image bits leak.","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"78863fb129ff0377e74632a451de60d92801ac94","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            req.context, db_api, image_id\u003dimage_id)"},{"line_number":107,"context_line":"        if remaining is not None:"},{"line_number":108,"context_line":"            image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":109,"context_line":"            if image_size is not None and image_size \u003e remaining:"},{"line_number":110,"context_line":"                raise exception.StorageQuotaFull({\u0027image_size\u0027: image_size,"},{"line_number":111,"context_line":"                                                  \u0027remaining\u0027: remaining})"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7Ko%3D","line":109,"in_reply_to":"AAAARn%2F%2F7fU%3D","updated":"2013-08-20 06:32:01.000000000","message":"all 3 are good points.  I will fix, thank you.","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1b4d88d102b2ff883b3dde44f10b6bdf1f14503e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    db_api \u003d glance.db.get_api()"},{"line_number":85,"context_line":"    image_size \u003d image_meta.get(\u0027size\u0027, None)"},{"line_number":86,"context_line":"    remaining \u003d glance.api.common.check_quota("},{"line_number":87,"context_line":"        req.context, image_size, db_api, image_id\u003dimage_id)"},{"line_number":88,"context_line":"    if remaining is not None:"},{"line_number":89,"context_line":"        image_data \u003d utils.LimitingReader(image_data, remaining)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARn%2F%2F1is%3D","line":87,"updated":"2013-08-21 11:26:17.000000000","message":"So in check_quota() we need check image_size to prevent None value.","commit_id":"bfac25aedcaac74bb98d741822697f4b990fa131"}],"glance/api/v2/image_data.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            gateway \u003d glance.gateway.Gateway(db_api, store_api,"},{"line_number":44,"context_line":"                                             notifier, policy)"},{"line_number":45,"context_line":"        self.gateway \u003d gateway"},{"line_number":46,"context_line":"        self.db_api \u003d db_api"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @utils.mutating"},{"line_number":49,"context_line":"    def upload(self, req, image_id, data, size):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj9I%3D","line":46,"updated":"2013-07-29 06:59:34.000000000","message":"Why we need \u0027sefl.db_api\u0027 here? seems it\u0027s useless.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            gateway \u003d glance.gateway.Gateway(db_api, store_api,"},{"line_number":44,"context_line":"                                             notifier, policy)"},{"line_number":45,"context_line":"        self.gateway \u003d gateway"},{"line_number":46,"context_line":"        self.db_api \u003d db_api"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @utils.mutating"},{"line_number":49,"context_line":"    def upload(self, req, image_id, data, size):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZ40%3D","line":46,"in_reply_to":"AAAAQn%2F%2Fj9I%3D","updated":"2013-07-31 20:41:34.000000000","message":"Done","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            raise webob.exc.HTTPUnsupportedMediaType()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # XXXX TODO make sure that when size is none the quota is still"},{"line_number":123,"context_line":"        # enforced"},{"line_number":124,"context_line":"        image_size \u003d request.content_length or None"},{"line_number":125,"context_line":"        return {\u0027size\u0027: image_size, \u0027data\u0027: request.body_file}"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj8c%3D","line":123,"updated":"2013-07-29 06:59:34.000000000","message":"Seems https://review.openstack.org/#/c/37993/4/glance/store/__init__.py Line #646-652 already did.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"}],"glance/common/config.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    cfg.IntOpt(\u0027image_size_cap\u0027, default\u003d1099511627776,"},{"line_number":66,"context_line":"               help\u003d_(\"Maximum size of image a user can upload in bytes. \""},{"line_number":67,"context_line":"                      \"Defaults to 1099511627776 bytes (1 TB).\")),"},{"line_number":68,"context_line":"    cfg.IntOpt(\u0027total_storage_quota\u0027, default\u003d0,"},{"line_number":69,"context_line":"               help\u003d_(\"Maximum amount of data in bytes that ever user can. \""},{"line_number":70,"context_line":"                      \"store across all storage systems.\")),"},{"line_number":71,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj78%3D","line":68,"updated":"2013-07-29 06:59:34.000000000","message":"Do you think this is a good name to cover below description? What about \u0027user_storage_quota\u0027? IMHO.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    cfg.IntOpt(\u0027image_size_cap\u0027, default\u003d1099511627776,"},{"line_number":66,"context_line":"               help\u003d_(\"Maximum size of image a user can upload in bytes. \""},{"line_number":67,"context_line":"                      \"Defaults to 1099511627776 bytes (1 TB).\")),"},{"line_number":68,"context_line":"    cfg.IntOpt(\u0027total_storage_quota\u0027, default\u003d0,"},{"line_number":69,"context_line":"               help\u003d_(\"Maximum amount of data in bytes that ever user can. \""},{"line_number":70,"context_line":"                      \"store across all storage systems.\")),"},{"line_number":71,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYXY%3D","line":68,"in_reply_to":"AAAAQn%2F%2FZ3c%3D","updated":"2013-08-01 03:32:54.000000000","message":"And we\u0027d better add this new option to \u0027etc/glance-api.conf\u0027 right.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    cfg.IntOpt(\u0027image_size_cap\u0027, default\u003d1099511627776,"},{"line_number":66,"context_line":"               help\u003d_(\"Maximum size of image a user can upload in bytes. \""},{"line_number":67,"context_line":"                      \"Defaults to 1099511627776 bytes (1 TB).\")),"},{"line_number":68,"context_line":"    cfg.IntOpt(\u0027total_storage_quota\u0027, default\u003d0,"},{"line_number":69,"context_line":"               help\u003d_(\"Maximum amount of data in bytes that ever user can. \""},{"line_number":70,"context_line":"                      \"store across all storage systems.\")),"},{"line_number":71,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZ3c%3D","line":68,"in_reply_to":"AAAAQn%2F%2Fj78%3D","updated":"2013-07-31 20:41:34.000000000","message":"Done","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1b4d88d102b2ff883b3dde44f10b6bdf1f14503e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                      \"Defaults to 1099511627776 bytes (1 TB).\")),"},{"line_number":68,"context_line":"    cfg.IntOpt(\u0027user_storage_quota\u0027, default\u003d0,"},{"line_number":69,"context_line":"               help\u003d_(\"Maximum amount of data in bytes that every user can \""},{"line_number":70,"context_line":"                      \"store across all storage systems.\")),"},{"line_number":71,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":72,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API. \")),"},{"line_number":73,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARn%2F%2F1hY%3D","line":70,"updated":"2013-08-21 11:26:17.000000000","message":"Just little concern here, do you think it will be better if we make this help message same as glance-api.conf?","commit_id":"bfac25aedcaac74bb98d741822697f4b990fa131"}],"glance/common/exception.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class StorageQuotaFull(GlanceException):"},{"line_number":90,"context_line":"    message \u003d _(\"You have exceeded the disk quota.\")"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class StorageWriteDenied(GlanceException):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj7s%3D","line":90,"updated":"2013-07-29 06:59:34.000000000","message":"Give a quota value here? to help user/admin debug.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class StorageQuotaFull(GlanceException):"},{"line_number":90,"context_line":"    message \u003d _(\"You have exceeded the disk quota.\")"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class StorageWriteDenied(GlanceException):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYXg%3D","line":90,"in_reply_to":"AAAAQn%2F%2FZ0c%3D","updated":"2013-08-01 03:32:54.000000000","message":"Sorry, I have not saw the change on this in PS5 (current latest one).","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"class StorageQuotaFull(GlanceException):"},{"line_number":90,"context_line":"    message \u003d _(\"You have exceeded the disk quota.\")"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class StorageWriteDenied(GlanceException):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZ0c%3D","line":90,"in_reply_to":"AAAAQn%2F%2Fj7s%3D","updated":"2013-07-31 20:41:34.000000000","message":"Done","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        if not message:"},{"line_number":43,"context_line":"            message \u003d self.message"},{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            message \u003d str(message) % kwargs"},{"line_number":46,"context_line":"        except Exception:"},{"line_number":47,"context_line":"            if _FATAL_EXCEPTION_FORMAT_ERRORS:"},{"line_number":48,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FGDA%3D","line":45,"updated":"2013-08-07 11:43:11.000000000","message":"Could you use openstack.common.strutils instead?","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"}],"glance/db/registry/api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj7A%3D","line":222,"updated":"2013-07-29 06:59:34.000000000","message":"Who use this function?","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYXo%3D","line":222,"in_reply_to":"AAAAQn%2F%2FZz8%3D","updated":"2013-08-01 03:32:54.000000000","message":"Ok, got it. TBH, the approach of the registry driver implement is strange to me.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZz8%3D","line":222,"in_reply_to":"AAAAQn%2F%2Fj7A%3D","updated":"2013-07-31 20:41:34.000000000","message":"This is called when the registry is used as a db driver","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2af629a71bfb693034f437d8404d407c8d299a60","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F6Rw%3D","line":222,"updated":"2013-08-13 04:54:37.000000000","message":"Do you think put \u0027session\u0027 param at last will keep consistent with other interfaces\u0027 stub?","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"a89dc4efab3ef1ad207766b46133d5a2e16bba5c","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F54A%3D","line":222,"in_reply_to":"AAAAQ3%2F%2F6Rw%3D","updated":"2013-08-13 07:37:42.000000000","message":"agreed","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"1bdd54ffa415f75d5f569f8e65babed27cab64ea","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, image_id\u003dNone, session\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAARH%2F%2F2cE%3D","line":222,"updated":"2013-08-16 08:47:42.000000000","message":"Could you put the session keyword before image_id? The signature should match other driver\u0027s, although it is a keyword argument.","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1a049b3fad5bb7331dfb923becc44d85b934278f","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, image_id\u003dNone, session\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAARH%2F%2FzYc%3D","line":222,"in_reply_to":"AAAARH%2F%2F2cE%3D","updated":"2013-08-17 03:49:04.000000000","message":"As I commented in former PS, I personally prefer put \u0027session\u0027 param at last since this will keep consistent with other existing interfaces here (and DB drivers). So John probable you need change the DB drivers\u0027 stub but here. (https://review.openstack.org/#/c/37993/8/glance/db/sqlalchemy/api.py L1033, https://review.openstack.org/#/c/37993/8/glance/db/simple/api.py L646)","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"88d08bfcd2f37a3f65d4732f586c4c7b35967f64","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"@_get_client"},{"line_number":222,"context_line":"def user_get_storage_usage(client, owner_id, image_id\u003dNone, session\u003dNone):"},{"line_number":223,"context_line":"    return client.user_get_storage_usage(owner_id\u003downer_id, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAARn%2F%2F8%2Bw%3D","line":222,"in_reply_to":"AAAARH%2F%2FzYc%3D","updated":"2013-08-19 19:53:41.000000000","message":"Done","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"}],"glance/db/simple/api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \u0027locations\u0027: [],"},{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def log_call(func):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj7k%3D","line":36,"updated":"2013-07-29 06:59:34.000000000","message":"Unused variable?","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \u0027locations\u0027: [],"},{"line_number":34,"context_line":"}"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"CONF \u003d cfg.CONF"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def log_call(func):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZzs%3D","line":36,"in_reply_to":"AAAAQn%2F%2Fj7k%3D","updated":"2013-07-31 20:41:34.000000000","message":"Done","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    return False"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"def user_get_storage_usage(context, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":652,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner_id})"},{"line_number":653,"context_line":"    total \u003d 0"},{"line_number":654,"context_line":"    for image in images:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj7U%3D","line":651,"updated":"2013-07-29 06:59:34.000000000","message":"adding \u0027user_get_storage_usage\u0027 to glance.db.api.py as an interface stub?","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    return False"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"def user_get_storage_usage(context, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":652,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner_id})"},{"line_number":653,"context_line":"    total \u003d 0"},{"line_number":654,"context_line":"    for image in images:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYX0%3D","line":651,"in_reply_to":"AAAAQn%2F%2FZzQ%3D","updated":"2013-08-01 03:32:54.000000000","message":"I just think we\u0027d better adding \u0027user_get_storage_usage\u0027 to db/api.py, to make this function as an interface function.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    return False"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"def user_get_storage_usage(context, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":652,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner_id})"},{"line_number":653,"context_line":"    total \u003d 0"},{"line_number":654,"context_line":"    for image in images:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZzQ%3D","line":651,"in_reply_to":"AAAAQn%2F%2Fj7U%3D","updated":"2013-07-31 20:41:34.000000000","message":"I do not understand, can you explain the question?","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"    return [tag[\u0027value\u0027] for tag in tags]"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"def user_get_storage_usage(context, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":1030,"context_line":"    session \u003d session or _get_session()"},{"line_number":1031,"context_line":"    total_size \u003d _image_get_disk_usage_by_owner("},{"line_number":1032,"context_line":"        owner_id, session, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj7Q%3D","line":1029,"updated":"2013-07-29 06:59:34.000000000","message":"1. adding \u0027user_get_storage_usage\u0027 to glance.db.api.py as an interface stub?\n\n2. TBH, I\u0027m not sure we should involve \u0027locations\u0027 here still... IMHO we\u0027d better do that, since as we discussed once a location be added to Glance, it should be controlled/owned by Glance. So i think an image consumed storage space should equal (image size * image location amount). And in future, as we talked, quota should belongs to User and Storage (location scheme), this calculation approach can be migrated smoothly.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"    return [tag[\u0027value\u0027] for tag in tags]"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"def user_get_storage_usage(context, owner_id, session\u003dNone, image_id\u003dNone):"},{"line_number":1030,"context_line":"    session \u003d session or _get_session()"},{"line_number":1031,"context_line":"    total_size \u003d _image_get_disk_usage_by_owner("},{"line_number":1032,"context_line":"        owner_id, session, image_id\u003dimage_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYXs%3D","line":1029,"in_reply_to":"AAAAQn%2F%2Fj7Q%3D","updated":"2013-08-01 03:32:54.000000000","message":"1. I just think we\u0027d better adding \u0027user_get_storage_usage\u0027 to db/api.py, to make this function as an interface function.\n\n2. What\u0027s your thought about this question John? I think it is important for quota counting.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":682,"context_line":""},{"line_number":683,"context_line":"def _image_get_disk_usage_by_owner(owner, session, image_id\u003dNone):"},{"line_number":684,"context_line":"    query \u003d session.query(models.Image)"},{"line_number":685,"context_line":"    #query \u003d session.query(sqlalchemy.func.sum(models.Image.size))"},{"line_number":686,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":687,"context_line":"    images \u003d query.all()"},{"line_number":688,"context_line":"    total \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FF%2Bk%3D","line":685,"updated":"2013-08-07 11:43:11.000000000","message":"Would it be better to just get the size and the count of the image locations - by joining the ImageLocation table - directly from the query? Also, I guess you could filter images with size \u003e than 0 and with at least 1 location.\n\nThe above should return a list of (size, num_of_locations) and reduce the number of iterations and checks.\n\ntotal \u003d sum([size*count for size, count in results])\n\nI\u0027m not a sqlalchemy expert my self but it shouldn\u0027t be hard to do the above. I hope this link helps: \n\nhttp://docs.sqlalchemy.org/en/latest/orm/tutorial.html#building-a-relationship","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"69b87298b905feecb86e70470e73f2cfeabbaab1","unresolved":false,"context_lines":[{"line_number":682,"context_line":""},{"line_number":683,"context_line":"def _image_get_disk_usage_by_owner(owner, session, image_id\u003dNone):"},{"line_number":684,"context_line":"    query \u003d session.query(models.Image)"},{"line_number":685,"context_line":"    #query \u003d session.query(sqlalchemy.func.sum(models.Image.size))"},{"line_number":686,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":687,"context_line":"    images \u003d query.all()"},{"line_number":688,"context_line":"    total \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQ3%2F%2F6jQ%3D","line":685,"in_reply_to":"AAAAQn%2F%2FF%2Bk%3D","updated":"2013-08-13 01:58:01.000000000","message":"The filters make sense but I am not sure about the join.  It would make for some complicated less readable logic and I don\u0027t think it buys anything because either way it seems we have to iterate over the result set.","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2af629a71bfb693034f437d8404d407c8d299a60","unresolved":false,"context_lines":[{"line_number":686,"context_line":"def _image_get_disk_usage_by_owner(owner, session, image_id\u003dNone):"},{"line_number":687,"context_line":"    query \u003d session.query(models.Image)"},{"line_number":688,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0)"},{"line_number":690,"context_line":"    images \u003d query.all()"},{"line_number":691,"context_line":"    total \u003d 0"},{"line_number":692,"context_line":"    for i in images:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F6Rc%3D","line":689,"updated":"2013-08-13 04:54:37.000000000","message":"Miss skipping image for the counting? which id equal \u0027image_id\u0027 param.","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"a89dc4efab3ef1ad207766b46133d5a2e16bba5c","unresolved":false,"context_lines":[{"line_number":686,"context_line":"def _image_get_disk_usage_by_owner(owner, session, image_id\u003dNone):"},{"line_number":687,"context_line":"    query \u003d session.query(models.Image)"},{"line_number":688,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0)"},{"line_number":690,"context_line":"    images \u003d query.all()"},{"line_number":691,"context_line":"    total \u003d 0"},{"line_number":692,"context_line":"    for i in images:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F548%3D","line":689,"in_reply_to":"AAAAQ3%2F%2F6Rc%3D","updated":"2013-08-13 07:37:42.000000000","message":"yes! thank you, i messed that up on my last revision.  I need a test for that.","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"28b591ad7cbb09a9d8c1451be91a922a87dd9c79","unresolved":false,"context_lines":[{"line_number":691,"context_line":"    total \u003d 0"},{"line_number":692,"context_line":"    for i in images:"},{"line_number":693,"context_line":"        if i.locations:"},{"line_number":694,"context_line":"            total \u003d total + (i.size * len(i.locations))"},{"line_number":695,"context_line":"    return total"},{"line_number":696,"context_line":""},{"line_number":697,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F4u4%3D","line":694,"updated":"2013-08-13 13:55:15.000000000","message":"Follow-up of our discussion in the previous PS:\n\nThe benefit of using a join and getting just the fields\u0027 values you care off is that we reduce the number of queries being executed. When i.location is accessed for the first time, sqlalchemy fires a new query to fetch the locations of that image regardless it has locations or not.","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"6f4b88740f7b36a9d5cdd837d7eb06cb61d89b1c","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                          sqlalchemy.func.count(models.Image.locations))"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":690,"context_line":"    query \u003d query.filter(models.Image.id \u003d\u003d models.ImageLocation.image_id)"},{"line_number":691,"context_line":"    query \u003d query.filter(models.Image.id !\u003d image_id)"},{"line_number":692,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0).group_by(models.Image.id)"},{"line_number":693,"context_line":"    images \u003d query.all()"},{"line_number":694,"context_line":"    total \u003d sum([size * count for size, count in images])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQ3%2F%2F2qQ%3D","line":691,"updated":"2013-08-13 22:14:14.000000000","message":"I\u0027m not sure I understand the idea of excluding a given image id. Can you explain that some more?","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"1bdd54ffa415f75d5f569f8e65babed27cab64ea","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                          sqlalchemy.func.count(models.Image.locations))"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":690,"context_line":"    query \u003d query.filter(models.Image.id \u003d\u003d models.ImageLocation.image_id)"},{"line_number":691,"context_line":"    query \u003d query.filter(models.Image.id !\u003d image_id)"},{"line_number":692,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0).group_by(models.Image.id)"},{"line_number":693,"context_line":"    images \u003d query.all()"},{"line_number":694,"context_line":"    total \u003d sum([size * count for size, count in images])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAARH%2F%2F2aw%3D","line":691,"updated":"2013-08-16 08:47:42.000000000","message":"Should we exclude this filter if image_id is None? Although image_id is indexed, this would avoid unneeded filters in the database side.","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"bee49fd99e4091ca5516e8e8b36df82193ee52ce","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                          sqlalchemy.func.count(models.Image.locations))"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":690,"context_line":"    query \u003d query.filter(models.Image.id \u003d\u003d models.ImageLocation.image_id)"},{"line_number":691,"context_line":"    query \u003d query.filter(models.Image.id !\u003d image_id)"},{"line_number":692,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0).group_by(models.Image.id)"},{"line_number":693,"context_line":"    images \u003d query.all()"},{"line_number":694,"context_line":"    total \u003d sum([size * count for size, count in images])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAQ3%2F%2F2pU%3D","line":691,"in_reply_to":"AAAAQ3%2F%2F2qQ%3D","updated":"2013-08-13 22:17:39.000000000","message":"This is for the case of an update.  If you set the image size when creating the image and now you are going to upload the image we dont want that size to count against your quota twice.","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1a049b3fad5bb7331dfb923becc44d85b934278f","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                          sqlalchemy.func.count(models.Image.locations))"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":690,"context_line":"    query \u003d query.filter(models.Image.id \u003d\u003d models.ImageLocation.image_id)"},{"line_number":691,"context_line":"    query \u003d query.filter(models.Image.id !\u003d image_id)"},{"line_number":692,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0).group_by(models.Image.id)"},{"line_number":693,"context_line":"    images \u003d query.all()"},{"line_number":694,"context_line":"    total \u003d sum([size * count for size, count in images])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAARH%2F%2FzYY%3D","line":691,"in_reply_to":"AAAARH%2F%2F2aw%3D","updated":"2013-08-17 03:49:04.000000000","message":"+1 to flper87\u0027s comments.","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"88d08bfcd2f37a3f65d4732f586c4c7b35967f64","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                          sqlalchemy.func.count(models.Image.locations))"},{"line_number":689,"context_line":"    query \u003d query.filter(models.Image.owner \u003d\u003d owner)"},{"line_number":690,"context_line":"    query \u003d query.filter(models.Image.id \u003d\u003d models.ImageLocation.image_id)"},{"line_number":691,"context_line":"    query \u003d query.filter(models.Image.id !\u003d image_id)"},{"line_number":692,"context_line":"    query \u003d query.filter(models.Image.size \u003e 0).group_by(models.Image.id)"},{"line_number":693,"context_line":"    images \u003d query.all()"},{"line_number":694,"context_line":"    total \u003d sum([size * count for size, count in images])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAARn%2F%2F8%2Bk%3D","line":691,"in_reply_to":"AAAARH%2F%2FzYY%3D","updated":"2013-08-19 19:53:41.000000000","message":"Done","commit_id":"57ef0142a68bd1fac781d4767c83095cca418b97"}],"glance/quota/__init__.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2af629a71bfb693034f437d8404d407c8d299a60","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012, Red Hat, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F6Qc%3D","line":3,"updated":"2013-08-13 04:54:37.000000000","message":"2013","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"2af629a71bfb693034f437d8404d407c8d299a60","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if remaining is not None:"},{"line_number":60,"context_line":"            # NOTE(jbresnah) we are trying to enforce a quota, put a limit"},{"line_number":61,"context_line":"            # reader on the data"},{"line_number":62,"context_line":"            data \u003d utils.LimitingReader(data, remaining)"},{"line_number":63,"context_line":"        self.image.set_data(data, size\u003dsize)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQ3%2F%2F6QY%3D","line":62,"updated":"2013-08-13 04:54:37.000000000","message":"Also, please check my inline comment in https://review.openstack.org/#/c/37993/7/glance/api/v1/images.py","commit_id":"b1340cf0e48e47fba6fe548365977f4c52ce711c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"6a5320132cd9512dc361069ab9ecdd5b779cee4c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        # the quota after the upload and thus after we know the size"},{"line_number":66,"context_line":"        glance.api.common.check_quota("},{"line_number":67,"context_line":"            self.context, self.image.size, self.db_api,"},{"line_number":68,"context_line":"            image_id\u003dself.image.image_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7ds%3D","line":68,"updated":"2013-08-20 04:55:20.000000000","message":"I\u0027m wondering if the exception be raised here, since we have not remove the image content from store even we not save the image metadata record to DB table, seems we will leak the all bits from the backend.\n\nCorrect me if i\u0027m wrong. Also I post the similar comment in \u0027glance/api/v1/upload_utils.py\u0027  L109 (#3 point).","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"78863fb129ff0377e74632a451de60d92801ac94","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        # the quota after the upload and thus after we know the size"},{"line_number":66,"context_line":"        glance.api.common.check_quota("},{"line_number":67,"context_line":"            self.context, self.image.size, self.db_api,"},{"line_number":68,"context_line":"            image_id\u003dself.image.image_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAARn%2F%2F7Po%3D","line":68,"in_reply_to":"AAAARn%2F%2F7ds%3D","updated":"2013-08-20 06:32:01.000000000","message":"If I understand correctly, I think we are ok with v2.  The reason is that the record is created and uploaded in separate steps.  So if anything goes wrong with the upload the record remains in a non-active state.  It is up to the user to remove it.","commit_id":"ef7268db4f9319cc9f5968dfa4ad9d87bd56dc5d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4384622d19fbd5aa2a6487739c329265a055628a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def __getitem__(self, *args, **kwargs):"},{"line_number":72,"context_line":"        return self.locations.__getitem__(*args, **kwargs)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def __iadd__(self, *args, **kwargs):"},{"line_number":75,"context_line":"        return self.locations.__iadd__(*args, **kwargs)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __iter__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAASX%2F%2F5go%3D","line":74,"updated":"2013-08-24 03:29:42.000000000","message":"IMO, we need call _check_quota() at here also.","commit_id":"a61462740b81fab818ad82ed787a3e79690a72e8"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"e07fa57c8e654858e21a60b7a78a529adbf28857","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def __getitem__(self, *args, **kwargs):"},{"line_number":72,"context_line":"        return self.locations.__getitem__(*args, **kwargs)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def __iadd__(self, *args, **kwargs):"},{"line_number":75,"context_line":"        return self.locations.__iadd__(*args, **kwargs)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __iter__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAASX%2F%2F5Qk%3D","line":74,"in_reply_to":"AAAASX%2F%2F5go%3D","updated":"2013-08-24 06:41:34.000000000","message":"Done","commit_id":"a61462740b81fab818ad82ed787a3e79690a72e8"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"4384622d19fbd5aa2a6487739c329265a055628a","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def __len__(self, *args, **kwargs):"},{"line_number":81,"context_line":"        return self.locations.__len__(*args, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __setitem__(self, *args, **kwargs):"},{"line_number":84,"context_line":"        return self.locations.__setitem__(*args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def count(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAASX%2F%2F5gg%3D","line":83,"updated":"2013-08-24 03:29:42.000000000","message":"IMO, we\u0027d better call _check_quota() at here also.","commit_id":"a61462740b81fab818ad82ed787a3e79690a72e8"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"96754328a723716069d8228d60f4d1e3d79d3e1c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def __len__(self, *args, **kwargs):"},{"line_number":81,"context_line":"        return self.locations.__len__(*args, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __setitem__(self, *args, **kwargs):"},{"line_number":84,"context_line":"        return self.locations.__setitem__(*args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def count(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAASX%2F%2F4aA%3D","line":83,"in_reply_to":"AAAASX%2F%2F4w8%3D","updated":"2013-08-25 03:00:35.000000000","message":"Yes, so in above comment I said we\u0027d better add the check but not must do that. The reason for me is that if we add that, in future when we allow each location has different size then we will not need change this code again. But anyway, it\u0027s work for now.","commit_id":"a61462740b81fab818ad82ed787a3e79690a72e8"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"44c4906fb0d4dd691091685686934dce3a5a4889","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def __len__(self, *args, **kwargs):"},{"line_number":81,"context_line":"        return self.locations.__len__(*args, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __setitem__(self, *args, **kwargs):"},{"line_number":84,"context_line":"        return self.locations.__setitem__(*args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def count(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAASX%2F%2F4w8%3D","line":83,"in_reply_to":"AAAASX%2F%2F5Qg%3D","updated":"2013-08-24 18:19:34.000000000","message":"On further investigation I think we are ok on this one.  You cannot use __setitem__ in a list to add more locations, only replace existing ones.  Because all locations are defined to have the same size this does not need to be checked.","commit_id":"a61462740b81fab818ad82ed787a3e79690a72e8"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"e07fa57c8e654858e21a60b7a78a529adbf28857","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def __len__(self, *args, **kwargs):"},{"line_number":81,"context_line":"        return self.locations.__len__(*args, **kwargs)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def __setitem__(self, *args, **kwargs):"},{"line_number":84,"context_line":"        return self.locations.__setitem__(*args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def count(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAASX%2F%2F5Qg%3D","line":83,"in_reply_to":"AAAASX%2F%2F5gg%3D","updated":"2013-08-24 06:41:34.000000000","message":"Done","commit_id":"a61462740b81fab818ad82ed787a3e79690a72e8"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"0a7dda11b70f81d75111245a7eb6a00a3ecdb602","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012, Red Hat, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAASX%2F%2F3zk%3D","line":3,"updated":"2013-08-25 17:40:14.000000000","message":"2013?","commit_id":"e7c5b2ebc62bd460fe984ea946a345f037e43a12"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"b2043b03520bb1e3bd14029777e7343c86314422","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012, Red Hat, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAASn%2F%2F%2By4%3D","line":3,"updated":"2013-08-27 08:35:46.000000000","message":"2013*","commit_id":"a072dee0f052915b01cf063d46655ff118d28f92"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"7027c499043680552694d8809742172c366a248d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012, Red Hat, Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAASn%2F%2F%2Bt4%3D","line":3,"in_reply_to":"AAAASn%2F%2F%2By4%3D","updated":"2013-08-27 08:57:08.000000000","message":"Done","commit_id":"a072dee0f052915b01cf063d46655ff118d28f92"}],"glance/registry/api/v1/images.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        except exception.StorageQuotaFull:"},{"line_number":459,"context_line":"            msg \u003d _(\"Image %(id)s exceeds the storage quota\")"},{"line_number":460,"context_line":"            LOG.info(msg % {\u0027id\u0027: id})"},{"line_number":461,"context_line":"            raise exc.HTTPForbidden(body\u003d\u0027Image not found\u0027,"},{"line_number":462,"context_line":"                                    request\u003dreq,"},{"line_number":463,"context_line":"                                    content_type\u003d\u0027text/plain\u0027)"},{"line_number":464,"context_line":"        except exception.ForbiddenPublicImage:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj7E%3D","line":461,"updated":"2013-07-29 06:59:34.000000000","message":"1. wrong message in body, C\u0026P issue :)\n\n2. I\u0027m confused, which function call in above can trigger this exception?","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"ad6bc69f8fbf4f01fbd7b82368dd6ebe1cb11b5f","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        except exception.StorageQuotaFull:"},{"line_number":459,"context_line":"            msg \u003d _(\"Image %(id)s exceeds the storage quota\")"},{"line_number":460,"context_line":"            LOG.info(msg % {\u0027id\u0027: id})"},{"line_number":461,"context_line":"            raise exc.HTTPForbidden(body\u003d\u0027Image not found\u0027,"},{"line_number":462,"context_line":"                                    request\u003dreq,"},{"line_number":463,"context_line":"                                    content_type\u003d\u0027text/plain\u0027)"},{"line_number":464,"context_line":"        except exception.ForbiddenPublicImage:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FYW8%3D","line":461,"in_reply_to":"AAAAQn%2F%2FZyk%3D","updated":"2013-08-01 03:32:54.000000000","message":"John could you pls tell me the answer for my #2 question in above comments? thanks.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        except exception.StorageQuotaFull:"},{"line_number":459,"context_line":"            msg \u003d _(\"Image %(id)s exceeds the storage quota\")"},{"line_number":460,"context_line":"            LOG.info(msg % {\u0027id\u0027: id})"},{"line_number":461,"context_line":"            raise exc.HTTPForbidden(body\u003d\u0027Image not found\u0027,"},{"line_number":462,"context_line":"                                    request\u003dreq,"},{"line_number":463,"context_line":"                                    content_type\u003d\u0027text/plain\u0027)"},{"line_number":464,"context_line":"        except exception.ForbiddenPublicImage:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZyk%3D","line":461,"in_reply_to":"AAAAQn%2F%2Fj7E%3D","updated":"2013-07-31 20:41:34.000000000","message":"Done","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"}],"glance/registry/client/v1/api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":190,"context_line":"def get_remaining_quota(context):"},{"line_number":191,"context_line":"    LOG.debug(_(\"Looking up the users remaining quota...\"))"},{"line_number":192,"context_line":"    c \u003d get_registry_client(context)"},{"line_number":193,"context_line":"    return c.add_image(image_meta)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"def update_image_metadata(context, image_id, image_meta,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj6Q%3D","line":193,"updated":"2013-07-29 06:59:34.000000000","message":"1. Who use this function? Although I\u0027d like V1 api support quota mechanism also by adding this call to V1 image controller somewhere, but from your commit message seems this function is useless in this patch.\n\n2. I\u0027m confused on why you call \u0027add_image()\u0027 here?","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":190,"context_line":"def get_remaining_quota(context):"},{"line_number":191,"context_line":"    LOG.debug(_(\"Looking up the users remaining quota...\"))"},{"line_number":192,"context_line":"    c \u003d get_registry_client(context)"},{"line_number":193,"context_line":"    return c.add_image(image_meta)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"def update_image_metadata(context, image_id, image_meta,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZyE%3D","line":193,"in_reply_to":"AAAAQn%2F%2Fj6Q%3D","updated":"2013-07-31 20:41:34.000000000","message":"This is cruft, sorry.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"}],"glance/store/__init__.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"8ef15811060677b9e59fd7e214e8262b70fc04f8","unresolved":false,"context_lines":[{"line_number":649,"context_line":"            if remaining is not None:"},{"line_number":650,"context_line":"                # we are trying to enforce a quota, put a limit reader"},{"line_number":651,"context_line":"                # on the data"},{"line_number":652,"context_line":"                data \u003d utils.LimitingReader(data, remaining)"},{"line_number":653,"context_line":"        else:"},{"line_number":654,"context_line":"            glance.api.common.check_quota("},{"line_number":655,"context_line":"                self.context, size, self.db_api, image_id\u003dself.image.image_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj3c%3D","line":652,"updated":"2013-07-29 07:09:43.000000000","message":"V2 image handler should take care \u0027ImagesizeLimitExceeded\u0027 exception. (\u0027upload()\u0027 action handler in https://review.openstack.org/#/c/37993/4/glance/api/v2/image_data.py)","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":649,"context_line":"            if remaining is not None:"},{"line_number":650,"context_line":"                # we are trying to enforce a quota, put a limit reader"},{"line_number":651,"context_line":"                # on the data"},{"line_number":652,"context_line":"                data \u003d utils.LimitingReader(data, remaining)"},{"line_number":653,"context_line":"        else:"},{"line_number":654,"context_line":"            glance.api.common.check_quota("},{"line_number":655,"context_line":"                self.context, size, self.db_api, image_id\u003dself.image.image_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZqY%3D","line":652,"in_reply_to":"AAAAQn%2F%2Fj3c%3D","updated":"2013-07-31 20:41:34.000000000","message":"Done","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"577e51f90b226a3c360d1265cbab7756ac4e07e4","unresolved":false,"context_lines":[{"line_number":652,"context_line":"                data \u003d utils.LimitingReader(data, remaining)"},{"line_number":653,"context_line":"        else:"},{"line_number":654,"context_line":"            glance.api.common.check_quota("},{"line_number":655,"context_line":"                self.context, size, self.db_api, image_id\u003dself.image.image_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        location, size, checksum, loc_meta \u003d self.store_api.add_to_backend("},{"line_number":658,"context_line":"                self.context, CONF.default_store,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fj8M%3D","line":655,"updated":"2013-07-29 06:59:34.000000000","message":"TBH, I think we should not trust \u0027size\u0027 parameter, actually store drivers also not use that for data reading. Is it an option if we just always using LimitingReader at here?\n\nOf cause, we can put \u0027check_quota\u0027 checking here, but IMO it should LimitingReader-based.","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"f5ffcf76554fd30d532c9c8a5142e5b0cd253dff","unresolved":false,"context_lines":[{"line_number":652,"context_line":"                data \u003d utils.LimitingReader(data, remaining)"},{"line_number":653,"context_line":"        else:"},{"line_number":654,"context_line":"            glance.api.common.check_quota("},{"line_number":655,"context_line":"                self.context, size, self.db_api, image_id\u003dself.image.image_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        location, size, checksum, loc_meta \u003d self.store_api.add_to_backend("},{"line_number":658,"context_line":"                self.context, CONF.default_store,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FZx0%3D","line":655,"in_reply_to":"AAAAQn%2F%2Fj8M%3D","updated":"2013-07-31 20:41:34.000000000","message":"agreed","commit_id":"c4899b728e823093a725b006b0dd8562e99f90b6"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"ca77c3b1d370336ce862a6949ffa3d00d1689e69","unresolved":false,"context_lines":[{"line_number":649,"context_line":"        glance.api.common.check_quota("},{"line_number":650,"context_line":"            self.context, size, self.db_api, image_id\u003dself.image.image_id)"},{"line_number":651,"context_line":"        if remaining is not None:"},{"line_number":652,"context_line":"            # we are trying to enforce a quota, put a limit reader"},{"line_number":653,"context_line":"            # on the data"},{"line_number":654,"context_line":"            data \u003d utils.LimitingReader(data, remaining)"},{"line_number":655,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2FF%2BU%3D","line":652,"updated":"2013-08-07 11:43:11.000000000","message":"pls, addd NOTE() here","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"69b87298b905feecb86e70470e73f2cfeabbaab1","unresolved":false,"context_lines":[{"line_number":649,"context_line":"        glance.api.common.check_quota("},{"line_number":650,"context_line":"            self.context, size, self.db_api, image_id\u003dself.image.image_id)"},{"line_number":651,"context_line":"        if remaining is not None:"},{"line_number":652,"context_line":"            # we are trying to enforce a quota, put a limit reader"},{"line_number":653,"context_line":"            # on the data"},{"line_number":654,"context_line":"            data \u003d utils.LimitingReader(data, remaining)"},{"line_number":655,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQ3%2F%2F6kg%3D","line":652,"in_reply_to":"AAAAQn%2F%2FF%2BU%3D","updated":"2013-08-13 01:58:01.000000000","message":"Done","commit_id":"de808d9f6ee5f4969a1ac3ce4c48792a0421df88"}],"glance/tests/functional/v2/test_images.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1b4d88d102b2ff883b3dde44f10b6bdf1f14503e","unresolved":false,"context_lines":[{"line_number":1155,"context_line":""},{"line_number":1156,"context_line":"        path \u003d self._url(\u0027/v2/images/%s\u0027 % image_id)"},{"line_number":1157,"context_line":"        response \u003d requests.delete(path, headers\u003dself._headers())"},{"line_number":1158,"context_line":"        self.assertEqual(204, response.status_code)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARn%2F%2F1dU%3D","line":1158,"updated":"2013-08-21 11:26:17.000000000","message":"The image should still under \u0027queued\u0027 status, right? Add a assertion here?","commit_id":"bfac25aedcaac74bb98d741822697f4b990fa131"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"0a7dda11b70f81d75111245a7eb6a00a3ecdb602","unresolved":false,"context_lines":[{"line_number":1075,"context_line":"        self.stop_servers()"},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"class TestImages(functional.FunctionalTest):"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def setUp(self):"},{"line_number":1081,"context_line":"        super(TestImages, self).setUp()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAASX%2F%2F3zg%3D","line":1078,"updated":"2013-08-25 17:40:14.000000000","message":"Hey there is already a class called TestImages in the top of the file. Am I missing something?","commit_id":"e7c5b2ebc62bd460fe984ea946a345f037e43a12"}],"glance/tests/unit/test_quota.py":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"b2043b03520bb1e3bd14029777e7343c86314422","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \u0027License\u0027); you may"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAASn%2F%2F%2Byw%3D","line":1,"updated":"2013-08-27 08:35:46.000000000","message":"Copyright 2013, Red Hat, Inc.","commit_id":"a072dee0f052915b01cf063d46655ff118d28f92"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"7027c499043680552694d8809742172c366a248d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \u0027License\u0027); you may"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAASn%2F%2F%2BtQ%3D","line":1,"in_reply_to":"AAAASn%2F%2F%2Byw%3D","updated":"2013-08-27 08:57:08.000000000","message":"Done","commit_id":"a072dee0f052915b01cf063d46655ff118d28f92"}],"glance/tests/unit/v1/test_api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1b4d88d102b2ff883b3dde44f10b6bdf1f14503e","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            req.headers[k] \u003d v"},{"line_number":355,"context_line":"        req.body \u003d \u0027X\u0027 * (quota + 1)"},{"line_number":356,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":357,"context_line":"        self.assertEquals(res.status_int, 400)"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def test_add_image_size_data_exceed_quota(self):"},{"line_number":360,"context_line":"        quota \u003d 500"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARn%2F%2F1b0%3D","line":357,"updated":"2013-08-21 11:26:17.000000000","message":"Probable this is a normal situation, but seems it\u0027s strange. If client give a exceed quota value by header then glance-api return 400, but if post a image bits which length exceed quota then server return 413 (like follow test case).","commit_id":"bfac25aedcaac74bb98d741822697f4b990fa131"}],"glance/tests/unit/v2/test_image_data_resource.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"1b4d88d102b2ff883b3dde44f10b6bdf1f14503e","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.image_repo.result \u003d image"},{"line_number":212,"context_line":"        self.controller.upload(request, unit_test_utils.UUID2, \u0027YYYY\u0027, 4)"},{"line_number":213,"context_line":"        self.assertEqual(image.data, \u0027YYYY\u0027)"},{"line_number":214,"context_line":"        self.assertEqual(image.size, 4)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _test_upload_download_prepare_notification(self):"},{"line_number":217,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAARn%2F%2F1Zo%3D","line":214,"updated":"2013-08-21 11:26:17.000000000","message":"I\u0027m confused at here, why user_storage_quota option is \u00271\u0027 but controller allow upload a image which content length is \u00274\u0027 and without exception throw out?","commit_id":"bfac25aedcaac74bb98d741822697f4b990fa131"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"9125562e000c0626c007a8e7244665c7cfd68ff7","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self.image_repo.result \u003d image"},{"line_number":205,"context_line":"        self.controller.upload(request, unit_test_utils.UUID2, \u0027YYYY\u0027, 4)"},{"line_number":206,"context_line":"        self.assertEqual(image.data, \u0027YYYY\u0027)"},{"line_number":207,"context_line":"        self.assertEqual(image.size, 4)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _test_upload_download_prepare_notification(self):"},{"line_number":210,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAARn%2F%2FxCs%3D","line":207,"updated":"2013-08-22 04:31:58.000000000","message":"John TBH I\u0027m confused at here still, why user_storage_quota option is \u00271\u0027 but controller allow upload a image which content length is \u00274\u0027 and without exception throw out? Can you help explain it to me? thanks.","commit_id":"9140663f1d75faeae761434a0f5b6dc2f432fb38"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"dc746b7d63c8ed1c1b89680a14237677a449201f","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.image_repo.result \u003d image"},{"line_number":130,"context_line":"        self.controller.upload(request, unit_test_utils.UUID2, \u0027YYYY\u0027, 4)"},{"line_number":131,"context_line":"        self.assertEqual(image.data, \u0027YYYY\u0027)"},{"line_number":132,"context_line":"        self.assertEqual(image.size, 4)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_upload_status(self):"},{"line_number":135,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAARn%2F%2FwKA%3D","side":"PARENT","line":132,"updated":"2013-08-22 09:30:09.000000000","message":"Just remove this case but not add a new case for quota?","commit_id":"f9ea0ac3b23d0f7edc21df748d45866b64743c2a"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"8e357db479c002149cd58ed942eae5a8f345f30d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.image_repo.result \u003d image"},{"line_number":130,"context_line":"        self.controller.upload(request, unit_test_utils.UUID2, \u0027YYYY\u0027, 4)"},{"line_number":131,"context_line":"        self.assertEqual(image.data, \u0027YYYY\u0027)"},{"line_number":132,"context_line":"        self.assertEqual(image.size, 4)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_upload_status(self):"},{"line_number":135,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAARn%2F%2FuRA%3D","side":"PARENT","line":132,"in_reply_to":"AAAARn%2F%2FwKA%3D","updated":"2013-08-22 17:47:57.000000000","message":"I added this file to replace it: glance/tests/unit/test_quota.py.  This is a much better way to do the unit test.  The logic here was never even entering the quota module.","commit_id":"f9ea0ac3b23d0f7edc21df748d45866b64743c2a"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"4bd9546cc08a4c110c2c92a36af28408ea28be86","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.image_repo.result \u003d exception.Forbidden()"},{"line_number":123,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden, self.controller.download,"},{"line_number":124,"context_line":"                          request, uuidutils.generate_uuid())"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_upload(self):"},{"line_number":127,"context_line":"        request \u003d unit_test_utils.get_fake_request()"},{"line_number":128,"context_line":"        image \u003d FakeImage(\u0027abcd\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2F1fY%3D","side":"PARENT","line":125,"updated":"2013-08-29 00:04:02.000000000","message":"Just curious, why is this removed?","commit_id":"f9ea0ac3b23d0f7edc21df748d45866b64743c2a"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"cc62613cc66ae0dcdb68afe3a99328f58b9dcd40","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.image_repo.result \u003d exception.Forbidden()"},{"line_number":123,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden, self.controller.download,"},{"line_number":124,"context_line":"                          request, uuidutils.generate_uuid())"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_upload(self):"},{"line_number":127,"context_line":"        request \u003d unit_test_utils.get_fake_request()"},{"line_number":128,"context_line":"        image \u003d FakeImage(\u0027abcd\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAASn%2F%2F1GY%3D","side":"PARENT","line":125,"in_reply_to":"AAAASn%2F%2F1fY%3D","updated":"2013-08-29 02:52:39.000000000","message":"In an earlier patch I added a test here that was wrong.  It looks like I was overzealous in removing it.  Thanks for the catch!","commit_id":"f9ea0ac3b23d0f7edc21df748d45866b64743c2a"}]}
