)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"2fbba5cfc36ee03223d81ce739d47f38811a21d5","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"DocImpact"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"blueprint glance-basic-quotas"},{"line_number":17,"context_line":"Change-Id: Ie03e3d14fc800ebe3e3233dd83e44182dd9e4dee"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba8a016a_69c0a950","line":16,"updated":"2015-11-19 21:52:59.000000000","message":"Gerrit\u0027s automatic link shows no results for this. Is this blueprint not yet written?","commit_id":"195134a9546bf3aec3b9837dfad737a38f2c416a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"f51a2148e2b5c2a189eaf53d99848115bbf3f6c5","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"DocImpact"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"blueprint glance-basic-quotas"},{"line_number":17,"context_line":"Change-Id: Ie03e3d14fc800ebe3e3233dd83e44182dd9e4dee"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba8a016a_c6c898aa","line":16,"in_reply_to":"ba8a016a_69c0a950","updated":"2015-11-20 01:24:59.000000000","message":"The bp is Implemented. You could click \"List all blueprints\" in Launchpad to find it.","commit_id":"195134a9546bf3aec3b9837dfad737a38f2c416a"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"02224ef6a13bfb86ad01bcaeeb879fc83b48ef1c","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Closes-bug: #1520398"},{"line_number":17,"context_line":"blueprint glance-basic-quotas"},{"line_number":18,"context_line":"Change-Id: Ie03e3d14fc800ebe3e3233dd83e44182dd9e4dee"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9a8ffd7b_698296ca","line":18,"updated":"2015-12-01 11:01:24.000000000","message":"hi,\n\nBlueprint is not traceable, IMO it will be better to remove it from commit message as bug is proposed as lite-spec.","commit_id":"4cd2c24e3d4597428d8ca6a26bf93dce72aaabc3"}],"etc/glance-api.conf":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7458dbd5e7a6b6b7534fa4c1817d67b83d5d10a4","unresolved":false,"context_lines":[{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every user can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited.\""},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":7,"id":"ba8a016a_3152d814","line":92,"updated":"2015-11-16 15:58:23.000000000","message":"Don\u0027t think you need the \" at the end of the line","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"37677162b23b4e5eabe014ccff9dd00c477878fd","unresolved":false,"context_lines":[{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every user can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited.\""},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":7,"id":"ba8a016a_7e7c9372","line":92,"in_reply_to":"ba8a016a_3152d814","updated":"2015-11-17 01:40:24.000000000","message":"Done","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":17116,"name":"Niall Bunting","email":"niall.bunting@hpe.com","username":"NiallBunting"},"change_message_id":"982d099834688f0621d3b380fb7f49608bb90bf8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"# (string value)"},{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every user can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""}],"source_content_type":"text/plain","patch_set":21,"id":"7a5de9d1_514e1170","line":91,"range":{"start_line":91,"start_character":52,"end_line":91,"end_character":56},"updated":"2016-01-29 10:07:56.000000000","message":"\u0027user\u0027 is used here.","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a8f217ed86963f0020ab710c5acf8d3f4a7b8b57","unresolved":false,"context_lines":[{"line_number":88,"context_line":"# (string value)"},{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every user can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""}],"source_content_type":"text/plain","patch_set":21,"id":"7a5de9d1_c37f7015","line":91,"range":{"start_line":91,"start_character":52,"end_line":91,"end_character":56},"in_reply_to":"7a5de9d1_514e1170","updated":"2016-01-30 02:20:35.000000000","message":"Yes, should be fix here as well.","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every project can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":22,"id":"fa0719c6_4fb85f75","line":92,"range":{"start_line":92,"start_character":21,"end_line":92,"end_character":30},"updated":"2016-03-24 14:11:45.000000000","message":"According to the code, a negative value is also allowed, so maybe you could be a bite more precise and write \"A value of 0 or less means unlimited\".","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"043fd284d67566acea5ae4f95f2e2bddd850f5b1","unresolved":false,"context_lines":[{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every project can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":22,"id":"da0c15f0_44b73886","line":92,"range":{"start_line":92,"start_character":21,"end_line":92,"end_character":30},"in_reply_to":"da0c15f0_f1c45193","updated":"2016-03-26 01:18:57.000000000","message":"@Cyril, I add the min\u003d0 in the config option. So maybe it\u0027s ok here now?","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"ac4fdf88ba747864cb94e0ec5fe438d69e06f49f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every project can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":22,"id":"da0c15f0_f1c45193","line":92,"range":{"start_line":92,"start_character":21,"end_line":92,"end_character":30},"in_reply_to":"fa0719c6_4fb85f75","updated":"2016-03-25 22:48:19.000000000","message":"Good catch, but it would be even better if we rejected the negative values.","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"2136daeb6b7649631a5b44a6666d027dafcb89b5","unresolved":false,"context_lines":[{"line_number":88,"context_line":"# (string value)"},{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every project can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":23,"id":"da0c15f0_4f10e4a8","line":92,"range":{"start_line":91,"start_character":0,"end_line":92,"end_character":31},"updated":"2016-03-27 09:36:31.000000000","message":"nit: add (integer value)","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1ae21a7c41f7347fed98db9517c5c3cd3c020cea","unresolved":false,"context_lines":[{"line_number":88,"context_line":"# (string value)"},{"line_number":89,"context_line":"#user_storage_quota \u003d 0"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# This value is the max number of images that every project can create."},{"line_number":92,"context_line":"# A value of 0 means unlimited."},{"line_number":93,"context_line":"#user_image_number_quota \u003d 0"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Deploy the v1 OpenStack Images API. (boolean value)"}],"source_content_type":"text/plain","patch_set":23,"id":"da0c15f0_f2eba076","line":92,"range":{"start_line":91,"start_character":0,"end_line":92,"end_character":31},"in_reply_to":"da0c15f0_4f10e4a8","updated":"2016-03-27 14:22:15.000000000","message":"Thanks, I\u0027ll update later.","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"}],"glance/api/common.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"},{"line_number":202,"context_line":"        raise exception.ImageNumberQuotaFull()"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_6c19c5d6","line":201,"updated":"2015-12-21 03:52:31.000000000","message":"(nit): Generally, maximum means the value is acceptable, so I think we should use \u003e instead of \u003e\u003d at here, unless i missed something.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"},{"line_number":202,"context_line":"        raise exception.ImageNumberQuotaFull()"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_0d9cb85b","line":201,"in_reply_to":"3a7e1126_6c19c5d6","updated":"2015-12-21 08:16:56.000000000","message":"number_usage here means the number of images which are already saved in db. So if this value equals to maximum, the new request to create an image should raise ImageNumberQuotaFull.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":17116,"name":"Niall Bunting","email":"niall.bunting@hpe.com","username":"NiallBunting"},"change_message_id":"45cc09f64d9cbb4694f67b676f3d589605e5b807","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    :return:"},{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_e3f3e808","line":198,"range":{"start_line":198,"start_character":7,"end_line":198,"end_character":19},"updated":"2016-01-28 13:45:12.000000000","message":"Could a user think that a negative number in no images?","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"767ed37aac23603d423c64c04472968a1a3a5f4f","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    :return:"},{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_9e9ca6c1","line":198,"range":{"start_line":198,"start_character":7,"end_line":198,"end_character":19},"in_reply_to":"7a5de9d1_e3f3e808","updated":"2016-01-29 02:36:10.000000000","message":"The reason I did here is to keep the same with\nhttps://github.com/openstack/glance/blob/master/glance/api/common.py#L132\n\nI prefer 0 is forbidden but maybe it will lead different behavior.","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"409971cada7c6da79caca716195aa9529f0d3144","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"},{"line_number":202,"context_line":"        raise exception.ImageNumberQuotaFull(limit\u003dmaximum)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_d1440d4b","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":14},"updated":"2016-03-25 20:19:08.000000000","message":"Should we throw an error here or log that they have an invalid configuration?","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"043fd284d67566acea5ae4f95f2e2bddd850f5b1","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"},{"line_number":202,"context_line":"        raise exception.ImageNumberQuotaFull(limit\u003dmaximum)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da0c15f0_64acfc35","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":14},"in_reply_to":"da0c15f0_36599f5b","updated":"2016-03-26 01:18:57.000000000","message":"Done","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"ac4fdf88ba747864cb94e0ec5fe438d69e06f49f","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003c\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"},{"line_number":201,"context_line":"    if number_usage \u003e\u003d maximum:"},{"line_number":202,"context_line":"        raise exception.ImageNumberQuotaFull(limit\u003dmaximum)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da0c15f0_36599f5b","line":199,"range":{"start_line":199,"start_character":8,"end_line":199,"end_character":14},"in_reply_to":"fa0719c6_d1440d4b","updated":"2016-03-25 22:48:19.000000000","message":"I think this is OK, it means \"unlimited\".\n\nI\u0027d prefer that \u0027unlimited\u0027 \u003d\u003d 0 and negative values be an error.  If min\u003d0 is specified when the option is defined with oslo.config, a value error will happen when the option is loaded, which I think will prevent Glance from starting?","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"95645aa3df60ec4ff78a7809fc7f177ab3bd07a1","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    :param owner: The owner of the image which will be created"},{"line_number":195,"context_line":"    :return:"},{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003d\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba0121b8_5d492030","line":197,"range":{"start_line":197,"start_character":14,"end_line":197,"end_character":18},"updated":"2016-04-01 13:15:26.000000000","message":"I think we should have \"if maximum \u003c 0: raise ValueError()\" here.","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"e51ee2c05acb9608f68f5456451e2eaf4b1aa7c5","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    :param owner: The owner of the image which will be created"},{"line_number":195,"context_line":"    :return:"},{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003d\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a061dce_0a806bbf","line":197,"range":{"start_line":197,"start_character":14,"end_line":197,"end_character":18},"in_reply_to":"9a061dce_d008f42f","updated":"2016-04-06 09:41:43.000000000","message":"OK, you\u0027re probably right.","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b8431ca7d8a4b7bb0eff026b8dbfa5fc282e7ef","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    :param owner: The owner of the image which will be created"},{"line_number":195,"context_line":"    :return:"},{"line_number":196,"context_line":"    \"\"\""},{"line_number":197,"context_line":"    maximum \u003d CONF.user_image_number_quota"},{"line_number":198,"context_line":"    if maximum \u003d\u003d 0:"},{"line_number":199,"context_line":"        return"},{"line_number":200,"context_line":"    number_usage \u003d db_api.user_get_image_number_usage(context, owner)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a061dce_d008f42f","line":197,"range":{"start_line":197,"start_character":14,"end_line":197,"end_character":18},"in_reply_to":"ba0121b8_5d492030","updated":"2016-04-06 02:12:38.000000000","message":"I added the min\u003d0 in config opitons and oslo.config will do this check IMO. https://review.openstack.org/#/c/244573/23/glance/common/config.py","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"}],"glance/api/v1/images.py":[{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"e17abc546a59fd67c53581b9596e6ed4faeab6ff","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    here. This was introduced to keep modularity."},{"line_number":77,"context_line":"    \"\"\""},{"line_number":78,"context_line":"    for time_field in [\u0027created_at\u0027, \u0027updated_at\u0027, \u0027deleted_at\u0027]:"},{"line_number":79,"context_line":"        if time_field in values and values[time_field]:"},{"line_number":80,"context_line":"            try:"},{"line_number":81,"context_line":"                time \u003d timeutils.parse_isotime(values[time_field])"},{"line_number":82,"context_line":"                values[time_field] \u003d time.strftime("}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_c6263116","line":79,"updated":"2015-12-03 22:21:07.000000000","message":"Should this be values[time_field] is not none","commit_id":"9bfccaba08f3010f56d3f0112b22b1d77c752fd6"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"d238a35c151650f4179e8cbf2144a2a68398e461","unresolved":false,"context_lines":[{"line_number":601,"context_line":""},{"line_number":602,"context_line":"        try:"},{"line_number":603,"context_line":"            db_api \u003d glance.db.get_api()"},{"line_number":604,"context_line":"            owner \u003d image_meta.get(\u0027owner\u0027, None) or req.context.owner"},{"line_number":605,"context_line":"            common.check_image_number_quota(req.context, db_api, owner)"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"            image_meta \u003d registry.add_image_metadata(req.context, image_meta)"}],"source_content_type":"text/x-python","patch_set":22,"id":"9aed3d3a_9b7151ab","line":604,"updated":"2016-02-29 12:25:59.000000000","message":"Do we really need that for v1? Could you please exlain?\u003d)","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"3d2a3c7de4c39bbf207df69981fa3f7c6a38600d","unresolved":false,"context_lines":[{"line_number":601,"context_line":""},{"line_number":602,"context_line":"        try:"},{"line_number":603,"context_line":"            db_api \u003d glance.db.get_api()"},{"line_number":604,"context_line":"            owner \u003d image_meta.get(\u0027owner\u0027, None) or req.context.owner"},{"line_number":605,"context_line":"            common.check_image_number_quota(req.context, db_api, owner)"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"            image_meta \u003d registry.add_image_metadata(req.context, image_meta)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_0312c956","line":604,"in_reply_to":"9aed3d3a_9b7151ab","updated":"2016-03-24 09:37:16.000000000","message":"I know it\u0027s not good to modify v1\u0027s code. My concern is that if we only achieve this in v2, users can use v1 to avoid the quota limit.","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":601,"context_line":""},{"line_number":602,"context_line":"        try:"},{"line_number":603,"context_line":"            db_api \u003d glance.db.get_api()"},{"line_number":604,"context_line":"            owner \u003d image_meta.get(\u0027owner\u0027, None) or req.context.owner"},{"line_number":605,"context_line":"            common.check_image_number_quota(req.context, db_api, owner)"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"            image_meta \u003d registry.add_image_metadata(req.context, image_meta)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_af281b9b","line":604,"in_reply_to":"fa0719c6_0312c956","updated":"2016-03-24 14:11:45.000000000","message":"Makes sense.","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"}],"glance/api/v2/images.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        except (exception.ReservedProperty,"},{"line_number":69,"context_line":"                exception.ReadonlyProperty) as e:"},{"line_number":70,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003de.msg)"},{"line_number":71,"context_line":"        except (exception.Forbidden, exception.ImageNumberQuotaFull) as e:"},{"line_number":72,"context_line":"            LOG.debug(\"User not permitted to create image\")"},{"line_number":73,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003de.msg)"},{"line_number":74,"context_line":"        except exception.LimitExceeded as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_ec537569","line":71,"updated":"2015-12-21 03:52:31.000000000","message":"(nit): I would prefer to put it at line 74.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        except (exception.ReservedProperty,"},{"line_number":69,"context_line":"                exception.ReadonlyProperty) as e:"},{"line_number":70,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003de.msg)"},{"line_number":71,"context_line":"        except (exception.Forbidden, exception.ImageNumberQuotaFull) as e:"},{"line_number":72,"context_line":"            LOG.debug(\"User not permitted to create image\")"},{"line_number":73,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003de.msg)"},{"line_number":74,"context_line":"        except exception.LimitExceeded as e:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_0db358ea","line":71,"in_reply_to":"3a7e1126_ec537569","updated":"2015-12-21 08:16:56.000000000","message":"Done","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":17116,"name":"Niall Bunting","email":"niall.bunting@hpe.com","username":"NiallBunting"},"change_message_id":"45cc09f64d9cbb4694f67b676f3d589605e5b807","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003de.msg)"},{"line_number":74,"context_line":"        except (exception.LimitExceeded, exception.ImageNumberQuotaFull) as e:"},{"line_number":75,"context_line":"            LOG.warn(encodeutils.exception_to_unicode(e))"},{"line_number":76,"context_line":"            raise webob.exc.HTTPRequestEntityTooLarge("},{"line_number":77,"context_line":"                explanation\u003de.msg, request\u003dreq, content_type\u003d\u0027text/plain\u0027)"},{"line_number":78,"context_line":"        except exception.Duplicate as e:"},{"line_number":79,"context_line":"            raise webob.exc.HTTPConflict(explanation\u003de.msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_23dee011","line":76,"range":{"start_line":76,"start_character":28,"end_line":76,"end_character":53},"updated":"2016-01-28 13:45:12.000000000","message":"Is this really what we want to reply. As this suggests to me the request is too large. Not that the user has too many images. Maybe Forbidden?","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"767ed37aac23603d423c64c04472968a1a3a5f4f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            raise webob.exc.HTTPForbidden(explanation\u003de.msg)"},{"line_number":74,"context_line":"        except (exception.LimitExceeded, exception.ImageNumberQuotaFull) as e:"},{"line_number":75,"context_line":"            LOG.warn(encodeutils.exception_to_unicode(e))"},{"line_number":76,"context_line":"            raise webob.exc.HTTPRequestEntityTooLarge("},{"line_number":77,"context_line":"                explanation\u003de.msg, request\u003dreq, content_type\u003d\u0027text/plain\u0027)"},{"line_number":78,"context_line":"        except exception.Duplicate as e:"},{"line_number":79,"context_line":"            raise webob.exc.HTTPConflict(explanation\u003de.msg)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_beede226","line":76,"range":{"start_line":76,"start_character":28,"end_line":76,"end_character":53},"in_reply_to":"7a5de9d1_23dee011","updated":"2016-01-29 02:36:10.000000000","message":"Yes, 403 looks better.","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"}],"glance/common/config.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"1e4f60096da16cd72ee361bc4526713311a33e58","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                      \"assumed. Note that there should not be any space \""},{"line_number":148,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":149,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":150,"context_line":"               help\u003d_(\"This value is the max number of images that every user\""},{"line_number":151,"context_line":"                      \"can create. A value of 0 means unlimited.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":153,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_ce66fb28","line":150,"updated":"2015-11-16 08:18:45.000000000","message":"add blank space at the end","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"3999ddafc8f1e08e0ffb20b87090ca771783bf48","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                      \"assumed. Note that there should not be any space \""},{"line_number":148,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":149,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":150,"context_line":"               help\u003d_(\"This value is the max number of images that every user\""},{"line_number":151,"context_line":"                      \"can create. A value of 0 means unlimited.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":153,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_94cd66b9","line":150,"in_reply_to":"da85f559_ce66fb28","updated":"2015-11-16 08:52:24.000000000","message":"Done","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                      \"assumed. Note that there should not be any space \""},{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every user \""},{"line_number":149,"context_line":"                      \"can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_0ccfe129","line":148,"updated":"2015-12-21 03:52:31.000000000","message":"(nit): \"every user\" is not an accurate expression, since the quota is per project not per user.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                      \"assumed. Note that there should not be any space \""},{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every user \""},{"line_number":149,"context_line":"                      \"can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_0d0fd888","line":148,"in_reply_to":"3a7e1126_0ccfe129","updated":"2015-12-21 08:16:56.000000000","message":"Done","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":17116,"name":"Niall Bunting","email":"niall.bunting@hpe.com","username":"NiallBunting"},"change_message_id":"45cc09f64d9cbb4694f67b676f3d589605e5b807","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_ae9f1f4f","line":149,"range":{"start_line":149,"start_character":23,"end_line":149,"end_character":30},"updated":"2016-01-28 13:45:12.000000000","message":"Do you mean user here?","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a8f217ed86963f0020ab710c5acf8d3f4a7b8b57","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_834178ab","line":149,"range":{"start_line":149,"start_character":23,"end_line":149,"end_character":30},"in_reply_to":"7a5de9d1_764ea397","updated":"2016-01-30 02:20:35.000000000","message":"the property \"owner\" of image in Glance is project-id(or tenant), not user_id. So we could only based on project.\n\nSo we should leave project here?","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":17116,"name":"Niall Bunting","email":"niall.bunting@hpe.com","username":"NiallBunting"},"change_message_id":"982d099834688f0621d3b380fb7f49608bb90bf8","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_764ea397","line":149,"range":{"start_line":149,"start_character":23,"end_line":149,"end_character":30},"in_reply_to":"7a5de9d1_a3bdc969","updated":"2016-01-29 10:07:56.000000000","message":"I personally think \u0027tenant\u0027 is probably the worst one to use, due to keystone changing tenant to project.\n\nBut looking at the patch it seems to me this is based on user not a certain project.","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"767ed37aac23603d423c64c04472968a1a3a5f4f","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a5de9d1_a3bdc969","line":149,"range":{"start_line":149,"start_character":23,"end_line":149,"end_character":30},"in_reply_to":"7a5de9d1_ae9f1f4f","updated":"2016-01-29 02:36:10.000000000","message":"\"tenant\" maybe better. BTY, \"user_storage_quota\" in L137 is for tenant level in fact. I named \"user_image_number_quota\" here is also to keep the same. I prefer \"tenant\" actually.","commit_id":"c4ca73f318f925784647c51d1fcd8939e67c9418"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_6f11e35c","line":149,"range":{"start_line":149,"start_character":56,"end_line":149,"end_character":61},"updated":"2016-03-24 14:11:45.000000000","message":"ditto \"0 or less\".","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"043fd284d67566acea5ae4f95f2e2bddd850f5b1","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da0c15f0_04bd4068","line":149,"range":{"start_line":149,"start_character":56,"end_line":149,"end_character":61},"in_reply_to":"da0c15f0_b17c9973","updated":"2016-03-26 01:18:57.000000000","message":"Nice way.","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"ac4fdf88ba747864cb94e0ec5fe438d69e06f49f","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                      \"between value and unit and units are case sensitive.\")),"},{"line_number":147,"context_line":"    cfg.IntOpt(\u0027user_image_number_quota\u0027, default\u003d0,"},{"line_number":148,"context_line":"               help\u003d_(\"This value is the max number of images that every\""},{"line_number":149,"context_line":"                      \"project can create. A value of 0 means unlimited.\")),"},{"line_number":150,"context_line":"    cfg.BoolOpt(\u0027enable_v1_api\u0027, default\u003dTrue,"},{"line_number":151,"context_line":"                help\u003d_(\"Deploy the v1 OpenStack Images API.\")),"},{"line_number":152,"context_line":"    cfg.BoolOpt(\u0027enable_v2_api\u0027, default\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"da0c15f0_b17c9973","line":149,"range":{"start_line":149,"start_character":56,"end_line":149,"end_character":61},"in_reply_to":"fa0719c6_6f11e35c","updated":"2016-03-25 22:48:19.000000000","message":"Maybe add min\u003d0 as an argument to IntOpt and keep the text as is?","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"}],"glance/common/exception.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7458dbd5e7a6b6b7534fa4c1817d67b83d5d10a4","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":98,"context_line":"    message \u003d _(\"The number of image is exceed the limit.\")"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_5658b256","line":98,"updated":"2015-11-16 15:58:23.000000000","message":"Please revise this to:\n\n\"The number of images exceeds the allowed limit.\"\n\nor,\n\n\"The number of images you own has reached the allowed limit.\"","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"37677162b23b4e5eabe014ccff9dd00c477878fd","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":98,"context_line":"    message \u003d _(\"The number of image is exceed the limit.\")"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_de87bf5f","line":98,"in_reply_to":"ba8a016a_5658b256","updated":"2015-11-17 01:40:24.000000000","message":"Done","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":96,"context_line":"    message \u003d _(\"The number of images exceeds the allowed limit.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_4c4c099e","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":4},"updated":"2015-12-21 03:52:31.000000000","message":"It would be nice if we can return the quota number to end user so that they can know what happened.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":96,"context_line":"    message \u003d _(\"The number of images exceeds the allowed limit.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_8de0a897","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":4},"in_reply_to":"3a7e1126_4c4c099e","updated":"2015-12-21 08:16:56.000000000","message":"Done","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"2136daeb6b7649631a5b44a6666d027dafcb89b5","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":96,"context_line":"    message \u003d _(\"The number of images exceeds the allowed limit %(limit)s.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da0c15f0_2f13f0b9","line":96,"range":{"start_line":96,"start_character":17,"end_line":96,"end_character":74},"updated":"2016-03-27 09:36:31.000000000","message":"nit: I suggest that the message format consistent with class ImageMemberLimitExceeded.","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1ae21a7c41f7347fed98db9517c5c3cd3c020cea","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":96,"context_line":"    message \u003d _(\"The number of images exceeds the allowed limit %(limit)s.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da0c15f0_b2f1286d","line":96,"range":{"start_line":96,"start_character":17,"end_line":96,"end_character":74},"in_reply_to":"da0c15f0_2f13f0b9","updated":"2016-03-27 14:22:15.000000000","message":"Glance already has a resource called \"member\". Maybe it will confuse users if we use ImageMember here?","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"debb371ccf66e92e51740952fe3b520079190fce","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"class ImageNumberQuotaFull(GlanceException):"},{"line_number":96,"context_line":"    message \u003d _(\"The number of images exceeds the allowed limit %(limit)s.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class AuthBadRequest(GlanceException):"}],"source_content_type":"text/x-python","patch_set":23,"id":"da0c15f0_e4d476be","line":96,"range":{"start_line":96,"start_character":17,"end_line":96,"end_character":74},"in_reply_to":"da0c15f0_b2f1286d","updated":"2016-03-28 01:01:26.000000000","message":"Ok.","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"}],"glance/db/simple/api.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"1e4f60096da16cd72ee361bc4526713311a33e58","unresolved":false,"context_lines":[{"line_number":847,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":848,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner})"},{"line_number":849,"context_line":"    image_number \u003d len(images)"},{"line_number":850,"context_line":"    return image_number"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"@log_call"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_ae4a9781","line":850,"updated":"2015-11-16 08:18:45.000000000","message":"can be replaced by return len(images)","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"3999ddafc8f1e08e0ffb20b87090ca771783bf48","unresolved":false,"context_lines":[{"line_number":847,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":848,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner})"},{"line_number":849,"context_line":"    image_number \u003d len(images)"},{"line_number":850,"context_line":"    return image_number"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"@log_call"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_9444861b","line":850,"in_reply_to":"da85f559_ae4a9781","updated":"2015-11-16 08:52:24.000000000","message":"Done","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"bba5e893412ba09090c7ff7c7e241d8e6c8a8dd1","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":849,"context_line":"    total \u003d 0"},{"line_number":850,"context_line":"    for image in images:"},{"line_number":851,"context_line":"        if image[\u0027status\u0027] in [\u0027killed\u0027]:"},{"line_number":852,"context_line":"            continue"},{"line_number":853,"context_line":"        total +\u003d 1"},{"line_number":854,"context_line":"    return total"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_3afd8c3a","line":851,"updated":"2015-11-17 18:14:23.000000000","message":"Why not just:\nif image[\u0027status\u0027] !\u003d \u0027killed\u0027:\n    total +\u003d 1","commit_id":"b3c567e2b144677534472df67688d3d934b79331"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"ce7227e734e0ca7eb6e9f5684989bd19f7e0b6b9","unresolved":false,"context_lines":[{"line_number":848,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":849,"context_line":"    total \u003d 0"},{"line_number":850,"context_line":"    for image in images:"},{"line_number":851,"context_line":"        if image[\u0027status\u0027] in [\u0027killed\u0027]:"},{"line_number":852,"context_line":"            continue"},{"line_number":853,"context_line":"        total +\u003d 1"},{"line_number":854,"context_line":"    return total"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_306a791b","line":851,"in_reply_to":"ba8a016a_3afd8c3a","updated":"2015-11-18 01:06:32.000000000","message":"Looks better.","commit_id":"b3c567e2b144677534472df67688d3d934b79331"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":853,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":854,"context_line":"    total \u003d 0"},{"line_number":855,"context_line":"    for image in images:"},{"line_number":856,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027killed\u0027:"},{"line_number":857,"context_line":"            total +\u003d 1"},{"line_number":858,"context_line":"    return total"},{"line_number":859,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_275af62a","line":856,"range":{"start_line":856,"start_character":0,"end_line":856,"end_character":8},"updated":"2015-12-21 03:52:31.000000000","message":"Images in \u0027deleted\u0027 status shouldn\u0027t be counted as well. Otherwise, it would be a nightmare after the migration.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":853,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":854,"context_line":"    total \u003d 0"},{"line_number":855,"context_line":"    for image in images:"},{"line_number":856,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027killed\u0027:"},{"line_number":857,"context_line":"            total +\u003d 1"},{"line_number":858,"context_line":"    return total"},{"line_number":859,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_c840de36","line":856,"range":{"start_line":856,"start_character":0,"end_line":856,"end_character":8},"in_reply_to":"3a7e1126_275af62a","updated":"2015-12-21 08:16:56.000000000","message":"the images has been filtered by \u0027deleted \u003d False\u0027 in 853L.\n\nSo maybe we don\u0027t need filtered \u0027deleted\u0027 here as well.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":856,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":857,"context_line":"    total \u003d 0"},{"line_number":858,"context_line":"    for image in images:"},{"line_number":859,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027killed\u0027:"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_fadad315","line":856,"range":{"start_line":856,"start_character":46,"end_line":856,"end_character":51},"updated":"2016-03-24 14:11:45.000000000","message":"Just a question here: can\u0027t we filter by status directly?","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"b39d3fc44ce7c57f5b3dd0a3778e56e0631c4cc4","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":856,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":857,"context_line":"    total \u003d 0"},{"line_number":858,"context_line":"    for image in images:"},{"line_number":859,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027killed\u0027:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba0121b8_c276ef04","line":856,"range":{"start_line":856,"start_character":46,"end_line":856,"end_character":51},"in_reply_to":"da0c15f0_044b8088","updated":"2016-04-01 13:09:06.000000000","message":"No, the owner is probably useful. But then you go through all the images to count those those that are not \"killed\". Can\u0027t we do that using a filter in image_get_all? That would make the code smaller and probably faster.","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"043fd284d67566acea5ae4f95f2e2bddd850f5b1","unresolved":false,"context_lines":[{"line_number":853,"context_line":""},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":856,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner, \"deleted\": False})"},{"line_number":857,"context_line":"    total \u003d 0"},{"line_number":858,"context_line":"    for image in images:"},{"line_number":859,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027killed\u0027:"}],"source_content_type":"text/x-python","patch_set":22,"id":"da0c15f0_044b8088","line":856,"range":{"start_line":856,"start_character":46,"end_line":856,"end_character":51},"in_reply_to":"fa0719c6_fadad315","updated":"2016-03-26 01:18:57.000000000","message":"Sorry, Cyril. I can\u0027t get your idea clearly. You mean that the \"owner\" here is useless?","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b8431ca7d8a4b7bb0eff026b8dbfa5fc282e7ef","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"def user_get_storage_usage(context, owner_id, image_id\u003dNone, session\u003dNone):"},{"line_number":855,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner_id})"},{"line_number":856,"context_line":"    total \u003d 0"},{"line_number":857,"context_line":"    for image in images:"},{"line_number":858,"context_line":"        if image[\u0027status\u0027] in [\u0027killed\u0027, \u0027deleted\u0027]:"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a061dce_5316aea7","line":855,"updated":"2016-04-06 02:12:38.000000000","message":"checked again and I found that it\u0027 hard to filter status here. So I kept the same with this function. Please See L244 \"_filter_images\". If we want filter image status in it ,we should add \"ne\"(not equal) operator. Maybe the way like this function did is better?","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"e51ee2c05acb9608f68f5456451e2eaf4b1aa7c5","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"def user_get_storage_usage(context, owner_id, image_id\u003dNone, session\u003dNone):"},{"line_number":855,"context_line":"    images \u003d image_get_all(context, filters\u003d{\u0027owner\u0027: owner_id})"},{"line_number":856,"context_line":"    total \u003d 0"},{"line_number":857,"context_line":"    for image in images:"},{"line_number":858,"context_line":"        if image[\u0027status\u0027] in [\u0027killed\u0027, \u0027deleted\u0027]:"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a061dce_8a259b0a","line":855,"in_reply_to":"9a061dce_5316aea7","updated":"2016-04-06 09:41:43.000000000","message":"I would actually like that. This would make the code in user_get_image_number_usage much easier to read, and we would avoid going through the list of images twice. And I think it would be as easy as adding:\n\nelif operator \u003d\u003d \u0027ne\u0027: to_add \u003d (attr_value !\u003d list_value) in _filter_images. Does this seem OK to you?","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"95645aa3df60ec4ff78a7809fc7f177ab3bd07a1","unresolved":false,"context_lines":[{"line_number":870,"context_line":"    total \u003d 0"},{"line_number":871,"context_line":"    for image in images:"},{"line_number":872,"context_line":"        if image[\u0027status\u0027] !\u003d \u0027killed\u0027:"},{"line_number":873,"context_line":"            total +\u003d 1"},{"line_number":874,"context_line":"    return total"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"ba0121b8_1df5e8eb","line":873,"range":{"start_line":873,"start_character":21,"end_line":873,"end_character":22},"updated":"2016-04-01 13:15:26.000000000","message":"Yeah, do we really need to do that? Isn\u0027t there a way of saying \"status !\u003d killed\" in the filters of image_get_all?","commit_id":"47e68975be75770c3b2f5790b1cce44d180ea9a3"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7458dbd5e7a6b6b7534fa4c1817d67b83d5d10a4","unresolved":false,"context_lines":[{"line_number":1207,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":1208,"context_line":"    session \u003d session or get_session()"},{"line_number":1209,"context_line":"    image_number \u003d len(session.query(models.Image.owner).filter_by("},{"line_number":1210,"context_line":"        owner\u003downer).all())"},{"line_number":1211,"context_line":"    return image_number"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_bce45f0d","line":1210,"updated":"2015-11-16 15:58:23.000000000","message":"What are the performance implications of this query? Seems like it would be transferring a lot of data when all we want to know is the count (but I may be misunderstanding how this works).","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"6f8c759a01b0f52e693ddc4105eda475517d0984","unresolved":false,"context_lines":[{"line_number":1207,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":1208,"context_line":"    session \u003d session or get_session()"},{"line_number":1209,"context_line":"    image_number \u003d len(session.query(models.Image.owner).filter_by("},{"line_number":1210,"context_line":"        owner\u003downer).all())"},{"line_number":1211,"context_line":"    return image_number"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_df5b5253","line":1210,"in_reply_to":"ba8a016a_bce45f0d","updated":"2015-11-16 17:17:23.000000000","message":"Maybe .count() on the end?\n(See https://review.openstack.org/#/c/42122/1/glance/db/sqlalchemy/api.py)","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"37677162b23b4e5eabe014ccff9dd00c477878fd","unresolved":false,"context_lines":[{"line_number":1207,"context_line":"def user_get_image_number_usage(context, owner, session\u003dNone):"},{"line_number":1208,"context_line":"    session \u003d session or get_session()"},{"line_number":1209,"context_line":"    image_number \u003d len(session.query(models.Image.owner).filter_by("},{"line_number":1210,"context_line":"        owner\u003downer).all())"},{"line_number":1211,"context_line":"    return image_number"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_feb9632f","line":1210,"in_reply_to":"ba8a016a_df5b5253","updated":"2015-11-17 01:40:24.000000000","message":"Done","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"6f8c759a01b0f52e693ddc4105eda475517d0984","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"    session \u003d session or get_session()"},{"line_number":1209,"context_line":"    image_number \u003d len(session.query(models.Image.owner).filter_by("},{"line_number":1210,"context_line":"        owner\u003downer).all())"},{"line_number":1211,"context_line":"    return image_number"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":"def _task_info_format(task_info_ref):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_1f40fa55","line":1211,"updated":"2015-11-16 17:17:23.000000000","message":"Also, what about not counting deleted images? (See same patch)","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"37677162b23b4e5eabe014ccff9dd00c477878fd","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"    session \u003d session or get_session()"},{"line_number":1209,"context_line":"    image_number \u003d len(session.query(models.Image.owner).filter_by("},{"line_number":1210,"context_line":"        owner\u003downer).all())"},{"line_number":1211,"context_line":"    return image_number"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":"def _task_info_format(task_info_ref):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_1eb7873a","line":1211,"in_reply_to":"ba8a016a_1f40fa55","updated":"2015-11-17 01:40:24.000000000","message":"Right,it\u0027s my fault here.","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":1234,"context_line":"    session \u003d session or get_session()"},{"line_number":1235,"context_line":"    image_number \u003d session.query(models.Image).filter("},{"line_number":1236,"context_line":"        models.Image.owner \u003d\u003d owner,"},{"line_number":1237,"context_line":"        models.Image.status !\u003d \u0027killed\u0027).filter_by(deleted\u003dFalse).count()"},{"line_number":1238,"context_line":"    return image_number"},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_87496a62","line":1237,"range":{"start_line":1237,"start_character":8,"end_line":1237,"end_character":14},"updated":"2015-12-21 03:52:31.000000000","message":"Ditto","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":1234,"context_line":"    session \u003d session or get_session()"},{"line_number":1235,"context_line":"    image_number \u003d session.query(models.Image).filter("},{"line_number":1236,"context_line":"        models.Image.owner \u003d\u003d owner,"},{"line_number":1237,"context_line":"        models.Image.status !\u003d \u0027killed\u0027).filter_by(deleted\u003dFalse).count()"},{"line_number":1238,"context_line":"    return image_number"},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_487b8e8c","line":1237,"range":{"start_line":1237,"start_character":8,"end_line":1237,"end_character":14},"in_reply_to":"3a7e1126_87496a62","updated":"2015-12-21 08:16:56.000000000","message":"Ditto, used \u0027filter_by(deleted\u003dFalse)\u0027 here.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"}],"glance/tests/unit/v1/test_api.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"1e4f60096da16cd72ee361bc4526713311a33e58","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        for k, v in six.iteritems(fixture_owner):"},{"line_number":575,"context_line":"            req.headers[k] \u003d v"},{"line_number":576,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":577,"context_line":"        self.assertEqual(201, res.status_int)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def test_bad_container_format(self):"},{"line_number":580,"context_line":"        fixture_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_ae185785","line":577,"updated":"2015-11-16 08:18:45.000000000","message":"can we add a scenario by setting user_image_number_quota\u003d0 as 0 means owner can create unlimited images?","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"3999ddafc8f1e08e0ffb20b87090ca771783bf48","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        for k, v in six.iteritems(fixture_owner):"},{"line_number":575,"context_line":"            req.headers[k] \u003d v"},{"line_number":576,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":577,"context_line":"        self.assertEqual(201, res.status_int)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def test_bad_container_format(self):"},{"line_number":580,"context_line":"        fixture_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_d49e8eb7","line":577,"in_reply_to":"da85f559_ae185785","updated":"2015-11-16 08:52:24.000000000","message":"Sure, It makes sense.","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7458dbd5e7a6b6b7534fa4c1817d67b83d5d10a4","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        for k, v in six.iteritems(fixture_headers):"},{"line_number":558,"context_line":"            req.headers[k] \u003d v"},{"line_number":559,"context_line":"        # See lines L125 create_fixtures, as there are 3 images already and the"},{"line_number":560,"context_line":"        # limit is 2, not allow create this one."},{"line_number":561,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":562,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":563,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_118f9424","line":560,"updated":"2015-11-16 15:58:23.000000000","message":"It would be a good idea to find out the number of images in the fixture programmatically since if someone needs to add another image to the fixture, all these tests will break.","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"37677162b23b4e5eabe014ccff9dd00c477878fd","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        for k, v in six.iteritems(fixture_headers):"},{"line_number":558,"context_line":"            req.headers[k] \u003d v"},{"line_number":559,"context_line":"        # See lines L125 create_fixtures, as there are 3 images already and the"},{"line_number":560,"context_line":"        # limit is 2, not allow create this one."},{"line_number":561,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":562,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":563,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_7ef3330b","line":560,"in_reply_to":"ba8a016a_118f9424","updated":"2015-11-17 01:40:24.000000000","message":"Good suggestion.","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"bba5e893412ba09090c7ff7c7e241d8e6c8a8dd1","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            req.headers[k] \u003d v"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        # Set the user_image_number_quota less than the exist_image_number"},{"line_number":568,"context_line":"        # not allow create this one."},{"line_number":569,"context_line":"        self.config(user_image_number_quota\u003dexist_image_number - 1)"},{"line_number":570,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":571,"context_line":"        self.assertEqual(403, res.status_int)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_f5d07555","line":568,"updated":"2015-11-17 18:14:23.000000000","message":"I suggest \"Don\u0027t allow creating any more images\"","commit_id":"b3c567e2b144677534472df67688d3d934b79331"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"bba5e893412ba09090c7ff7c7e241d8e6c8a8dd1","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"        # Set the user_image_number_quota more than the exist_image_number"},{"line_number":574,"context_line":"        # allow create only the last image."},{"line_number":575,"context_line":"        self.config(user_image_number_quota\u003dexist_image_number + 1)"},{"line_number":576,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":577,"context_line":"        self.assertEqual(201, res.status_int)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_555141d7","line":574,"updated":"2015-11-17 18:14:23.000000000","message":"I suggest \"Allow creating only one last image\"","commit_id":"b3c567e2b144677534472df67688d3d934b79331"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"bba5e893412ba09090c7ff7c7e241d8e6c8a8dd1","unresolved":false,"context_lines":[{"line_number":576,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":577,"context_line":"        self.assertEqual(201, res.status_int)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        # not allow create more one."},{"line_number":580,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":581,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":582,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_956ec994","line":579,"updated":"2015-11-17 18:14:23.000000000","message":"I suggest \"Don\u0027t allow creating one more\"","commit_id":"b3c567e2b144677534472df67688d3d934b79331"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"bba5e893412ba09090c7ff7c7e241d8e6c8a8dd1","unresolved":false,"context_lines":[{"line_number":580,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":581,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"        # but can create the image whose owner is another one."},{"line_number":584,"context_line":"        fixture_owner \u003d {\u0027x-image-meta-owner\u0027: TENANT2}"},{"line_number":585,"context_line":"        for k, v in six.iteritems(fixture_owner):"},{"line_number":586,"context_line":"            req.headers[k] \u003d v"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_f5bab5e0","line":583,"updated":"2015-11-17 18:14:23.000000000","message":"I suggest \"Allow a different user to create an image\"","commit_id":"b3c567e2b144677534472df67688d3d934b79331"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"e17abc546a59fd67c53581b9596e6ed4faeab6ff","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        fixture_headers \u003d {\u0027x-image-meta-store\u0027: \u0027file\u0027,"},{"line_number":204,"context_line":"                           \u0027x-image-meta-disk-format\u0027: \u0027vhd\u0027,"},{"line_number":205,"context_line":"                           \u0027x-image-meta-container-format\u0027: \u0027ovf\u0027,"},{"line_number":206,"context_line":"                           \u0027x-image-meta-created_at\u0027: \u00271100\u0027,"},{"line_number":207,"context_line":"                           \u0027x-image-meta-name\u0027: \u0027fake image #3\u0027}"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        req \u003d webob.Request.blank(\"/images\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_065af983","line":206,"updated":"2015-12-03 22:21:07.000000000","message":"Suggesting a full date \"1100-01-01\" but not strictly necessary","commit_id":"9bfccaba08f3010f56d3f0112b22b1d77c752fd6"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"22316e7752583c12272bdd7823239ffdad2a5b19","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        # Don\u0027t allow creating any more images."},{"line_number":641,"context_line":"        self.config(user_image_number_quota\u003dexist_image_number - 1)"},{"line_number":642,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":643,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        # Set the user_image_number_quota more than the exist_image_number."},{"line_number":646,"context_line":"        # Allow creating only one last image."}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_c76a12b3","line":643,"range":{"start_line":643,"start_character":0,"end_line":643,"end_character":8},"updated":"2015-12-21 03:52:31.000000000","message":"403 isn\u0027t reasonable, IMHO. Please refer the response code of storage quota exceed.","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4bd1746f124332b44ea3f930179c5b877531af63","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        # Don\u0027t allow creating any more images."},{"line_number":641,"context_line":"        self.config(user_image_number_quota\u003dexist_image_number - 1)"},{"line_number":642,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":643,"context_line":"        self.assertEqual(403, res.status_int)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        # Set the user_image_number_quota more than the exist_image_number."},{"line_number":646,"context_line":"        # Allow creating only one last image."}],"source_content_type":"text/x-python","patch_set":18,"id":"3a7e1126_e8a27afb","line":643,"range":{"start_line":643,"start_character":0,"end_line":643,"end_character":8},"in_reply_to":"3a7e1126_c76a12b3","updated":"2015-12-21 08:16:56.000000000","message":"Done","commit_id":"4eba2ee57d64521bb4aaa7a72383dbe37cb980ba"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        fixture_headers \u003d {\u0027x-image-meta-owner\u0027: TENANT1}"},{"line_number":661,"context_line":"        req \u003d unit_test_utils.get_fake_request(path\u003d\"/images\","},{"line_number":662,"context_line":"                                               is_admin\u003dTrue)"},{"line_number":663,"context_line":"        for k, v in six.iteritems(fixture_headers):"},{"line_number":664,"context_line":"            req.headers[k] \u003d v"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        # Set the user_image_number_quota less than the exist_image_number."}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_f6eca7bc","line":663,"range":{"start_line":663,"start_character":34,"end_line":663,"end_character":49},"updated":"2016-03-24 14:11:45.000000000","message":"You could just use \"items()\", it should not be a performance issue.","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"043fd284d67566acea5ae4f95f2e2bddd850f5b1","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        fixture_headers \u003d {\u0027x-image-meta-owner\u0027: TENANT1}"},{"line_number":661,"context_line":"        req \u003d unit_test_utils.get_fake_request(path\u003d\"/images\","},{"line_number":662,"context_line":"                                               is_admin\u003dTrue)"},{"line_number":663,"context_line":"        for k, v in six.iteritems(fixture_headers):"},{"line_number":664,"context_line":"            req.headers[k] \u003d v"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        # Set the user_image_number_quota less than the exist_image_number."}],"source_content_type":"text/x-python","patch_set":22,"id":"da0c15f0_4445786e","line":663,"range":{"start_line":663,"start_character":34,"end_line":663,"end_character":49},"in_reply_to":"fa0719c6_f6eca7bc","updated":"2016-03-26 01:18:57.000000000","message":"Done","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        # But allow create images for different users."},{"line_number":683,"context_line":"        fixture_owner \u003d {\u0027x-image-meta-owner\u0027: TENANT2}"},{"line_number":684,"context_line":"        for k, v in six.iteritems(fixture_owner):"},{"line_number":685,"context_line":"            req.headers[k] \u003d v"},{"line_number":686,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":687,"context_line":"        self.assertEqual(201, res.status_int)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_d64243ad","line":684,"range":{"start_line":684,"start_character":33,"end_line":684,"end_character":34},"updated":"2016-03-24 14:11:45.000000000","message":"ditto","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cf76764426a4749d2b0384e29098c879bffed137","unresolved":false,"context_lines":[{"line_number":692,"context_line":"        self.assertEqual(201, res.status_int)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        fixture_owner \u003d {\u0027x-image-meta-owner\u0027: TENANT1}"},{"line_number":695,"context_line":"        for k, v in six.iteritems(fixture_owner):"},{"line_number":696,"context_line":"            req.headers[k] \u003d v"},{"line_number":697,"context_line":"        res \u003d req.get_response(self.api)"},{"line_number":698,"context_line":"        self.assertEqual(201, res.status_int)"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa0719c6_f64307ad","line":695,"range":{"start_line":695,"start_character":47,"end_line":695,"end_character":49},"updated":"2016-03-24 14:11:45.000000000","message":"ditto","commit_id":"08ad27672e4cc215a42a1f8cacd7e92b7585068b"}],"glance/tests/unit/v2/test_images_resource.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"1e4f60096da16cd72ee361bc4526713311a33e58","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        image \u003d {\u0027owner\u0027: TENANT2}"},{"line_number":801,"context_line":"        self.controller.create(request, image\u003dimage,"},{"line_number":802,"context_line":"                               extra_properties\u003d{}, tags\u003d[])"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    def test_update_no_changes(self):"},{"line_number":805,"context_line":"        request \u003d unit_test_utils.get_fake_request()"},{"line_number":806,"context_line":"        output \u003d self.controller.update(request, UUID1, changes\u003d[])"}],"source_content_type":"text/x-python","patch_set":6,"id":"da85f559_0e02c30b","line":803,"updated":"2015-11-16 08:18:45.000000000","message":"can we add a scenario by setting user_image_number_quota\u003d0 as 0 means owner can create unlimited images?","commit_id":"1ccebce59ca9d358121262dc2b841b3a26ef88f0"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"7458dbd5e7a6b6b7534fa4c1817d67b83d5d10a4","unresolved":false,"context_lines":[{"line_number":781,"context_line":"        request.context.is_admin \u003d True"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"        # See lines L141 _create_images, as there are 2 images owned by TENANT1"},{"line_number":784,"context_line":"        # already, not allow create this one."},{"line_number":785,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":786,"context_line":"                          self.controller.create, request, image\u003d{},"},{"line_number":787,"context_line":"                          extra_properties\u003d{}, tags\u003d[])"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_31097896","line":784,"updated":"2015-11-16 15:58:23.000000000","message":"I\u0027m not sure it\u0027s a good idea to rely on the code above not changing for your tests.","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"37677162b23b4e5eabe014ccff9dd00c477878fd","unresolved":false,"context_lines":[{"line_number":781,"context_line":"        request.context.is_admin \u003d True"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"        # See lines L141 _create_images, as there are 2 images owned by TENANT1"},{"line_number":784,"context_line":"        # already, not allow create this one."},{"line_number":785,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":786,"context_line":"                          self.controller.create, request, image\u003d{},"},{"line_number":787,"context_line":"                          extra_properties\u003d{}, tags\u003d[])"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba8a016a_fee7233e","line":784,"in_reply_to":"ba8a016a_31097896","updated":"2015-11-17 01:40:24.000000000","message":"Done","commit_id":"b2769b1315fc8b0b2feac6f57b914d595a1bed1b"},{"author":{"_account_id":17976,"name":"Drew Varner","email":"avarner@linux.vnet.ibm.com","username":"avarner"},"change_message_id":"bba5e893412ba09090c7ff7c7e241d8e6c8a8dd1","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        request.context.is_admin \u003d True"},{"line_number":786,"context_line":""},{"line_number":787,"context_line":"        # Set the user_image_number_quota less than the exist_image_number."},{"line_number":788,"context_line":"        # not allow create this one."},{"line_number":789,"context_line":"        self.config(user_image_number_quota\u003dexist_image_number - 1)"},{"line_number":790,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden,"},{"line_number":791,"context_line":"                          self.controller.create, request, image\u003d{},"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_b50c2d95","line":788,"updated":"2015-11-17 18:14:23.000000000","message":"See comments in \"test_api.py\"","commit_id":"b3c567e2b144677534472df67688d3d934b79331"}]}
