)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"686271a9f1daafbb00c21b8ffa1a7f49bf426fb7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     shihanzhang \u003cshihanzhang@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-16 12:02:50 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix the problem of updating quoata"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It should not allow update the quota of resource which is in uesed from large to"},{"line_number":10,"context_line":"small."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAXH%2F%2F%2Bo0%3D","line":7,"updated":"2014-04-16 06:35:51.000000000","message":"quota","commit_id":"9af80285b0c51f5337568bbd8f775b58b45bbed1"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"686271a9f1daafbb00c21b8ffa1a7f49bf426fb7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix the problem of updating quoata"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It should not allow update the quota of resource which is in uesed from large to"},{"line_number":10,"context_line":"small."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I771f3c67488862443e669d7b42edb5f97da1339c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAXH%2F%2F%2BKk%3D","line":9,"updated":"2014-04-16 06:35:51.000000000","message":"It should not allow update the quota of resource lower than quota usage?","commit_id":"9af80285b0c51f5337568bbd8f775b58b45bbed1"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"464d337a990429ea55f1101f3b3fb90cc61a38ea","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix the problem of updating quoata"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It should not allow update the quota of resource which is in uesed from large to"},{"line_number":10,"context_line":"small."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I771f3c67488862443e669d7b42edb5f97da1339c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAXH%2F%2F8bM%3D","line":9,"updated":"2014-04-16 11:01:23.000000000","message":"uesed -\u003e used","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"76d3d9f29a3344b1b9698baf38d924c4c39132e1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     shihanzhang \u003cshihanzhang@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-17 09:03:19 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix the problem of updating quoata"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It should not allow update the quota of resource which is in uesed from large to"},{"line_number":10,"context_line":"small."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAXH%2F%2F148%3D","line":7,"updated":"2014-04-17 02:29:19.000000000","message":"Please change to: \"Disallow changing quota to lower than current usage\"","commit_id":"ce3df9839b3ae4dc9a3fcd9db85cc0afe0308455"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"76d3d9f29a3344b1b9698baf38d924c4c39132e1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Fix the problem of updating quoata"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It should not allow update the quota of resource which is in uesed from large to"},{"line_number":10,"context_line":"small."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I771f3c67488862443e669d7b42edb5f97da1339c"},{"line_number":13,"context_line":"Closes-bug: #1304234"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAXH%2F%2F14c%3D","line":10,"updated":"2014-04-17 02:29:19.000000000","message":"Please change to: \"Attempting to update resource quotas to a value lower than what is already in use should fail.\"","commit_id":"ce3df9839b3ae4dc9a3fcd9db85cc0afe0308455"}],"neutron/db/quota_db.py":[{"author":{"_account_id":7962,"name":"Ronak Shah","email":"ronak.malav.shah@gmail.com","username":"ronak"},"change_message_id":"f15f36291b7ed1723ce2901368d712f142dd61b9","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @staticmethod"},{"line_number":120,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":121,"context_line":"        quota_resources \u003d {"},{"line_number":122,"context_line":"            \u0027network\u0027: models_v2.Network,"},{"line_number":123,"context_line":"            \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":124,"context_line":"            \u0027port\u0027: models_v2.Port,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2F%2Buo%3D","line":121,"updated":"2014-04-16 04:48:09.000000000","message":"This dictionary should belong to a more general location in neutron. May be at common/utils.py as a function?","commit_id":"9af80285b0c51f5337568bbd8f775b58b45bbed1"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"0c7f5d5a2fed8c20b481a5ef347a599565cdc96a","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @staticmethod"},{"line_number":120,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":121,"context_line":"        quota_resources \u003d {"},{"line_number":122,"context_line":"            \u0027network\u0027: models_v2.Network,"},{"line_number":123,"context_line":"            \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":124,"context_line":"            \u0027port\u0027: models_v2.Port,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2F%2BDc%3D","line":121,"in_reply_to":"AAAAXH%2F%2F%2BNA%3D","updated":"2014-04-16 07:00:59.000000000","message":"thanks for your suggestion, nova has a table \u0027quota_usages\u0027 to record the usage condition of resource. if add a usage attribute for class Quota, it should update that attribute when \u0027create/delete\u0027 resource.","commit_id":"9af80285b0c51f5337568bbd8f775b58b45bbed1"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"686271a9f1daafbb00c21b8ffa1a7f49bf426fb7","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @staticmethod"},{"line_number":120,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":121,"context_line":"        quota_resources \u003d {"},{"line_number":122,"context_line":"            \u0027network\u0027: models_v2.Network,"},{"line_number":123,"context_line":"            \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":124,"context_line":"            \u0027port\u0027: models_v2.Port,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2F%2BNA%3D","line":121,"in_reply_to":"AAAAXH%2F%2F%2Buo%3D","updated":"2014-04-16 06:35:51.000000000","message":"+1, also feel tricky to put the quota_resources here. Whether nova also add the limit check like this way? what about add a usage attribute for class Quota?","commit_id":"9af80285b0c51f5337568bbd8f775b58b45bbed1"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"0a0bfae429c3ec9f0d8dcfd8d1dcdc4aaed22476","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @staticmethod"},{"line_number":120,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":121,"context_line":"        quota_resources \u003d {"},{"line_number":122,"context_line":"            \u0027network\u0027: models_v2.Network,"},{"line_number":123,"context_line":"            \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":124,"context_line":"            \u0027port\u0027: models_v2.Port,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2F%2BMU%3D","line":121,"in_reply_to":"AAAAXH%2F%2F%2Buo%3D","updated":"2014-04-16 06:25:31.000000000","message":"thanks for your review, only DbQuotaDriver can update the quota value of resource, so add this to \u0027common/utils.py\u0027 whether reasonable?","commit_id":"9af80285b0c51f5337568bbd8f775b58b45bbed1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9d7ce282c3e981a0e08ab66fe7764059c68d9e6e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.common import exceptions"},{"line_number":19,"context_line":"from neutron.db import model_base"},{"line_number":20,"context_line":"from neutron.db import models_v2"},{"line_number":21,"context_line":"from neutron.extensions.quotasv2 import QUOTA_SUPPORTED_RESOURCES"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Quota(model_base.BASEV2, models_v2.HasId):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F9e8%3D","line":21,"updated":"2014-04-16 08:51:12.000000000","message":"Please use\n\n from neutron.extension import quotasv2\n\nhttp://docs.openstack.org/developer/hacking/#imports","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"c130350cf7ee4b3662dd9e2ae869b7dac65eb6e5","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F9Y8%3D","line":119,"updated":"2014-04-16 09:06:04.000000000","message":"nit: name the var \u0027used_resources\u0027","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"2b5bb132de8fcfc4f0caa2e9ca29713e8961f31f","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F844%3D","line":119,"in_reply_to":"AAAAXH%2F%2F9Y8%3D","updated":"2014-04-16 10:06:49.000000000","message":"Done","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e76559b5a994a46aa7a3119106768a9586c118f0","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":123,"context_line":"                     \"less than already used \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F9U0%3D","line":120,"updated":"2014-04-16 09:09:41.000000000","message":"Shouldn\u0027t it be filtered by tenant here?","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"c130350cf7ee4b3662dd9e2ae869b7dac65eb6e5","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":123,"context_line":"                     \"less than already used \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F9X8%3D","line":120,"updated":"2014-04-16 09:06:04.000000000","message":"use .count() instead of .all() and then len()","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"2b5bb132de8fcfc4f0caa2e9ca29713e8961f31f","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    @staticmethod"},{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":123,"context_line":"                     \"less than already used \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F848%3D","line":120,"in_reply_to":"AAAAXH%2F%2F9U0%3D","updated":"2014-04-16 10:06:49.000000000","message":"yes, it should filtered by tenant id","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"c130350cf7ee4b3662dd9e2ae869b7dac65eb6e5","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":123,"context_line":"                     \"less than already used \""},{"line_number":124,"context_line":"                     \"%(used)s\") %"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F9YM%3D","line":121,"updated":"2014-04-16 09:06:04.000000000","message":"it makes sense to check for limit \u003d\u003d -1 before actualy making db query.","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"2b5bb132de8fcfc4f0caa2e9ca29713e8961f31f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def _check_resource_in_use(context, resource, limit):"},{"line_number":119,"context_line":"        in_used_resources \u003d context.session.query("},{"line_number":120,"context_line":"            QUOTA_SUPPORTED_RESOURCES[resource]).all()"},{"line_number":121,"context_line":"        if limit !\u003d -1 and len(in_used_resources) \u003e limit:"},{"line_number":122,"context_line":"            msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":123,"context_line":"                     \"less than already used \""},{"line_number":124,"context_line":"                     \"%(used)s\") %"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F85U%3D","line":121,"in_reply_to":"AAAAXH%2F%2F9YM%3D","updated":"2014-04-16 10:06:49.000000000","message":"thanks for your suggestion","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"464d337a990429ea55f1101f3b3fb90cc61a38ea","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.db.vpn import vpn_db"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"QUOTA_SUPPORTED_RESOURCES \u003d {"},{"line_number":28,"context_line":"    \u0027network\u0027: models_v2.Network,"},{"line_number":29,"context_line":"    \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":30,"context_line":"    \u0027port\u0027: models_v2.Port,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8Xk%3D","line":27,"updated":"2014-04-16 11:01:23.000000000","message":"Curious... how was this list determined?\n\nDoes VPN support quotas?","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"fd4c58e89fcc19377f5ba59dcdda080e6462d3d0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.db.vpn import vpn_db"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"QUOTA_SUPPORTED_RESOURCES \u003d {"},{"line_number":28,"context_line":"    \u0027network\u0027: models_v2.Network,"},{"line_number":29,"context_line":"    \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":30,"context_line":"    \u0027port\u0027: models_v2.Port,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8SU%3D","line":27,"in_reply_to":"AAAAXH%2F%2F8Xk%3D","updated":"2014-04-17 00:59:58.000000000","message":"Done","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":7962,"name":"Ronak Shah","email":"ronak.malav.shah@gmail.com","username":"ronak"},"change_message_id":"fafd2b4c9c14e3147fd1a1800d9302f5f7237b11","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        if limit !\u003d -1 and resource in QUOTA_SUPPORTED_RESOURCES.keys():"},{"line_number":143,"context_line":"            used_resources \u003d context.session.query("},{"line_number":144,"context_line":"                QUOTA_SUPPORTED_RESOURCES[resource]).filter_by("},{"line_number":145,"context_line":"                tenant_id\u003dtenant_id).count()"},{"line_number":146,"context_line":"            if len(used_resources) \u003e limit:"},{"line_number":147,"context_line":"                msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":148,"context_line":"                         \"less than already used \""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F2sY%3D","line":145,"updated":"2014-04-16 22:57:02.000000000","message":"+1 to the above comment regarding count() being scalar. \n\nAlso, Please run tox -e pep8 prior to uploading patch-set. You will see that you have incorrect indentation at line 145.","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d1594dcda12b1b293cbcfd62526ac592dcfef320","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        if limit !\u003d -1 and resource in QUOTA_SUPPORTED_RESOURCES.keys():"},{"line_number":143,"context_line":"            used_resources \u003d context.session.query("},{"line_number":144,"context_line":"                QUOTA_SUPPORTED_RESOURCES[resource]).filter_by("},{"line_number":145,"context_line":"                tenant_id\u003dtenant_id).count()"},{"line_number":146,"context_line":"            if len(used_resources) \u003e limit:"},{"line_number":147,"context_line":"                msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":148,"context_line":"                         \"less than already used \""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8So%3D","line":145,"updated":"2014-04-16 11:10:13.000000000","message":"sorry for confusing comments in previous patchset,\nI suggested to rename the var, but then I saw, you can optimize the code.\n\nSo here you\u0027re taking the row count, so you don\u0027t need to take len(used_resources) because used_resources is already a scalar (a number)","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"456d9eb4629b66fa3632e2ca7b76fbf8e6f48194","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        if limit !\u003d -1 and resource in QUOTA_SUPPORTED_RESOURCES.keys():"},{"line_number":143,"context_line":"            used_resources \u003d context.session.query("},{"line_number":144,"context_line":"                QUOTA_SUPPORTED_RESOURCES[resource]).filter_by("},{"line_number":145,"context_line":"                tenant_id\u003dtenant_id).count()"},{"line_number":146,"context_line":"            if len(used_resources) \u003e limit:"},{"line_number":147,"context_line":"                msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":148,"context_line":"                         \"less than already used \""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F2Qc%3D","line":145,"in_reply_to":"AAAAXH%2F%2F2sY%3D","updated":"2014-04-17 01:00:48.000000000","message":"Done","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"464d337a990429ea55f1101f3b3fb90cc61a38ea","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            used_resources \u003d context.session.query("},{"line_number":144,"context_line":"                QUOTA_SUPPORTED_RESOURCES[resource]).filter_by("},{"line_number":145,"context_line":"                tenant_id\u003dtenant_id).count()"},{"line_number":146,"context_line":"            if len(used_resources) \u003e limit:"},{"line_number":147,"context_line":"                msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":148,"context_line":"                         \"less than already used \""},{"line_number":149,"context_line":"                         \"%(used)s\") %"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8Vg%3D","line":146,"updated":"2014-04-16 11:01:23.000000000","message":"Should the test be \u003e\u003d?","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"464d337a990429ea55f1101f3b3fb90cc61a38ea","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                QUOTA_SUPPORTED_RESOURCES[resource]).filter_by("},{"line_number":145,"context_line":"                tenant_id\u003dtenant_id).count()"},{"line_number":146,"context_line":"            if len(used_resources) \u003e limit:"},{"line_number":147,"context_line":"                msg \u003d (_(\"Quota value %(value)s for %(resource)s are \""},{"line_number":148,"context_line":"                         \"less than already used \""},{"line_number":149,"context_line":"                         \"%(used)s\") %"},{"line_number":150,"context_line":"                       {\u0027value\u0027: limit, \u0027resource\u0027: resource,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F8Vs%3D","line":147,"updated":"2014-04-16 11:01:23.000000000","message":"are -\u003e is\n\nBut may be better to say...\n\n\"Resource %(resource)s with usage %(used)s exceeds quota limit %(value)s\"","commit_id":"a1bb2b033bdf0c886c3e1c38982eafb85ef9bfce"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"76d3d9f29a3344b1b9698baf38d924c4c39132e1","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027pool\u0027: loadbalancer_db.Pool,"},{"line_number":36,"context_line":"    \u0027member\u0027: loadbalancer_db.Member,"},{"line_number":37,"context_line":"    \u0027health_monitor\u0027: loadbalancer_db.HealthMonitor"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Quota(model_base.BASEV2, models_v2.HasId):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2F13g%3D","line":38,"updated":"2014-04-17 02:29:19.000000000","message":"Hmm. This seems brittle. What if a new resource gets quota support? I am not familiar with the code design of quotas but shouldn\u0027t you use the QuotaEngine class for this mapping?","commit_id":"ce3df9839b3ae4dc9a3fcd9db85cc0afe0308455"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"373d06b7b41bcd1672072f82aac77373983800ec","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027pool\u0027: loadbalancer_db.Pool,"},{"line_number":36,"context_line":"    \u0027member\u0027: loadbalancer_db.Member,"},{"line_number":37,"context_line":"    \u0027health_monitor\u0027: loadbalancer_db.HealthMonitor"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Quota(model_base.BASEV2, models_v2.HasId):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2F1wk%3D","line":38,"in_reply_to":"AAAAXH%2F%2F13g%3D","updated":"2014-04-17 03:31:46.000000000","message":"thanks for your review, it isn\u0027t reasonable doing it like this, but I don\u0027t have better idea, now only the driver of \u0027DbQuotaDriver\u0027 could update resource\u0027s quota, so I put it there, do you have other good idea?","commit_id":"ce3df9839b3ae4dc9a3fcd9db85cc0afe0308455"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"b24807e06d88f52f22d78f3a5fef103a40ab5629","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027pool\u0027: loadbalancer_db.Pool,"},{"line_number":36,"context_line":"    \u0027member\u0027: loadbalancer_db.Member,"},{"line_number":37,"context_line":"    \u0027health_monitor\u0027: loadbalancer_db.HealthMonitor"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Quota(model_base.BASEV2, models_v2.HasId):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2F0hA%3D","line":38,"in_reply_to":"AAAAXH%2F%2F1NE%3D","updated":"2014-04-17 07:22:38.000000000","message":"thanks for your suggestion, I agree with you!","commit_id":"ce3df9839b3ae4dc9a3fcd9db85cc0afe0308455"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"b642158e9e5eb3ce71826996bc58dd31b59ed52d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027pool\u0027: loadbalancer_db.Pool,"},{"line_number":36,"context_line":"    \u0027member\u0027: loadbalancer_db.Member,"},{"line_number":37,"context_line":"    \u0027health_monitor\u0027: loadbalancer_db.HealthMonitor"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Quota(model_base.BASEV2, models_v2.HasId):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2F1NE%3D","line":38,"in_reply_to":"AAAAXH%2F%2F1wk%3D","updated":"2014-04-17 05:16:23.000000000","message":"Just for suggestion: 1. remove QUOTA_SUPPORTED_RESOURCES dict here and DbQuotaDriver._check_resource_in_use(context, tenant_id, resource, limit) but keep _check_resource_in_use function (add a \u0027used_resources\u0027 input parameter). 2. under https://github.com/openstack/neutron/blob/master/neutron/extensions/quotasv2.py#L106, add limit check such as \"used_resources \u003d QUOTAS.count(request.context, key)\nself._driver.check_resource_in_use(request.context, id, key, value, used_resources)\"","commit_id":"ce3df9839b3ae4dc9a3fcd9db85cc0afe0308455"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b0d4408393da40e13af773ae13c9d1e1a9f0c50d","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                context.session.add(tenant_quota)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"},{"line_number":116,"context_line":"    def check_resource_in_use(resource, limit, used_resources):"},{"line_number":117,"context_line":"        if limit !\u003d -1 and used_resources \u003e limit:"},{"line_number":118,"context_line":"            msg \u003d (_(\"Resource %(resource)s with usage %(used)s exceeds \""},{"line_number":119,"context_line":"                     \"quota limit %(value)s\") %"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FWRo%3D","line":116,"updated":"2014-04-22 11:47:34.000000000","message":"Is there a test case for this?","commit_id":"d4574702f0ce4a4bf0125903a47f76ecc9680744"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"38f896a45fbeef44dcc71c092c136ea10fe79442","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                context.session.add(tenant_quota)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @staticmethod"},{"line_number":116,"context_line":"    def check_resource_in_use(resource, limit, used_resources):"},{"line_number":117,"context_line":"        if limit !\u003d -1 and used_resources \u003e limit:"},{"line_number":118,"context_line":"            msg \u003d (_(\"Resource %(resource)s with usage %(used)s exceeds \""},{"line_number":119,"context_line":"                     \"quota limit %(value)s\") %"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FViM%3D","line":116,"in_reply_to":"AAAAXH%2F%2FWRo%3D","updated":"2014-04-22 12:52:26.000000000","message":"Done","commit_id":"d4574702f0ce4a4bf0125903a47f76ecc9680744"}],"neutron/extensions/quotasv2.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"c130350cf7ee4b3662dd9e2ae869b7dac65eb6e5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.api.v2 import base"},{"line_number":24,"context_line":"from neutron.api.v2 import resource"},{"line_number":25,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":26,"context_line":"from neutron.db import l3_db"},{"line_number":27,"context_line":"from neutron.db.loadbalancer import loadbalancer_db"},{"line_number":28,"context_line":"from neutron.db import models_v2"},{"line_number":29,"context_line":"from neutron.db import securitygroups_db"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F9XM%3D","line":26,"updated":"2014-04-16 09:06:04.000000000","message":"i think it\u0027s a wring dependency, please move QUOTA_SUPPORTED_RESOURCES definition to the place where it is actually needed. API extension usually doesn\u0027t depend on DB","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"2b5bb132de8fcfc4f0caa2e9ca29713e8961f31f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from neutron.api.v2 import base"},{"line_number":24,"context_line":"from neutron.api.v2 import resource"},{"line_number":25,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":26,"context_line":"from neutron.db import l3_db"},{"line_number":27,"context_line":"from neutron.db.loadbalancer import loadbalancer_db"},{"line_number":28,"context_line":"from neutron.db import models_v2"},{"line_number":29,"context_line":"from neutron.db import securitygroups_db"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F86g%3D","line":26,"in_reply_to":"AAAAXH%2F%2F9XM%3D","updated":"2014-04-16 10:06:49.000000000","message":"Done","commit_id":"caf10838ed60d2cec5fd96134bb86df7d251fd73"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"78014a467d033c554474344d16b469260316ae66","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            if key in [\u0027router\u0027, \u0027floatingip\u0027]:"},{"line_number":114,"context_line":"                used_plugin \u003d L3RouterPlugin()"},{"line_number":115,"context_line":"            elif key in [\u0027vip\u0027, \u0027pool\u0027, \u0027member\u0027, \u0027health_monitor\u0027]:"},{"line_number":116,"context_line":"                used_plugin \u003d LoadBalancerPlugin()"},{"line_number":117,"context_line":"            if used_plugin:"},{"line_number":118,"context_line":"                used_resources \u003d QUOTAS.count(request.context, key, used_plugin,"},{"line_number":119,"context_line":"                                              key + \u0027s\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2Fhk0%3D","line":116,"updated":"2014-04-20 13:26:09.000000000","message":"While i don\u0027t know why self._plugin can\u0027t be used directly, you can\u0027t hard coded the used_plugin here. Also unit test cases are necessary.","commit_id":"9e5ae54dd54197494f926e9ba8eae728142006e9"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"cc77d6b776887bdaa7b982fd7a51135c930b846a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            if key in [\u0027router\u0027, \u0027floatingip\u0027]:"},{"line_number":114,"context_line":"                used_plugin \u003d L3RouterPlugin()"},{"line_number":115,"context_line":"            elif key in [\u0027vip\u0027, \u0027pool\u0027, \u0027member\u0027, \u0027health_monitor\u0027]:"},{"line_number":116,"context_line":"                used_plugin \u003d LoadBalancerPlugin()"},{"line_number":117,"context_line":"            if used_plugin:"},{"line_number":118,"context_line":"                used_resources \u003d QUOTAS.count(request.context, key, used_plugin,"},{"line_number":119,"context_line":"                                              key + \u0027s\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAXH%2F%2FgoM%3D","line":116,"in_reply_to":"AAAAXH%2F%2Fhk0%3D","updated":"2014-04-21 02:20:45.000000000","message":"thanks for your review, \u0027self._plugin\u0027 is the core plugin, for example, I use ml2 plugin as core plugin, then I cantn\u0027t get \u0027floatingip\u0027 by  QUOTAS.count()","commit_id":"9e5ae54dd54197494f926e9ba8eae728142006e9"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e2bf7c4f97e26a8aff9e80976c8614c1f83607d4","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.manager import NeutronManager"},{"line_number":27,"context_line":"from neutron.openstack.common import importutils"},{"line_number":28,"context_line":"from neutron import quota"},{"line_number":29,"context_line":"from neutron.services.l3_router.l3_router_plugin import L3RouterPlugin"},{"line_number":30,"context_line":"from neutron.services.loadbalancer.plugin import LoadBalancerPlugin"},{"line_number":31,"context_line":"from neutron import wsgi"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2FfMo%3D","line":29,"updated":"2014-04-21 11:28:18.000000000","message":"unnecessary, see a commend below","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"8227b31927d692e277f8232dcd5e9b694510491f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.manager import NeutronManager"},{"line_number":27,"context_line":"from neutron.openstack.common import importutils"},{"line_number":28,"context_line":"from neutron import quota"},{"line_number":29,"context_line":"from neutron.services.l3_router.l3_router_plugin import L3RouterPlugin"},{"line_number":30,"context_line":"from neutron.services.loadbalancer.plugin import LoadBalancerPlugin"},{"line_number":31,"context_line":"from neutron import wsgi"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2FaJ8%3D","line":29,"in_reply_to":"AAAAXH%2F%2FfMo%3D","updated":"2014-04-22 01:45:07.000000000","message":"Done","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e2bf7c4f97e26a8aff9e80976c8614c1f83607d4","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            EXTENDED_ATTRIBUTES_2_0[RESOURCE_COLLECTION])"},{"line_number":108,"context_line":"        for key, value in body[self._resource_name].items():"},{"line_number":109,"context_line":"            used_plugin \u003d None"},{"line_number":110,"context_line":"            if key in [\u0027network\u0027, \u0027subnet\u0027, \u0027port\u0027, \u0027security_group\u0027,"},{"line_number":111,"context_line":"                       \u0027security_group_rule\u0027]:"},{"line_number":112,"context_line":"                used_plugin \u003d self._plugin"},{"line_number":113,"context_line":"            if key in [\u0027router\u0027, \u0027floatingip\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2FfNE%3D","line":110,"updated":"2014-04-21 11:28:18.000000000","message":"agree with a comment below; you need to introduce a mapping between resource and service type (CORE, L3, LOADBALANCER, etc) and based on that type you can:\n used_plugin \u003d NeutronManager.get_service_plugin(type)","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"8227b31927d692e277f8232dcd5e9b694510491f","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            EXTENDED_ATTRIBUTES_2_0[RESOURCE_COLLECTION])"},{"line_number":108,"context_line":"        for key, value in body[self._resource_name].items():"},{"line_number":109,"context_line":"            used_plugin \u003d None"},{"line_number":110,"context_line":"            if key in [\u0027network\u0027, \u0027subnet\u0027, \u0027port\u0027, \u0027security_group\u0027,"},{"line_number":111,"context_line":"                       \u0027security_group_rule\u0027]:"},{"line_number":112,"context_line":"                used_plugin \u003d self._plugin"},{"line_number":113,"context_line":"            if key in [\u0027router\u0027, \u0027floatingip\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2FaKA%3D","line":110,"in_reply_to":"AAAAXH%2F%2FfNE%3D","updated":"2014-04-22 01:45:07.000000000","message":"thanks for your good suggestion, I will try it as soon as posible!","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"6e99286101519e8292b133c433b0520b8b69f208","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                used_plugin \u003d LoadBalancerPlugin()"},{"line_number":117,"context_line":"            if used_plugin:"},{"line_number":118,"context_line":"                used_resources \u003d QUOTAS.count(request.context, key,"},{"line_number":119,"context_line":"                                              used_plugin, key + \u0027s\u0027,"},{"line_number":120,"context_line":"                                              request.context.tenant_id)"},{"line_number":121,"context_line":"                self._driver.check_resource_in_use(key, value, used_resources)"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2Fgbc%3D","line":119,"updated":"2014-04-21 04:51:39.000000000","message":"Doesn\u0027t (context, key) is enough for the count call?","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"7885e814bf4a7edb9956e7b41af0cdd185af79ba","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                used_plugin \u003d LoadBalancerPlugin()"},{"line_number":117,"context_line":"            if used_plugin:"},{"line_number":118,"context_line":"                used_resources \u003d QUOTAS.count(request.context, key,"},{"line_number":119,"context_line":"                                              used_plugin, key + \u0027s\u0027,"},{"line_number":120,"context_line":"                                              request.context.tenant_id)"},{"line_number":121,"context_line":"                self._driver.check_resource_in_use(key, value, used_resources)"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2FgGo%3D","line":119,"in_reply_to":"AAAAXH%2F%2FgbE%3D","updated":"2014-04-21 07:19:25.000000000","message":"Got it.  it actually calls _count_resource(context, plugin, resources, tenant_id) func. But i don\u0027t think the used_plugin design is correct considering more extensions. One suggestion: for base attributes \"network, subnet and port\" you can just use  self._plugin. For other all extensions, you can get the service_plugins through neutron.manager.NeutronManager\u0027s get_service_plugins. then the used_plugin would be service_plugins[key]. Didn\u0027t test it although.","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"1cd1084148a2f58767d2bfdead7242245cc7629a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                used_plugin \u003d LoadBalancerPlugin()"},{"line_number":117,"context_line":"            if used_plugin:"},{"line_number":118,"context_line":"                used_resources \u003d QUOTAS.count(request.context, key,"},{"line_number":119,"context_line":"                                              used_plugin, key + \u0027s\u0027,"},{"line_number":120,"context_line":"                                              request.context.tenant_id)"},{"line_number":121,"context_line":"                self._driver.check_resource_in_use(key, value, used_resources)"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2FgbE%3D","line":119,"in_reply_to":"AAAAXH%2F%2Fgbc%3D","updated":"2014-04-21 04:55:00.000000000","message":"no, QUOTAS.count() need 4 parameter, you can try it.","commit_id":"21ddc2c7d915176186b59e07c35724f8b65288f2"}]}
