)]}'
{"etc/glance-api.conf":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":450,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Quota Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"# The maximum number of image properties allowed per image"},{"line_number":453,"context_line":"#quota_image_properties \u003d 128"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"# Set a system wide quota for every user.  This value is the total number"},{"line_number":456,"context_line":"# of bytes that a user can use across all storage systems.  A value of"}],"source_content_type":"text/plain","patch_set":3,"id":"AAAATn%2F%2BoyY%3D","line":453,"updated":"2013-11-22 07:25:13.000000000","message":"suggestion: do you think name it like this will be more consistent: \"image_property_quota\"?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"82e20d962e795f7b870eca50b62721623e82a20a","unresolved":false,"context_lines":[{"line_number":450,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Quota Options \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"# The maximum number of image properties allowed per image"},{"line_number":453,"context_line":"#quota_image_properties \u003d 128"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"# Set a system wide quota for every user.  This value is the total number"},{"line_number":456,"context_line":"# of bytes that a user can use across all storage systems.  A value of"}],"source_content_type":"text/plain","patch_set":3,"id":"AAAATn%2F%2BmZU%3D","line":453,"in_reply_to":"AAAATn%2F%2BoyY%3D","updated":"2013-11-22 16:28:29.000000000","message":"makes more sense to me too. I was originally trying to be consistent with the nova property of quota_metadata_items but it makes more sense to be consistent within glance.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"}],"glance/api/v1/images.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4a3eac8ba1bd5e1b0a7717cf5534a3104326de82","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import copy"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import eventlet"},{"line_number":25,"context_line":"from oslo.config import cfg"},{"line_number":26,"context_line":"from webob.exc import (HTTPNotFound,"},{"line_number":27,"context_line":"                       HTTPConflict,"},{"line_number":28,"context_line":"                       HTTPBadRequest,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BqfU%3D","line":25,"updated":"2013-11-21 21:32:05.000000000","message":"oh dear, may be the cleanup imports MP should clean this up and just use import webob or something..","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                      orig_image_meta\u003dNone,"},{"line_number":155,"context_line":"                                      purge_props\u003dFalse,"},{"line_number":156,"context_line":"                                      req\u003dNone):"},{"line_number":157,"context_line":"        props \u003d image_meta[\u0027properties\u0027].keys()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if CONF.quota_image_properties \u003c 0:"},{"line_number":160,"context_line":"            # If value is negative, allow unlimited number of properties"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Boxc%3D","line":157,"updated":"2013-11-22 07:25:13.000000000","message":"suggestion: I prefer move this line after line #161, and do checking first.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"a2d847e5107851dc8811ac8880a57fba7739c065","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if len(props) \u003e CONF.quota_image_properties:"},{"line_number":171,"context_line":"            msg \u003d _(\"The limit has been exceeded on the number of allowed \""},{"line_number":172,"context_line":"                    \"image properties.\")"},{"line_number":173,"context_line":"            raise HTTPRequestEntityTooLarge(explanation\u003dmsg,"},{"line_number":174,"context_line":"                                            request\u003dreq,"},{"line_number":175,"context_line":"                                            content_type\u003d\"text/plain\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bqu4%3D","line":172,"updated":"2013-11-21 19:47:06.000000000","message":"Should we provide information as to the number that are set and what their limit is?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"7a67cb8bbc6705a0e0a4aef50a5e494583b1741a","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if len(props) \u003e CONF.quota_image_properties:"},{"line_number":171,"context_line":"            msg \u003d _(\"The limit has been exceeded on the number of allowed \""},{"line_number":172,"context_line":"                    \"image properties.\")"},{"line_number":173,"context_line":"            raise HTTPRequestEntityTooLarge(explanation\u003dmsg,"},{"line_number":174,"context_line":"                                            request\u003dreq,"},{"line_number":175,"context_line":"                                            content_type\u003d\"text/plain\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BmlM%3D","line":172,"in_reply_to":"AAAATn%2F%2BoyM%3D","updated":"2013-11-22 16:26:19.000000000","message":"sounds good","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        if len(props) \u003e CONF.quota_image_properties:"},{"line_number":171,"context_line":"            msg \u003d _(\"The limit has been exceeded on the number of allowed \""},{"line_number":172,"context_line":"                    \"image properties.\")"},{"line_number":173,"context_line":"            raise HTTPRequestEntityTooLarge(explanation\u003dmsg,"},{"line_number":174,"context_line":"                                            request\u003dreq,"},{"line_number":175,"context_line":"                                            content_type\u003d\"text/plain\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BoyM%3D","line":172,"in_reply_to":"AAAATn%2F%2Bqu4%3D","updated":"2013-11-22 07:25:13.000000000","message":"+1. And I think add a log is necessary. what about info level? v2 used that.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":854,"context_line":"                    orig_image_meta, req)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        self._enforce_image_property_quota(image_meta,"},{"line_number":857,"context_line":"                                           orig_image_meta,"},{"line_number":858,"context_line":"                                           purge_props\u003dpurge_props,"},{"line_number":859,"context_line":"                                           req\u003dreq)"},{"line_number":860,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bows%3D","line":857,"updated":"2013-11-22 07:25:13.000000000","message":"suggestion: I prefer write this as \"orig_image_meta\u003dorig_image_meta\", like you did for other args which has default value like below.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"c1994fc59457e133ff18bbaa40a0d390f982a53c","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            msg \u003d (_(\"The limit has been exceeded on the number of allowed \""},{"line_number":172,"context_line":"                     \"image properties. Attempted: %s, Maximum: %s\") %"},{"line_number":173,"context_line":"                   (len(props), CONF.image_property_quota))"},{"line_number":174,"context_line":"            LOG.debug(msg)"},{"line_number":175,"context_line":"            raise HTTPRequestEntityTooLarge(explanation\u003dmsg,"},{"line_number":176,"context_line":"                                            request\u003dreq,"},{"line_number":177,"context_line":"                                            content_type\u003d\"text/plain\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BjEs%3D","line":174,"updated":"2013-11-24 08:51:26.000000000","message":"suggestion: i still think this log should be info level.\n\n1. Since this a worth information to admin/operator to make sure why client request failed with HTTPRequestEntityTooLarge exception.\n\n2. You also do the similar log handling in v2 api controller, but using info level, so we\u0027d better keep consistent for them IMO.","commit_id":"0324c89e3424b92618cd9596de7482c4c113c542"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"ce97b795457e26c7231cc58959829ab53383a2ae","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            msg \u003d (_(\"The limit has been exceeded on the number of allowed \""},{"line_number":172,"context_line":"                     \"image properties. Attempted: %s, Maximum: %s\") %"},{"line_number":173,"context_line":"                   (len(props), CONF.image_property_quota))"},{"line_number":174,"context_line":"            LOG.debug(msg)"},{"line_number":175,"context_line":"            raise HTTPRequestEntityTooLarge(explanation\u003dmsg,"},{"line_number":176,"context_line":"                                            request\u003dreq,"},{"line_number":177,"context_line":"                                            content_type\u003d\"text/plain\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2Bics%3D","line":174,"in_reply_to":"AAAATn%2F%2BjEs%3D","updated":"2013-11-24 21:11:11.000000000","message":"I agree with you on #1. The reason I went with debug here is because similar situations in v1 result in a debug message. I figure being consistent with v1 makes more sense. \n\nThis is true for many Forbiddens and Conflicts being raised in this file. Although it doesn\u0027t seem to be absolutely consistent so maybe this line can change.","commit_id":"0324c89e3424b92618cd9596de7482c4c113c542"}],"glance/api/v2/images.py":[{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"407b818fb6603b706599628228da089c203fa4d7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        except exception.ImagePropertyLimitExceeded as e:"},{"line_number":66,"context_line":"            LOG.info(unicode(e))"},{"line_number":67,"context_line":"            raise webob.exc.HTTPRequestEntityTooLarge("},{"line_number":68,"context_line":"                explanation\u003de, request\u003dreq, content_type\u003d\u0027text/plain\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        return image"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BlsQ%3D","line":68,"updated":"2013-11-22 19:15:53.000000000","message":"Alex, might be a good idea to unicode the exception here too?","commit_id":"875a24d0a86c0574cbf643dbd37d27164868c0f5"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"407b818fb6603b706599628228da089c203fa4d7","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        except exception.ImagePropertyLimitExceeded as e:"},{"line_number":137,"context_line":"            LOG.info(unicode(e))"},{"line_number":138,"context_line":"            raise webob.exc.HTTPRequestEntityTooLarge("},{"line_number":139,"context_line":"                explanation\u003de, request\u003dreq, content_type\u003d\u0027text/plain\u0027)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return image"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BlsM%3D","line":139,"updated":"2013-11-22 19:15:53.000000000","message":"ditto","commit_id":"875a24d0a86c0574cbf643dbd37d27164868c0f5"}],"glance/common/config.py":[{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"460b3ccbdc5754ad05ad3d3b36a1999fc6c521dd","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.BoolOpt(\u0027allow_additional_image_properties\u0027, default\u003dTrue,"},{"line_number":46,"context_line":"                help\u003d_(\u0027Whether to allow users to specify image properties \u0027"},{"line_number":47,"context_line":"                       \u0027beyond what the image schema provides\u0027)),"},{"line_number":48,"context_line":"    cfg.IntOpt(\u0027quota_image_properties\u0027, default\u003d-1,"},{"line_number":49,"context_line":"               help\u003d_(\u0027Maximum number of properties allowed on an image.\u0027"},{"line_number":50,"context_line":"                      \u0027Default is unlimited.\u0027)),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027data_api\u0027, default\u003d\u0027glance.db.sqlalchemy.api\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B2i4%3D","line":48,"updated":"2013-11-19 11:11:15.000000000","message":"Is the default unlimited in order to keep backwards compatibility? I\u0027d prefer having a sane default here instead of making it unlimited.\n\nIIRC, Nova\u0027s default is 128.","commit_id":"dd3615fdeba4c45877ad39dd516b5737d04c21dc"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"21763efb22b1cad649069a22d9b2811eba5a073b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    cfg.BoolOpt(\u0027allow_additional_image_properties\u0027, default\u003dTrue,"},{"line_number":46,"context_line":"                help\u003d_(\u0027Whether to allow users to specify image properties \u0027"},{"line_number":47,"context_line":"                       \u0027beyond what the image schema provides\u0027)),"},{"line_number":48,"context_line":"    cfg.IntOpt(\u0027quota_image_properties\u0027, default\u003d-1,"},{"line_number":49,"context_line":"               help\u003d_(\u0027Maximum number of properties allowed on an image.\u0027"},{"line_number":50,"context_line":"                      \u0027Default is unlimited.\u0027)),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027data_api\u0027, default\u003d\u0027glance.db.sqlalchemy.api\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BsCc%3D","line":48,"in_reply_to":"AAAATn%2F%2B2i4%3D","updated":"2013-11-21 14:39:51.000000000","message":"yes and i totally agree with you if we are not concerned about backwards compat :)","commit_id":"dd3615fdeba4c45877ad39dd516b5737d04c21dc"}],"glance/common/exception.py":[{"author":{"_account_id":6493,"name":"John Bresnahan","email":"john@bresnahan.me","username":"jbresnah"},"change_message_id":"a2d847e5107851dc8811ac8880a57fba7739c065","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"class ImagePropertyLimitExceeded(GlanceException):"},{"line_number":293,"context_line":"    message \u003d _(\"The limit has been exceeded on the number of allowed image \""},{"line_number":294,"context_line":"                \"properties.\")"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"class RPCError(GlanceException):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bquk%3D","line":294,"updated":"2013-11-21 19:47:06.000000000","message":"For user friendliness can we provide the number of already set properties and the users limit?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"class ImagePropertyLimitExceeded(GlanceException):"},{"line_number":293,"context_line":"    message \u003d _(\"The limit has been exceeded on the number of allowed image \""},{"line_number":294,"context_line":"                \"properties.\")"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"class RPCError(GlanceException):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bowo%3D","line":294,"in_reply_to":"AAAATn%2F%2Bquk%3D","updated":"2013-11-22 07:25:13.000000000","message":"I agree to tell end user CONF.quota_image_properties value in the message.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"10547c2bcd4b5087823dbd4fc757f5c224175501","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"class ImagePropertyLimitExceeded(GlanceException):"},{"line_number":293,"context_line":"    message \u003d _(\"The limit has been exceeded on the number of allowed image \""},{"line_number":294,"context_line":"                \"properties.\")"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"class RPCError(GlanceException):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BmTE%3D","line":294,"in_reply_to":"AAAATn%2F%2Bquk%3D","updated":"2013-11-22 16:41:03.000000000","message":"unfortunately, it\u0027s hard to know what is already set based on where we are doing the enforcement. We can however include the number attempted and the max.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"}],"glance/quota/__init__.py":[{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"36f30a63f1e28a506b58185662552120f0c563e1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            raise exception.ImagePropertyLimitExceeded()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def save(self, image):"},{"line_number":52,"context_line":"        self._enforce_image_property_quota(image)"},{"line_number":53,"context_line":"        super(ImageRepoProxy, self).save(image)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def add(self, image):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BrI0%3D","line":52,"updated":"2013-11-21 17:57:20.000000000","message":"I\u0027d *kinda* prefer that this enforcement happen in the ImageProxy class, but I\u0027m curious to know your thoughts. I think it will boil down to the same thing at this point, and we could just make a low-priority or wishlist bug to move the enforcement there.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"ae4efb558c005cb9cfaf6642c98af4ba53dc565a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            raise exception.ImagePropertyLimitExceeded()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def save(self, image):"},{"line_number":52,"context_line":"        self._enforce_image_property_quota(image)"},{"line_number":53,"context_line":"        super(ImageRepoProxy, self).save(image)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def add(self, image):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bq3w%3D","line":52,"in_reply_to":"AAAATn%2F%2Bq4g%3D","updated":"2013-11-21 19:05:32.000000000","message":"Oh, good point. Order of operations would be significant if we do it on the image, but maybe we don\u0027t really care about that.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"4a4ae79e7d31b6990d2aa030d7c493448d19d624","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            raise exception.ImagePropertyLimitExceeded()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def save(self, image):"},{"line_number":52,"context_line":"        self._enforce_image_property_quota(image)"},{"line_number":53,"context_line":"        super(ImageRepoProxy, self).save(image)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def add(self, image):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bq4g%3D","line":52,"in_reply_to":"AAAATn%2F%2BrI0%3D","updated":"2013-11-21 19:02:51.000000000","message":"I\u0027m not sure I could make that work right. So I was thinking about doing an ExtraPropertiesProxy and checking the quota when an item was added but this won\u0027t work if we are adding and deleting items and the end result would be under the limit but it temporarily when over limit. Since you can do a PATCH then both may occur in the same transaction.\n\nThere may be something I\u0027m not seeing here. I absolutely would come back to this if I determine a better way which hopefully I do as I implement these other quotas. I have no problem changing this now however if we know a better way.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"}],"glance/tests/functional/v1/test_api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        # 8. PUT image with too many custom properties"},{"line_number":227,"context_line":"        # Verify 413 returned"},{"line_number":228,"context_line":"        headers \u003d {}"},{"line_number":229,"context_line":"        for i in xrange(129):  # default limit is 128"},{"line_number":230,"context_line":"            headers[\u0027X-Image-Meta-Property-foo%d\u0027 % i] \u003d \u0027bar\u0027"},{"line_number":231,"context_line":"        path \u003d \"http://%s:%d/v1/images/%s\" % (\"127.0.0.1\", self.api_port,"},{"line_number":232,"context_line":"                                              image_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BooI%3D","line":229,"updated":"2013-11-22 07:25:13.000000000","message":"can we make this value smaller? this is a functional test, each call will be happened really, and Jenkins will expend more time with more workload to get test results.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"7a67cb8bbc6705a0e0a4aef50a5e494583b1741a","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        # 8. PUT image with too many custom properties"},{"line_number":227,"context_line":"        # Verify 413 returned"},{"line_number":228,"context_line":"        headers \u003d {}"},{"line_number":229,"context_line":"        for i in xrange(129):  # default limit is 128"},{"line_number":230,"context_line":"            headers[\u0027X-Image-Meta-Property-foo%d\u0027 % i] \u003d \u0027bar\u0027"},{"line_number":231,"context_line":"        path \u003d \"http://%s:%d/v1/images/%s\" % (\"127.0.0.1\", self.api_port,"},{"line_number":232,"context_line":"                                              image_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BmiQ%3D","line":229,"in_reply_to":"AAAATn%2F%2BooI%3D","updated":"2013-11-22 16:26:19.000000000","message":"I was just being lazy and going off the default. I will see how complicated it would be to use a real value here instead.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"}],"glance/tests/functional/v2/test_images.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        media_type \u003d \u0027application/openstack-images-v2.1-json-patch\u0027"},{"line_number":160,"context_line":"        headers \u003d self._headers({\u0027content-type\u0027: media_type})"},{"line_number":161,"context_line":"        changes \u003d []"},{"line_number":162,"context_line":"        for i in xrange(129):"},{"line_number":163,"context_line":"            changes.append({\u0027op\u0027: \u0027add\u0027,"},{"line_number":164,"context_line":"                            \u0027path\u0027: \u0027/ping%i\u0027 % i,"},{"line_number":165,"context_line":"                            \u0027value\u0027: \u0027pong\u0027})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BooE%3D","line":162,"updated":"2013-11-22 07:25:13.000000000","message":"ditto, glance/tests/functional/v1/test_api.py","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"}],"glance/tests/unit/test_quota.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                                    mock.Mock())"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def tearDown(self):"},{"line_number":278,"context_line":"        super(TestImagePropertyQuotas, self).tearDown()"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def test_save_image_with_image_property(self):"},{"line_number":281,"context_line":"        self.config(quota_image_properties\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BotY%3D","line":278,"updated":"2013-11-22 07:25:13.000000000","message":"we don\u0027t need this tearDown just for call super\u0027s explicitly.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4a3eac8ba1bd5e1b0a7717cf5534a3104326de82","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        self.assertRaises(exception.ImagePropertyLimitExceeded,"},{"line_number":308,"context_line":"                          self.image_repo_proxy.add, self.image)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def test_add_image_unlimited_image_properties(self):"},{"line_number":311,"context_line":"        self.config(quota_image_properties\u003d-1)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self.image.extra_properties \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bqd8%3D","line":310,"updated":"2013-11-21 21:32:05.000000000","message":"why not test the save method with unlimited image properties?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"7a67cb8bbc6705a0e0a4aef50a5e494583b1741a","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        self.assertRaises(exception.ImagePropertyLimitExceeded,"},{"line_number":308,"context_line":"                          self.image_repo_proxy.add, self.image)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def test_add_image_unlimited_image_properties(self):"},{"line_number":311,"context_line":"        self.config(quota_image_properties\u003d-1)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self.image.extra_properties \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bmhs%3D","line":310,"in_reply_to":"AAAATn%2F%2Bqd8%3D","updated":"2013-11-22 16:26:19.000000000","message":"ahh im missing coverage! good call","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"4a3eac8ba1bd5e1b0a7717cf5534a3104326de82","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        self.config(quota_image_properties\u003d-1)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self.image.extra_properties \u003d {}"},{"line_number":314,"context_line":"        for i in range(10000):"},{"line_number":315,"context_line":"            self.image.extra_properties[\u0027foo%d\u0027 % i] \u003d \u0027bar\u0027"},{"line_number":316,"context_line":"        self.image_repo_proxy.add(self.image)"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BqcM%3D","line":314,"updated":"2013-11-21 21:32:05.000000000","message":"Are you sure that this won\u0027t be a MemoryError/or very slow tests on smaller systems?\n\nMay be using generator might help? I saw you used xrange in test_images_resource and found an interesting article on why range should be preferred over xrange.\n\nhttp://stackoverflow.com/questions/135041/should-you-always-favor-xrange-over-range","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"d6af7a7fd6ae6ca5eaa4b70d9d0c569e02b7e52f","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        self.config(quota_image_properties\u003d-1)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self.image.extra_properties \u003d {}"},{"line_number":314,"context_line":"        for i in range(10000):"},{"line_number":315,"context_line":"            self.image.extra_properties[\u0027foo%d\u0027 % i] \u003d \u0027bar\u0027"},{"line_number":316,"context_line":"        self.image_repo_proxy.add(self.image)"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Blt0%3D","line":314,"in_reply_to":"AAAATn%2F%2BmhA%3D","updated":"2013-11-22 18:54:12.000000000","message":"Yeah, that sounds good. May be add in a note there as well that with py3 we can test it for far larger ones?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"7a67cb8bbc6705a0e0a4aef50a5e494583b1741a","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        self.config(quota_image_properties\u003d-1)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self.image.extra_properties \u003d {}"},{"line_number":314,"context_line":"        for i in range(10000):"},{"line_number":315,"context_line":"            self.image.extra_properties[\u0027foo%d\u0027 % i] \u003d \u0027bar\u0027"},{"line_number":316,"context_line":"        self.image_repo_proxy.add(self.image)"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BmhA%3D","line":314,"in_reply_to":"AAAATn%2F%2BqcM%3D","updated":"2013-11-22 16:26:19.000000000","message":"great point nikhil, xrange is going away in python 3 where range will instead become an iterator. perhaps instead we just don\u0027t use as big of a number?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"407b818fb6603b706599628228da089c203fa4d7","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        self.config(image_property_quota\u003d-1)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        self.image.extra_properties \u003d {}"},{"line_number":323,"context_line":"        for i in range(500):"},{"line_number":324,"context_line":"            self.image.extra_properties[\u0027foo%d\u0027 % i] \u003d \u0027bar\u0027"},{"line_number":325,"context_line":"        self.image_repo_proxy.add(self.image)"},{"line_number":326,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Blq8%3D","line":323,"updated":"2013-11-22 19:15:53.000000000","message":"Please see my note in the previous PS, if that makes sense.","commit_id":"875a24d0a86c0574cbf643dbd37d27164868c0f5"}],"glance/tests/unit/v1/test_api.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":3025,"context_line":"        res_body \u003d json.loads(output.body)[\u0027image\u0027]"},{"line_number":3026,"context_line":"        self.assertEqual(res_body[\u0027properties\u0027][\u0027x_all_permitted\u0027], \u00271\u0027)"},{"line_number":3027,"context_line":""},{"line_number":3028,"context_line":"    def test_update_image_with_too_many_properties(self):"},{"line_number":3029,"context_line":"        self.config(quota_image_properties\u003d1)"},{"line_number":3030,"context_line":"        image_id \u003d self._create_admin_image()"},{"line_number":3031,"context_line":"        another_request \u003d unit_test_utils.get_fake_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Boqs%3D","line":3028,"updated":"2013-11-22 07:25:13.000000000","message":"nit: i\u0027m not sure this new stuff is good test cases for \"TestAPIProtectedProps\", seems we need add a new one for them, like \"TestAPIPropertyQuotas\"?","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"7a67cb8bbc6705a0e0a4aef50a5e494583b1741a","unresolved":false,"context_lines":[{"line_number":3025,"context_line":"        res_body \u003d json.loads(output.body)[\u0027image\u0027]"},{"line_number":3026,"context_line":"        self.assertEqual(res_body[\u0027properties\u0027][\u0027x_all_permitted\u0027], \u00271\u0027)"},{"line_number":3027,"context_line":""},{"line_number":3028,"context_line":"    def test_update_image_with_too_many_properties(self):"},{"line_number":3029,"context_line":"        self.config(quota_image_properties\u003d1)"},{"line_number":3030,"context_line":"        image_id \u003d self._create_admin_image()"},{"line_number":3031,"context_line":"        another_request \u003d unit_test_utils.get_fake_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BmgQ%3D","line":3028,"in_reply_to":"AAAATn%2F%2Boqs%3D","updated":"2013-11-22 16:26:19.000000000","message":"facepalm....thats valid","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"407b818fb6603b706599628228da089c203fa4d7","unresolved":false,"context_lines":[{"line_number":3291,"context_line":"        image_id \u003d res_body[\u0027id\u0027]"},{"line_number":3292,"context_line":"        return image_id"},{"line_number":3293,"context_line":""},{"line_number":3294,"context_line":"    def create_fixtures(self):"},{"line_number":3295,"context_line":"        for fixture in self.FIXTURES:"},{"line_number":3296,"context_line":"            db_api.image_create(self.context, fixture)"},{"line_number":3297,"context_line":"            # We write a fake image file to the filesystem"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BloE%3D","line":3294,"updated":"2013-11-22 19:15:53.000000000","message":"Also, I believe this method might not be needed.","commit_id":"875a24d0a86c0574cbf643dbd37d27164868c0f5"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"407b818fb6603b706599628228da089c203fa4d7","unresolved":false,"context_lines":[{"line_number":3294,"context_line":"    def create_fixtures(self):"},{"line_number":3295,"context_line":"        for fixture in self.FIXTURES:"},{"line_number":3296,"context_line":"            db_api.image_create(self.context, fixture)"},{"line_number":3297,"context_line":"            # We write a fake image file to the filesystem"},{"line_number":3298,"context_line":"            with open(\"%s/%s\" % (self.test_dir, fixture[\u0027id\u0027]), \u0027wb\u0027) as image:"},{"line_number":3299,"context_line":"                image.write(\"chunk00000remainder\")"},{"line_number":3300,"context_line":"                image.flush()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BlqY%3D","line":3297,"updated":"2013-11-22 19:15:53.000000000","message":"Do you think we can avoid creating image_data here and speed up the test?\nBasically, omitting next 3 lines should help.","commit_id":"875a24d0a86c0574cbf643dbd37d27164868c0f5"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"49f911be3fce0e76fe8a8ab8f402ccf11345f1ca","unresolved":false,"context_lines":[{"line_number":3284,"context_line":"        image_id \u003d res_body[\u0027id\u0027]"},{"line_number":3285,"context_line":"        return image_id"},{"line_number":3286,"context_line":""},{"line_number":3287,"context_line":"    def test_update_image_with_too_many_properties(self):"},{"line_number":3288,"context_line":"        self.config(image_property_quota\u003d1)"},{"line_number":3289,"context_line":"        image_id \u003d self._create_admin_image()"},{"line_number":3290,"context_line":"        another_request \u003d unit_test_utils.get_fake_request("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2Bk3Q%3D","line":3287,"updated":"2013-11-22 22:05:10.000000000","message":"missed docstring","commit_id":"0324c89e3424b92618cd9596de7482c4c113c542"}],"glance/tests/unit/v2/test_images_resource.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        \"\"\""},{"line_number":679,"context_line":"        request \u003d unit_test_utils.get_fake_request()"},{"line_number":680,"context_line":"        output \u003d self.controller.show(request, UUID1)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        changes \u003d ["},{"line_number":683,"context_line":"            {\u0027op\u0027: \u0027add\u0027, \u0027path\u0027: [\u0027foo\u0027], \u0027value\u0027: \u0027baz\u0027},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BopI%3D","line":680,"updated":"2013-11-22 07:25:13.000000000","message":"unused variable \"output\"","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e3b798d3a745595dfd0d2ec42e861cc1e9da9bec","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            {\u0027op\u0027: \u0027remove\u0027, \u0027path\u0027: [\u0027snitch\u0027]},"},{"line_number":695,"context_line":"        ]"},{"line_number":696,"context_line":"        output \u003d self.controller.update(request, UUID1, changes)"},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"    def test_update_replace_missing_property(self):"},{"line_number":699,"context_line":"        request \u003d unit_test_utils.get_fake_request()"},{"line_number":700,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Book%3D","line":697,"updated":"2013-11-22 07:25:13.000000000","message":"And according to your response to markwash, I think it will be better if we add a new test case for mix \"add\" and \"remove\" op in one transaction, and test property quota over limitation temporarily situation.","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"7a67cb8bbc6705a0e0a4aef50a5e494583b1741a","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            {\u0027op\u0027: \u0027remove\u0027, \u0027path\u0027: [\u0027snitch\u0027]},"},{"line_number":695,"context_line":"        ]"},{"line_number":696,"context_line":"        output \u003d self.controller.update(request, UUID1, changes)"},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"    def test_update_replace_missing_property(self):"},{"line_number":699,"context_line":"        request \u003d unit_test_utils.get_fake_request()"},{"line_number":700,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BmeI%3D","line":697,"in_reply_to":"AAAATn%2F%2Book%3D","updated":"2013-11-22 16:26:19.000000000","message":"yes good idea!","commit_id":"2666f284b4880ccebd2e6ef472adf1b7e859756c"},{"author":{"_account_id":2537,"name":"Nikhil Komawar","email":"nik.komawar@gmail.com","username":"nikhil-komawar"},"change_message_id":"407b818fb6603b706599628228da089c203fa4d7","unresolved":false,"context_lines":[{"line_number":679,"context_line":"        output \u003d self.controller.show(request, UUID1)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"        changes \u003d []"},{"line_number":682,"context_line":"        for i in xrange(10000):"},{"line_number":683,"context_line":"            changes.append({\u0027op\u0027: \u0027add\u0027,"},{"line_number":684,"context_line":"                            \u0027path\u0027: [\u0027foo%i\u0027 % i],"},{"line_number":685,"context_line":"                            \u0027value\u0027: \u0027bar\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Blp0%3D","line":682,"updated":"2013-11-22 19:15:53.000000000","message":"Did you leave xrange here on purpose?","commit_id":"875a24d0a86c0574cbf643dbd37d27164868c0f5"}]}
