)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"95db371f68b3a063ada114d6263c17a5a7ceed4f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"db/sqlalchemy/api.py quota_reserve() states that:"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"   # Negative in_use count indicates a desync, so try to"},{"line_number":12,"context_line":"   # heal from that..."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"To avoid displaying negative values while this happens, so similar to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_07895623","line":11,"updated":"2018-11-09 03:20:52.000000000","message":"Just curious, how we can get a negative in_use count?","commit_id":"b84ac0dff80fafbbd44e57a32086944196fee64b"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"17ffff0393efac94a832fa8aa78416056bb1a54b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"db/sqlalchemy/api.py quota_reserve() states that:"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"   # Negative in_use count indicates a desync, so try to"},{"line_number":12,"context_line":"   # heal from that..."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"To avoid displaying negative values while this happens, so similar to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_7241e607","line":11,"in_reply_to":"3f79a3b5_07895623","updated":"2018-11-09 04:36:47.000000000","message":"please refer to commit a3af3f87f5ca95e9b400dc15e7593746d01bc43a.","commit_id":"b84ac0dff80fafbbd44e57a32086944196fee64b"}],"cinder/tests/unit/api/contrib/test_used_limits.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"11ae6893f9362cb8ba72158bb5e2256d343ad33c","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.assertNotIn(\u0027totalVolumesUsed\u0027, abs_limits)"},{"line_number":118,"context_line":"        self.assertNotIn(\u0027totalGigabytesUsed\u0027, abs_limits)"},{"line_number":119,"context_line":"        self.assertNotIn(\u0027totalSnapshotsUsed\u0027, abs_limits)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @ddt.data((\u00272.0\u0027, False), (\u00273.38\u0027, True), (\u00273.38\u0027, False), (\u00273.39\u0027, True),"},{"line_number":122,"context_line":"              (\u00273.39\u0027, False))"},{"line_number":123,"context_line":"    @mock.patch(\u0027cinder.quota.QUOTAS.get_project_quotas\u0027)"},{"line_number":124,"context_line":"    @mock.patch(\u0027cinder.policy.enforce\u0027)"},{"line_number":125,"context_line":"    def test_used_limits_negative(self, ver_project, _mock_policy_enforce,"},{"line_number":126,"context_line":"                                  _mock_get_project_quotas):"},{"line_number":127,"context_line":"        version, has_project \u003d ver_project"},{"line_number":128,"context_line":"        fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":129,"context_line":"                                                        fake.PROJECT_ID,"},{"line_number":130,"context_line":"                                                        is_admin\u003dTrue),"},{"line_number":131,"context_line":"                               api_version\u003dversion)"},{"line_number":132,"context_line":"        if has_project:"},{"line_number":133,"context_line":"            fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":134,"context_line":"                                                            fake.PROJECT_ID,"},{"line_number":135,"context_line":"                                                            is_admin\u003dTrue),"},{"line_number":136,"context_line":"                                   filter\u003d{\u0027project_id\u0027: fake.UUID1},"},{"line_number":137,"context_line":"                                   api_version\u003dversion)"},{"line_number":138,"context_line":"        obj \u003d {"},{"line_number":139,"context_line":"            \"limits\": {"},{"line_number":140,"context_line":"                \"rate\": [],"},{"line_number":141,"context_line":"                \"absolute\": {},"},{"line_number":142,"context_line":"            },"},{"line_number":143,"context_line":"        }"},{"line_number":144,"context_line":"        res \u003d wsgi.ResponseObject(obj)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        def get_project_quotas(context, project_id, quota_class\u003dNone,"},{"line_number":147,"context_line":"                               defaults\u003dTrue, usages\u003dTrue):"},{"line_number":148,"context_line":"            if project_id \u003d\u003d fake.UUID1:"},{"line_number":149,"context_line":"                return {\"gigabytes\": {\u0027limit\u0027: 5, \u0027in_use\u0027: -1}}"},{"line_number":150,"context_line":"            return {\"gigabytes\": {\u0027limit\u0027: 10, \u0027in_use\u0027: -2}}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        _mock_get_project_quotas.side_effect \u003d get_project_quotas"},{"line_number":153,"context_line":"        # allow user to access used limits"},{"line_number":154,"context_line":"        _mock_policy_enforce.return_value \u003d None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        self.controller.index(fake_req, res)"},{"line_number":157,"context_line":"        abs_limits \u003d res.obj[\u0027limits\u0027][\u0027absolute\u0027]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        # if admin, only 3.39 and req contains project_id filter, cinder"},{"line_number":160,"context_line":"        # returns the specified project\u0027s quota."},{"line_number":161,"context_line":"        if version \u003d\u003d \u00273.39\u0027 and has_project:"},{"line_number":162,"context_line":"            self.assertEqual(0, abs_limits[\u0027totalGigabytesUsed\u0027])"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            self.assertEqual(0, abs_limits[\u0027totalGigabytesUsed\u0027])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":167,"context_line":"                                                        fake.PROJECT_ID),"},{"line_number":168,"context_line":"                               api_version\u003dversion)"},{"line_number":169,"context_line":"        if has_project:"},{"line_number":170,"context_line":"            fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":171,"context_line":"                                                            fake.PROJECT_ID),"},{"line_number":172,"context_line":"                                   filter\u003d{\u0027project_id\u0027: fake.UUID1},"},{"line_number":173,"context_line":"                                   api_version\u003dversion)"},{"line_number":174,"context_line":"        # if non-admin, cinder always returns self quota."},{"line_number":175,"context_line":"        self.controller.index(fake_req, res)"},{"line_number":176,"context_line":"        abs_limits \u003d res.obj[\u0027limits\u0027][\u0027absolute\u0027]"},{"line_number":177,"context_line":"        self.assertEqual(0, abs_limits[\u0027totalGigabytesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_91be67cc","line":177,"range":{"start_line":120,"start_character":0,"end_line":177,"end_character":61},"updated":"2018-11-05 09:41:19.000000000","message":"I think the only difference between this test and the test at L#50 is of nested get_project_quotas function,\nIt would be better if these two can be combined into one test or the code can be reused by putting common things in a separate func.","commit_id":"24c5c62db11686d7a2abe9935a9f28805d230842"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"4fc3d441ebb6428f4831f983323de4bc43206926","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.assertNotIn(\u0027totalVolumesUsed\u0027, abs_limits)"},{"line_number":118,"context_line":"        self.assertNotIn(\u0027totalGigabytesUsed\u0027, abs_limits)"},{"line_number":119,"context_line":"        self.assertNotIn(\u0027totalSnapshotsUsed\u0027, abs_limits)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @ddt.data((\u00272.0\u0027, False), (\u00273.38\u0027, True), (\u00273.38\u0027, False), (\u00273.39\u0027, True),"},{"line_number":122,"context_line":"              (\u00273.39\u0027, False))"},{"line_number":123,"context_line":"    @mock.patch(\u0027cinder.quota.QUOTAS.get_project_quotas\u0027)"},{"line_number":124,"context_line":"    @mock.patch(\u0027cinder.policy.enforce\u0027)"},{"line_number":125,"context_line":"    def test_used_limits_negative(self, ver_project, _mock_policy_enforce,"},{"line_number":126,"context_line":"                                  _mock_get_project_quotas):"},{"line_number":127,"context_line":"        version, has_project \u003d ver_project"},{"line_number":128,"context_line":"        fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":129,"context_line":"                                                        fake.PROJECT_ID,"},{"line_number":130,"context_line":"                                                        is_admin\u003dTrue),"},{"line_number":131,"context_line":"                               api_version\u003dversion)"},{"line_number":132,"context_line":"        if has_project:"},{"line_number":133,"context_line":"            fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":134,"context_line":"                                                            fake.PROJECT_ID,"},{"line_number":135,"context_line":"                                                            is_admin\u003dTrue),"},{"line_number":136,"context_line":"                                   filter\u003d{\u0027project_id\u0027: fake.UUID1},"},{"line_number":137,"context_line":"                                   api_version\u003dversion)"},{"line_number":138,"context_line":"        obj \u003d {"},{"line_number":139,"context_line":"            \"limits\": {"},{"line_number":140,"context_line":"                \"rate\": [],"},{"line_number":141,"context_line":"                \"absolute\": {},"},{"line_number":142,"context_line":"            },"},{"line_number":143,"context_line":"        }"},{"line_number":144,"context_line":"        res \u003d wsgi.ResponseObject(obj)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        def get_project_quotas(context, project_id, quota_class\u003dNone,"},{"line_number":147,"context_line":"                               defaults\u003dTrue, usages\u003dTrue):"},{"line_number":148,"context_line":"            if project_id \u003d\u003d fake.UUID1:"},{"line_number":149,"context_line":"                return {\"gigabytes\": {\u0027limit\u0027: 5, \u0027in_use\u0027: -1}}"},{"line_number":150,"context_line":"            return {\"gigabytes\": {\u0027limit\u0027: 10, \u0027in_use\u0027: -2}}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        _mock_get_project_quotas.side_effect \u003d get_project_quotas"},{"line_number":153,"context_line":"        # allow user to access used limits"},{"line_number":154,"context_line":"        _mock_policy_enforce.return_value \u003d None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        self.controller.index(fake_req, res)"},{"line_number":157,"context_line":"        abs_limits \u003d res.obj[\u0027limits\u0027][\u0027absolute\u0027]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        # if admin, only 3.39 and req contains project_id filter, cinder"},{"line_number":160,"context_line":"        # returns the specified project\u0027s quota."},{"line_number":161,"context_line":"        if version \u003d\u003d \u00273.39\u0027 and has_project:"},{"line_number":162,"context_line":"            self.assertEqual(0, abs_limits[\u0027totalGigabytesUsed\u0027])"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            self.assertEqual(0, abs_limits[\u0027totalGigabytesUsed\u0027])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":167,"context_line":"                                                        fake.PROJECT_ID),"},{"line_number":168,"context_line":"                               api_version\u003dversion)"},{"line_number":169,"context_line":"        if has_project:"},{"line_number":170,"context_line":"            fake_req \u003d FakeRequest(fakes.FakeRequestContext(fake.USER_ID,"},{"line_number":171,"context_line":"                                                            fake.PROJECT_ID),"},{"line_number":172,"context_line":"                                   filter\u003d{\u0027project_id\u0027: fake.UUID1},"},{"line_number":173,"context_line":"                                   api_version\u003dversion)"},{"line_number":174,"context_line":"        # if non-admin, cinder always returns self quota."},{"line_number":175,"context_line":"        self.controller.index(fake_req, res)"},{"line_number":176,"context_line":"        abs_limits \u003d res.obj[\u0027limits\u0027][\u0027absolute\u0027]"},{"line_number":177,"context_line":"        self.assertEqual(0, abs_limits[\u0027totalGigabytesUsed\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_9ea89d74","line":177,"range":{"start_line":120,"start_character":0,"end_line":177,"end_character":61},"in_reply_to":"3f79a3b5_91be67cc","updated":"2018-11-06 06:35:51.000000000","message":"Combined into one test. Thanks Rajat.","commit_id":"24c5c62db11686d7a2abe9935a9f28805d230842"}]}
