)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8358,"name":"zhangguoqing","email":"zhang.guoqing@99cloud.net","username":"zhangguoqing"},"change_message_id":"129aa6b8f5f1a40ceb537afb900613ecf7168e68","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"bacf61ea_9a68bcf6","line":13,"updated":"2016-08-02 12:17:03.000000000","message":"Implements: blueprint get-total-price-by-tenant-and-user","commit_id":"1fa1742f0308a165b48906862959e3cd26f10d02"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Get total price by tenant_id and user_id"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Get total price by tenant_id and user_id."},{"line_number":10,"context_line":"Ceilometer_collector collects resources by tenant and user."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint get-total-price-by-tenant-and-user"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3ac371cc_2489b2cb","line":9,"updated":"2016-08-13 19:34:18.000000000","message":"Can you be more descriptive about the change you want to add?\n\nI seems that it adds some important features, so they\nneed to be well described.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Get total price by tenant_id and user_id."},{"line_number":10,"context_line":"Ceilometer_collector collects resources by tenant and user."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint get-total-price-by-tenant-and-user"},{"line_number":13,"context_line":"Change-Id: I9bb41e3ddb233a7c3d948dd0136df66661ac7a53"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3ac371cc_6493aafb","line":12,"updated":"2016-08-13 19:34:18.000000000","message":"Can you update the blueprint? It doesn\u0027t seem to exist at the moment.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Get total price by tenant_id and user_id."},{"line_number":10,"context_line":"Ceilometer_collector collects resources by tenant and user."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint get-total-price-by-tenant-and-user"},{"line_number":13,"context_line":"Change-Id: I9bb41e3ddb233a7c3d948dd0136df66661ac7a53"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3ac371cc_0a091f32","line":12,"in_reply_to":"3ac371cc_6493aafb","updated":"2016-08-14 00:51:56.000000000","message":"What do you mean \"update\"? Currently, we have a BP in launchpad.\nhttps://blueprints.launchpad.net/cloudkitty/+spec/get-total-price-by-tenant-and-user","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"}],"cloudkitty/api/v1/controllers/storage.py":[{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                         wtypes.text)"},{"line_number":41,"context_line":"    def get_all(self, begin, end, tenant_id\u003dNone,"},{"line_number":42,"context_line":"                user_id\u003dNone, resource_type\u003dNone):"},{"line_number":43,"context_line":"        \"\"\"Return a list of rated resources for a time period and a tenant and a user."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param begin: Start of the period"},{"line_number":46,"context_line":"        :param end: End of the period"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_24a372a0","line":43,"updated":"2016-08-13 19:34:18.000000000","message":"Can you replace the first \"and\" by a comma?","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                         wtypes.text)"},{"line_number":41,"context_line":"    def get_all(self, begin, end, tenant_id\u003dNone,"},{"line_number":42,"context_line":"                user_id\u003dNone, resource_type\u003dNone):"},{"line_number":43,"context_line":"        \"\"\"Return a list of rated resources for a time period and a tenant and a user."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param begin: Start of the period"},{"line_number":46,"context_line":"        :param end: End of the period"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_6a4ed3c2","line":43,"in_reply_to":"3ac371cc_24a372a0","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"}],"cloudkitty/collector/gnocchi.py":[{"author":{"_account_id":8358,"name":"zhangguoqing","email":"zhang.guoqing@99cloud.net","username":"zhangguoqing"},"change_message_id":"129aa6b8f5f1a40ceb537afb900613ecf7168e68","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            start,"},{"line_number":304,"context_line":"            end,"},{"line_number":305,"context_line":"            project_id\u003dproject_id,"},{"line_number":306,"context_line":"            user_id\u003dproject_id,"},{"line_number":307,"context_line":"            q_filter\u003dq_filter)"},{"line_number":308,"context_line":"        if not resources:"},{"line_number":309,"context_line":"            raise collector.NoDataCollected(self.collector_name, resource_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_48515fd8","line":306,"range":{"start_line":306,"start_character":20,"end_line":306,"end_character":30},"updated":"2016-08-02 12:17:03.000000000","message":"Isn\u0027t it user_id?","commit_id":"1fa1742f0308a165b48906862959e3cd26f10d02"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"81edc281cdd9189ca5d81d758a206a3827a68957","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            start,"},{"line_number":304,"context_line":"            end,"},{"line_number":305,"context_line":"            project_id\u003dproject_id,"},{"line_number":306,"context_line":"            user_id\u003dproject_id,"},{"line_number":307,"context_line":"            q_filter\u003dq_filter)"},{"line_number":308,"context_line":"        if not resources:"},{"line_number":309,"context_line":"            raise collector.NoDataCollected(self.collector_name, resource_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_9c3435fc","line":306,"range":{"start_line":306,"start_character":20,"end_line":306,"end_character":30},"in_reply_to":"bacf61ea_48515fd8","updated":"2016-08-02 13:31:36.000000000","message":"umm,yeah.","commit_id":"1fa1742f0308a165b48906862959e3cd26f10d02"}],"cloudkitty/orchestrator.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"c658bf927bac5c7ad283c40c5532502bd93d1e90","unresolved":false,"context_lines":[{"line_number":210,"context_line":"                        end \u003d begin + self._period"},{"line_number":211,"context_line":"                        for processor in self._processors:"},{"line_number":212,"context_line":"                            processor.obj.nodata(begin, end)"},{"line_number":213,"context_line":"                        self._storage.nodata(begin, end, self._tenant_id)"},{"line_number":214,"context_line":"                    else:"},{"line_number":215,"context_line":"                        # Rating"},{"line_number":216,"context_line":"                        for processor in self._processors:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_21dcbae3","line":213,"range":{"start_line":213,"start_character":24,"end_line":213,"end_character":73},"updated":"2016-11-16 11:10:05.000000000","message":"I have a Traceback here, apparently user_id is missing:\n\nTraceback (most recent call last):\n  File \"/usr/local/bin/cloudkitty-processor\", line 10, in \u003cmodule\u003e\n    sys.exit(main())\n  File \"/cloudkitty/cloudkitty/cli/processor.py\", line 28, in main\n    processor.process()\n  File \"/cloudkitty/cloudkitty/orchestrator.py\", line 310, in process\n    worker.run()\n  File \"/cloudkitty/cloudkitty/orchestrator.py\", line 213, in run\n    self._storage.nodata(begin, end, self._tenant_id)\nTypeError: nodata() takes exactly 5 arguments (4 given)","commit_id":"424ecd46a3e541a531654642a6576578cad7818d"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"45fc7284d4060c2275f1a2fb6ee71d4bba50a305","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        # Writing"},{"line_number":220,"context_line":"                        self._storage.append(data, self._tenant_id)"},{"line_number":221,"context_line":"                    # We\u0027re getting a full period so we directly commit"},{"line_number":222,"context_line":"                    self._storage.commit(self._tenant_id)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"class Orchestrator(object):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a77a97e_8864c722","line":222,"range":{"start_line":222,"start_character":20,"end_line":222,"end_character":57},"updated":"2016-11-16 14:23:47.000000000","message":"user_id is missing here","commit_id":"23408751a732d53baa2f2741cf69d956e58d5612"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e19e76b3beec3ae6580b4ee45348e84da4d995e6","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                        for processor in self._processors:"},{"line_number":218,"context_line":"                            processor.obj.process(data)"},{"line_number":219,"context_line":"                        # Writing"},{"line_number":220,"context_line":"                        self._storage.append(data, self._tenant_id)"},{"line_number":221,"context_line":"                    # We\u0027re getting a full period so we directly commit"},{"line_number":222,"context_line":"                    self._storage.commit(self._tenant_id, member)"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a77a97e_5dbf6f60","line":220,"range":{"start_line":220,"start_character":24,"end_line":220,"end_character":67},"updated":"2016-11-18 09:11:32.000000000","message":"user_id is missing here.","commit_id":"af96e150fc0444e93f9b439e1434f58129ebb4e3"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"f253341135a933bb0050c0546d0049af81f9361f","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            for service in CONF.collect.services:"},{"line_number":192,"context_line":"                for member in self._tenant_members:"},{"line_number":193,"context_line":"                    try:"},{"line_number":194,"context_line":"                        timestamp \u003d self.check_state(member)"},{"line_number":195,"context_line":"                        if not timestamp:"},{"line_number":196,"context_line":"                            continue"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"7a77a97e_c162263d","line":194,"range":{"start_line":194,"start_character":24,"end_line":194,"end_character":60},"updated":"2016-11-22 17:20:03.000000000","message":"The timestamp should be updated once, not for each service. Currently, only the first service is collected, because the timestamp is None for the following ones.","commit_id":"51bed802021583d4ca5f13300af5de4d4df5392c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"f253341135a933bb0050c0546d0049af81f9361f","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                    try:"},{"line_number":194,"context_line":"                        timestamp \u003d self.check_state(member)"},{"line_number":195,"context_line":"                        if not timestamp:"},{"line_number":196,"context_line":"                            continue"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"                        try:"},{"line_number":199,"context_line":"                            data \u003d self._collect(service, timestamp, member)"}],"source_content_type":"text/x-python","patch_set":27,"id":"7a77a97e_01d41ebb","line":196,"range":{"start_line":196,"start_character":28,"end_line":196,"end_character":36},"updated":"2016-11-22 17:20:03.000000000","message":"Removing \u0027break\u0027 causes the while True loop at l.190 to never stop.","commit_id":"51bed802021583d4ca5f13300af5de4d4df5392c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"f253341135a933bb0050c0546d0049af81f9361f","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                                            self.storage,"},{"line_number":309,"context_line":"                                            tenant,"},{"line_number":310,"context_line":"                                            members)"},{"line_number":311,"context_line":"                            worker.run()"},{"line_number":312,"context_line":"                        lock.release()"},{"line_number":313,"context_line":"                    self.coord.heartbeat()"},{"line_number":314,"context_line":"                # NOTE(sheeprine): Slow down looping if all tenants are"}],"source_content_type":"text/x-python","patch_set":27,"id":"7a77a97e_817caeb6","line":311,"range":{"start_line":311,"start_character":28,"end_line":311,"end_character":40},"updated":"2016-11-22 17:20:03.000000000","message":"The loop in run() never stops, only one worker is spawned","commit_id":"51bed802021583d4ca5f13300af5de4d4df5392c"}],"cloudkitty/storage/__init__.py":[{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _pre_commit(self, tenant_id, user_id):"},{"line_number":103,"context_line":"        \"\"\"Called before every commit."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        :param tenant_id: tenant_id which information must be committed."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_c4b41ed3","line":105,"updated":"2016-08-13 19:34:18.000000000","message":"Can you update the doc string?","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _pre_commit(self, tenant_id, user_id):"},{"line_number":103,"context_line":"        \"\"\"Called before every commit."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        :param tenant_id: tenant_id which information must be committed."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_6a06d321","line":105,"in_reply_to":"3ac371cc_c4b41ed3","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def _commit(self, tenant_id, user_id):"},{"line_number":110,"context_line":"        \"\"\"Push data to the storage backend."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param tenant_id: tenant_id which information must be committed."},{"line_number":113,"context_line":"        \"\"\""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _post_commit(self, tenant_id, user_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_24ca5250","line":112,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def _commit(self, tenant_id, user_id):"},{"line_number":110,"context_line":"        \"\"\"Push data to the storage backend."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        :param tenant_id: tenant_id which information must be committed."},{"line_number":113,"context_line":"        \"\"\""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _post_commit(self, tenant_id, user_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_4a031710","line":112,"in_reply_to":"3ac371cc_24ca5250","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def _post_commit(self, tenant_id, user_id):"},{"line_number":116,"context_line":"        \"\"\"Called after every commit."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        :param tenant_id: tenant_id which information must be committed."},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":"        if (tenant_id, user_id) in self._has_data:"},{"line_number":121,"context_line":"            del self._has_data[(tenant_id, user_id)]"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_04c75646","line":118,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def _post_commit(self, tenant_id, user_id):"},{"line_number":116,"context_line":"        \"\"\"Called after every commit."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        :param tenant_id: tenant_id which information must be committed."},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":"        if (tenant_id, user_id) in self._has_data:"},{"line_number":121,"context_line":"            del self._has_data[(tenant_id, user_id)]"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_adfe2503","line":118,"in_reply_to":"3ac371cc_04c75646","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \"\"\"Process rated data."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        :param data: The rated data frames."},{"line_number":129,"context_line":"        :param tenant_id: tenant_id which data must be dispatched to."},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _update_start(self, begin, tenant_id, user_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_44c14e2e","line":129,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \"\"\"Process rated data."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        :param data: The rated data frames."},{"line_number":129,"context_line":"        :param tenant_id: tenant_id which data must be dispatched to."},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _update_start(self, begin, tenant_id, user_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_8d03690d","line":129,"in_reply_to":"3ac371cc_44c14e2e","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\"Update usage_start with a new timestamp."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        :param begin: New usage beginning timestamp."},{"line_number":136,"context_line":"        :param tenant_id: tenant_id to update."},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        self.usage_start[(tenant_id, user_id)] \u003d begin"},{"line_number":139,"context_line":"        self.usage_start_dt[(tenant_id, user_id)] \u003d ck_utils.ts2dt(begin)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_a4dc8219","line":136,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        \"\"\"Update usage_start with a new timestamp."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        :param begin: New usage beginning timestamp."},{"line_number":136,"context_line":"        :param tenant_id: tenant_id to update."},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        self.usage_start[(tenant_id, user_id)] \u003d begin"},{"line_number":139,"context_line":"        self.usage_start_dt[(tenant_id, user_id)] \u003d ck_utils.ts2dt(begin)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_ed081d2b","line":136,"in_reply_to":"3ac371cc_a4dc8219","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \"\"\"Update usage_end with a new timestamp."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        :param end: New usage end timestamp."},{"line_number":145,"context_line":"        :param tenant_id: tenant_id to update."},{"line_number":146,"context_line":"        \"\"\""},{"line_number":147,"context_line":"        self.usage_end[(tenant_id, user_id)] \u003d end"},{"line_number":148,"context_line":"        self.usage_end_dt[(tenant_id, user_id)] \u003d ck_utils.ts2dt(end)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_84e186d3","line":145,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \"\"\"Update usage_end with a new timestamp."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        :param end: New usage end timestamp."},{"line_number":145,"context_line":"        :param tenant_id: tenant_id to update."},{"line_number":146,"context_line":"        \"\"\""},{"line_number":147,"context_line":"        self.usage_end[(tenant_id, user_id)] \u003d end"},{"line_number":148,"context_line":"        self.usage_end_dt[(tenant_id, user_id)] \u003d ck_utils.ts2dt(end)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_cd0d6139","line":145,"in_reply_to":"3ac371cc_84e186d3","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def _clear_usage_info(self, tenant_id, user_id):"},{"line_number":151,"context_line":"        \"\"\"Clear usage information timestamps."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param tenant_id: tenant_id which information needs to be removed."},{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        self.usage_start.pop((tenant_id, user_id), None)"},{"line_number":156,"context_line":"        self.usage_start_dt.pop((tenant_id, user_id), None)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_c4eb7eaf","line":153,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    def _clear_usage_info(self, tenant_id, user_id):"},{"line_number":151,"context_line":"        \"\"\"Clear usage information timestamps."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param tenant_id: tenant_id which information needs to be removed."},{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        self.usage_start.pop((tenant_id, user_id), None)"},{"line_number":156,"context_line":"        self.usage_start_dt.pop((tenant_id, user_id), None)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_2d13555e","line":153,"in_reply_to":"3ac371cc_c4eb7eaf","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        \"\"\"Check if the period for a given tenant must be committed."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        :param usage_start: Start of the period."},{"line_number":164,"context_line":"        :param tenant_id: tenant_id to check for."},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        usage_end \u003d self.usage_end.get((tenant_id, user_id))"},{"line_number":167,"context_line":"        if usage_end is not None and usage_start \u003e\u003d usage_end:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_24d1b2fc","line":164,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        \"\"\"Check if the period for a given tenant must be committed."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        :param usage_start: Start of the period."},{"line_number":164,"context_line":"        :param tenant_id: tenant_id to check for."},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        usage_end \u003d self.usage_end.get((tenant_id, user_id))"},{"line_number":167,"context_line":"        if usage_end is not None and usage_start \u003e\u003d usage_end:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_0d10194e","line":164,"in_reply_to":"3ac371cc_24d1b2fc","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self._update_end(usage_start + self._period, tenant_id, user_id)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @abc.abstractmethod"},{"line_number":174,"context_line":"    def get_state(self, tenant_id\u003dNone):"},{"line_number":175,"context_line":"        \"\"\"Return the last written frame\u0027s timestamp."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :param tenant_id: tenant_id to filter on."}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_84086693","line":174,"updated":"2016-08-13 19:34:18.000000000","message":"Why didn\u0027t you change this method as well?","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self._update_end(usage_start + self._period, tenant_id, user_id)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @abc.abstractmethod"},{"line_number":174,"context_line":"    def get_state(self, tenant_id\u003dNone):"},{"line_number":175,"context_line":"        \"\"\"Return the last written frame\u0027s timestamp."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :param tenant_id: tenant_id to filter on."}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_6d1d4d66","line":174,"in_reply_to":"3ac371cc_84086693","updated":"2016-08-14 00:51:56.000000000","message":"Sorry, will be fixed.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        :param tenant_id: (Optional) Filter on the tenant_id."},{"line_number":215,"context_line":"        :type res_type: str"},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def append(self, raw_data, tenant_id, user_id):"},{"line_number":219,"context_line":"        \"\"\"Append rated data before committing them to the backend."},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_441dcebc","line":217,"updated":"2016-08-13 19:34:18.000000000","message":"I think you should declare a get_total_by_tenant_and_user abstract method here.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        :param tenant_id: (Optional) Filter on the tenant_id."},{"line_number":215,"context_line":"        :type res_type: str"},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def append(self, raw_data, tenant_id, user_id):"},{"line_number":219,"context_line":"        \"\"\"Append rated data before committing them to the backend."},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_4d1a1170","line":217,"in_reply_to":"3ac371cc_441dcebc","updated":"2016-08-14 00:51:56.000000000","message":"Yes, will be added.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        \"\"\"Append rated data before committing them to the backend."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        :param raw_data: The rated data frames."},{"line_number":222,"context_line":"        :param tenant_id: Tenant the frame is belonging to."},{"line_number":223,"context_line":"        \"\"\""},{"line_number":224,"context_line":"        while raw_data:"},{"line_number":225,"context_line":"            usage_start, data \u003d self._filter_period(raw_data)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_04f59682","line":222,"updated":"2016-08-13 19:34:18.000000000","message":"Please update the docstring.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        \"\"\"Append rated data before committing them to the backend."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        :param raw_data: The rated data frames."},{"line_number":222,"context_line":"        :param tenant_id: Tenant the frame is belonging to."},{"line_number":223,"context_line":"        \"\"\""},{"line_number":224,"context_line":"        while raw_data:"},{"line_number":225,"context_line":"            usage_start, data \u003d self._filter_period(raw_data)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_ad2585af","line":222,"in_reply_to":"3ac371cc_04f59682","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        :param begin: Begin of the period with no data."},{"line_number":233,"context_line":"        :param end: End of the period with no data."},{"line_number":234,"context_line":"        :param tenant_id: Tenant to update with no data marker for the period."},{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":"        self._check_commit(begin, tenant_id, user_id)"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_64f28a9c","line":234,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        :param begin: Begin of the period with no data."},{"line_number":233,"context_line":"        :param end: End of the period with no data."},{"line_number":234,"context_line":"        :param tenant_id: Tenant to update with no data marker for the period."},{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":"        self._check_commit(begin, tenant_id, user_id)"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_8d2a497d","line":234,"in_reply_to":"3ac371cc_64f28a9c","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    def commit(self, tenant_id, user_id):"},{"line_number":239,"context_line":"        \"\"\"Commit the changes to the backend."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        :param tenant_id: Tenant the changes belong to."},{"line_number":242,"context_line":"        \"\"\""},{"line_number":243,"context_line":"        self._pre_commit(tenant_id, user_id)"},{"line_number":244,"context_line":"        self._commit(tenant_id, user_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_a42ac2e5","line":241,"updated":"2016-08-13 19:34:18.000000000","message":"Same.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    def commit(self, tenant_id, user_id):"},{"line_number":239,"context_line":"        \"\"\"Commit the changes to the backend."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        :param tenant_id: Tenant the changes belong to."},{"line_number":242,"context_line":"        \"\"\""},{"line_number":243,"context_line":"        self._pre_commit(tenant_id, user_id)"},{"line_number":244,"context_line":"        self._commit(tenant_id, user_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_ed1f7d59","line":241,"in_reply_to":"3ac371cc_a42ac2e5","updated":"2016-08-14 00:51:56.000000000","message":"Done","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"c658bf927bac5c7ad283c40c5532502bd93d1e90","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            self._check_commit(usage_start, tenant_id, user_id)"},{"line_number":242,"context_line":"            self._dispatch(data, tenant_id, user_id)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def nodata(self, begin, end, tenant_id, user_id):"},{"line_number":245,"context_line":"        \"\"\"Append a no data frame to the storage backend."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        :param begin: Begin of the period with no data."}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_d3ff5dff","line":244,"range":{"start_line":244,"start_character":42,"end_line":244,"end_character":51},"updated":"2016-11-16 11:10:05.000000000","message":"This parameter is missing in /cloudkitty/orchestrator.py at line 213.","commit_id":"424ecd46a3e541a531654642a6576578cad7818d"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"45fc7284d4060c2275f1a2fb6ee71d4bba50a305","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @abc.abstractmethod"},{"line_number":110,"context_line":"    def _commit(self, tenant_id, user_id):"},{"line_number":111,"context_line":"        \"\"\"Push data to the storage backend."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        :param tenant_id: tenant_id which information must be committed."}],"source_content_type":"text/x-python","patch_set":20,"id":"7a77a97e_88bda76a","line":110,"range":{"start_line":110,"start_character":31,"end_line":110,"end_character":40},"updated":"2016-11-16 14:23:47.000000000","message":"New parameter","commit_id":"23408751a732d53baa2f2741cf69d956e58d5612"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"e19e76b3beec3ae6580b4ee45348e84da4d995e6","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        :type res_type: str"},{"line_number":230,"context_line":"        \"\"\""},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def append(self, raw_data, tenant_id, user_id):"},{"line_number":233,"context_line":"        \"\"\"Append rated data before committing them to the backend."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        :param raw_data: The rated data frames."}],"source_content_type":"text/x-python","patch_set":24,"id":"7a77a97e_dd57ff55","line":232,"range":{"start_line":232,"start_character":40,"end_line":232,"end_character":50},"updated":"2016-11-18 09:11:32.000000000","message":"The function takes a new parameter","commit_id":"af96e150fc0444e93f9b439e1434f58129ebb4e3"}],"cloudkitty/storage/sqlalchemy/__init__.py":[{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        rate \u003d q.scalar()"},{"line_number":110,"context_line":"        return rate"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def get_total_by_tenant_and_user(self, begin\u003dNone, end\u003dNone,"},{"line_number":113,"context_line":"                                     tenant_id\u003dNone,"},{"line_number":114,"context_line":"                                     user_id\u003dNone,"},{"line_number":115,"context_line":"                                     service\u003dNone):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_c487fed5","line":112,"updated":"2016-08-13 19:34:18.000000000","message":"Maybe you could reuse the get_total method?","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        rate \u003d q.scalar()"},{"line_number":110,"context_line":"        return rate"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def get_total_by_tenant_and_user(self, begin\u003dNone, end\u003dNone,"},{"line_number":113,"context_line":"                                     tenant_id\u003dNone,"},{"line_number":114,"context_line":"                                     user_id\u003dNone,"},{"line_number":115,"context_line":"                                     service\u003dNone):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_aa49eb90","line":112,"in_reply_to":"3ac371cc_c487fed5","updated":"2016-08-14 00:51:56.000000000","message":"Yes, you mean it.\nHowever, the \"get_total\" API is currently used in cloudkittyclient and cloudkitty-dashboard.\nThose two components need to change the API calling as well.\nI hesitated to do so.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8cd000aa0997e9a4288ddbff28d5266367d01610","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                self.frame_model.tenant_id \u003d\u003d tenant_id)"},{"line_number":106,"context_line":"        if user_id:"},{"line_number":107,"context_line":"            q \u003d q.filter("},{"line_number":108,"context_line":"                self.frame_model.user_id \u003d\u003d user_id)"},{"line_number":109,"context_line":"        if service:"},{"line_number":110,"context_line":"            q \u003d q.filter("},{"line_number":111,"context_line":"                self.frame_model.res_type \u003d\u003d service)"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_10bafc6e","line":108,"range":{"start_line":108,"start_character":16,"end_line":108,"end_character":51},"updated":"2016-11-21 09:44:56.000000000","message":"I\u0027ve got a traceback when using gnocchihybrid storage:\n\nTraceback (most recent call last):\n  File \"/usr/local/bin/cloudkitty-processor\", line 10, in \u003cmodule\u003e\n    sys.exit(main())\n  File \"/cloudkitty/cloudkitty/cli/processor.py\", line 26, in main\n    processor.process()\n  File \"/cloudkitty/cloudkitty/orchestrator.py\", line 311, in process\n    worker.run()\n  File \"/cloudkitty/cloudkitty/orchestrator.py\", line 194, in run\n    timestamp \u003d self.check_state(member)\n  File \"/cloudkitty/cloudkitty/orchestrator.py\", line 178, in check_state\n    timestamp \u003d self._storage.get_state(self._tenant_id, member)\n  File \"/cloudkitty/cloudkitty/storage/sqlalchemy/__init__.py\", line 83, in get_state\n    self.frame_model.user_id \u003d\u003d user_id)\nAttributeError: type object \u0027HybridRatedDataframe\u0027 has no attribute \u0027user_id\u0027","commit_id":"8efda2ab0a97fb816beba9e49974d0bb7777048c"}],"cloudkitty/storage/sqlalchemy/alembic/versions/85f7dt96523_added_user_informations.py":[{"author":{"_account_id":8358,"name":"zhangguoqing","email":"zhang.guoqing@99cloud.net","username":"zhangguoqing"},"change_message_id":"b522d4421df7aee5b87f425b0a75277cf259596f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"def upgrade():"},{"line_number":20,"context_line":"    op.add_column(\u0027rated_data_frames\u0027,"},{"line_number":21,"context_line":"                  sa.Column(\u0027user_id\u0027, sa.String(length\u003d32), nullable\u003dTrue))"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def downgrade():"},{"line_number":25,"context_line":"    op.drop_column(\u0027rated_data_frames\u0027, \u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_61aa5587","line":25,"range":{"start_line":22,"start_character":0,"end_line":25,"end_character":50},"updated":"2016-08-03 04:29:08.000000000","message":"Downgrade methods are supposed to be removed.\n\nhttps://blueprints.launchpad.net/cloudkitty/+spec/remove-schema-downgrades","commit_id":"b7a58a6d188ee28ff4597e4a3977417915f8ee5e"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"3ac371cc_246d3233","line":22,"updated":"2016-08-13 19:34:18.000000000","message":"Please add a downgrade function as well.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"3ac371cc_0a5bdf55","line":22,"in_reply_to":"3ac371cc_246d3233","updated":"2016-08-14 00:51:56.000000000","message":"Downgrade method is going to be removed in the future.\nAnd we have a BP doing the stuff.\nhttps://blueprints.launchpad.net/cloudkitty/+spec/remove-schema-downgrades","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"}],"cloudkitty/storage/sqlalchemy/models.py":[{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8cd000aa0997e9a4288ddbff28d5266367d01610","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                           primary_key\u003dTrue)"},{"line_number":39,"context_line":"    tenant_id \u003d sqlalchemy.Column(sqlalchemy.String(32),"},{"line_number":40,"context_line":"                                  nullable\u003dTrue)"},{"line_number":41,"context_line":"    user_id \u003d sqlalchemy.Column(sqlalchemy.String(32),"},{"line_number":42,"context_line":"                                nullable\u003dTrue)"},{"line_number":43,"context_line":"    begin \u003d sqlalchemy.Column(sqlalchemy.DateTime,"},{"line_number":44,"context_line":"                              nullable\u003dFalse)"},{"line_number":45,"context_line":"    end \u003d sqlalchemy.Column(sqlalchemy.DateTime,"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_ab80f94a","line":42,"range":{"start_line":41,"start_character":3,"end_line":42,"end_character":46},"updated":"2016-11-21 09:44:56.000000000","message":"This modification needs to be done for Gnocchihybrid storage too.","commit_id":"8efda2ab0a97fb816beba9e49974d0bb7777048c"},{"author":{"_account_id":23060,"name":"Luka Peschke","email":"mail@lukapeschke.com","username":"lukapeschke"},"change_message_id":"8cd000aa0997e9a4288ddbff28d5266367d01610","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        res_dict[\u0027desc\u0027] \u003d json.loads(self.desc)"},{"line_number":72,"context_line":"        res_dict[\u0027vol\u0027] \u003d vol_dict"},{"line_number":73,"context_line":"        res_dict[\u0027tenant_id\u0027] \u003d self.tenant_id"},{"line_number":74,"context_line":"        res_dict[\u0027user_id\u0027] \u003d self.user_id"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        # Add resource to the usage dict"},{"line_number":77,"context_line":"        usage_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":25,"id":"7a77a97e_8b8c1d81","line":74,"range":{"start_line":74,"start_character":9,"end_line":74,"end_character":42},"updated":"2016-11-21 09:44:56.000000000","message":"This modification needs to be done for Gnocchihybrid storage too.","commit_id":"8efda2ab0a97fb816beba9e49974d0bb7777048c"}],"cloudkitty/tenant_fetcher/keystone.py":[{"author":{"_account_id":8358,"name":"zhangguoqing","email":"zhang.guoqing@99cloud.net","username":"zhangguoqing"},"change_message_id":"b522d4421df7aee5b87f425b0a75277cf259596f","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def get_tenant_members(self, tenant_id):"},{"line_number":84,"context_line":"        keystone_version \u003d discover.normalize_version_number("},{"line_number":85,"context_line":"            CONF.keystone_fetcher.keystone_version)"},{"line_number":86,"context_line":"        auth_dispatch \u003d {(3,): (\u0027user\u0027, \u0027users\u0027, \u0027list\u0027, \u0027project_id\u0027),"},{"line_number":87,"context_line":"                         (2,): (\u0027user\u0027, \u0027users\u0027, \u0027list\u0027, \u0027tenant_id\u0027)}"},{"line_number":88,"context_line":"        for auth_version, auth_version_mapping in six.iteritems(auth_dispatch):"},{"line_number":89,"context_line":"            if discover.version_match(auth_version, keystone_version):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_61409508","line":86,"range":{"start_line":86,"start_character":55,"end_line":86,"end_character":69},"updated":"2016-08-03 04:29:08.000000000","message":"This maybe unused.","commit_id":"b7a58a6d188ee28ff4597e4a3977417915f8ee5e"},{"author":{"_account_id":8358,"name":"zhangguoqing","email":"zhang.guoqing@99cloud.net","username":"zhangguoqing"},"change_message_id":"b522d4421df7aee5b87f425b0a75277cf259596f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        keystone_version \u003d discover.normalize_version_number("},{"line_number":85,"context_line":"            CONF.keystone_fetcher.keystone_version)"},{"line_number":86,"context_line":"        auth_dispatch \u003d {(3,): (\u0027user\u0027, \u0027users\u0027, \u0027list\u0027, \u0027project_id\u0027),"},{"line_number":87,"context_line":"                         (2,): (\u0027user\u0027, \u0027users\u0027, \u0027list\u0027, \u0027tenant_id\u0027)}"},{"line_number":88,"context_line":"        for auth_version, auth_version_mapping in six.iteritems(auth_dispatch):"},{"line_number":89,"context_line":"            if discover.version_match(auth_version, keystone_version):"},{"line_number":90,"context_line":"                return self._do_get_tenant_members(tenant_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_8147891c","line":87,"range":{"start_line":87,"start_character":55,"end_line":87,"end_character":68},"updated":"2016-08-03 04:29:08.000000000","message":"ditto","commit_id":"b7a58a6d188ee28ff4597e4a3977417915f8ee5e"},{"author":{"_account_id":8358,"name":"zhangguoqing","email":"zhang.guoqing@99cloud.net","username":"zhangguoqing"},"change_message_id":"b522d4421df7aee5b87f425b0a75277cf259596f","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _do_get_tenant_members(self, tenant_id, auth_version_mapping):"},{"line_number":96,"context_line":"        users \u003d []"},{"line_number":97,"context_line":"        user_attr, users_attr, list_func, project_id \u003d auth_version_mapping"},{"line_number":98,"context_line":"        if CONF.keystone_fetcher.keystone_version \u003d\u003d \u00273\u0027:"},{"line_number":99,"context_line":"            user_list \u003d getattr(self.admin_ks, users_attr).list()"},{"line_number":100,"context_line":"            for user in user_list[:]:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_215dfdec","line":97,"range":{"start_line":97,"start_character":40,"end_line":97,"end_character":52},"updated":"2016-08-03 04:29:08.000000000","message":"ditto","commit_id":"b7a58a6d188ee28ff4597e4a3977417915f8ee5e"},{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        users \u003d []"},{"line_number":97,"context_line":"        user_attr, users_attr, list_func \u003d auth_version_mapping"},{"line_number":98,"context_line":"        if CONF.keystone_fetcher.keystone_version \u003d\u003d \u00273\u0027:"},{"line_number":99,"context_line":"            user_list \u003d getattr(self.admin_ks, users_attr).list()"},{"line_number":100,"context_line":"            for user in user_list[:]:"},{"line_number":101,"context_line":"                projects \u003d getattr(self.admin_ks.projects, list_func)("},{"line_number":102,"context_line":"                    **{\u0027user\u0027: user.id})"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_44e2eea0","line":99,"updated":"2016-08-13 19:34:18.000000000","message":"If I understand correctly, you fetch a list of all the users and then, for each one of them, try to find if they belong to tenant_id?","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        users \u003d []"},{"line_number":97,"context_line":"        user_attr, users_attr, list_func \u003d auth_version_mapping"},{"line_number":98,"context_line":"        if CONF.keystone_fetcher.keystone_version \u003d\u003d \u00273\u0027:"},{"line_number":99,"context_line":"            user_list \u003d getattr(self.admin_ks, users_attr).list()"},{"line_number":100,"context_line":"            for user in user_list[:]:"},{"line_number":101,"context_line":"                projects \u003d getattr(self.admin_ks.projects, list_func)("},{"line_number":102,"context_line":"                    **{\u0027user\u0027: user.id})"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_ea3ac3e6","line":99,"in_reply_to":"3ac371cc_44e2eea0","updated":"2016-08-14 00:51:56.000000000","message":"Yes, that\u0027s the way I have done.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"}],"cloudkitty/tests/gabbi/fixtures.py":[{"author":{"_account_id":9642,"name":"Guillaume Espanel","email":"guillaume.espanel@gmail.com","username":"quatre"},"change_message_id":"16f78ef66335952861376baf3b90509869bf4ea5","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        nodata_duration \u003d (24 * 3 + 12) * 3600"},{"line_number":301,"context_line":"        tenant_list \u003d [\u00278f82cc70-e50c-466e-8624-24bdea811375\u0027,"},{"line_number":302,"context_line":"                       \u00277606a24a-b8ad-4ae0-be6c-3d7a41334a2e\u0027]"},{"line_number":303,"context_line":"        user_list \u003d [\u002703f85b3c9dd8457bb881a6bafa06fca3\u0027,"},{"line_number":304,"context_line":"                     \u00270645ae2a85c345bbbb7aa641a935c7fb\u0027]"},{"line_number":305,"context_line":"        for tenant in tenant_list:"},{"line_number":306,"context_line":"            for user in user_list:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_e4e79aaa","line":303,"updated":"2016-08-13 19:34:18.000000000","message":"Shouldn\u0027t the user_list be specified with a correct UUID format for clarity?","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"5574a604e4012e1b1140c21361edbd0060fa51cd","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        nodata_duration \u003d (24 * 3 + 12) * 3600"},{"line_number":301,"context_line":"        tenant_list \u003d [\u00278f82cc70-e50c-466e-8624-24bdea811375\u0027,"},{"line_number":302,"context_line":"                       \u00277606a24a-b8ad-4ae0-be6c-3d7a41334a2e\u0027]"},{"line_number":303,"context_line":"        user_list \u003d [\u002703f85b3c9dd8457bb881a6bafa06fca3\u0027,"},{"line_number":304,"context_line":"                     \u00270645ae2a85c345bbbb7aa641a935c7fb\u0027]"},{"line_number":305,"context_line":"        for tenant in tenant_list:"},{"line_number":306,"context_line":"            for user in user_list:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac371cc_2a0cdb41","line":303,"in_reply_to":"3ac371cc_e4e79aaa","updated":"2016-08-14 00:51:56.000000000","message":"I believe \"tenant\" and \"user\" are not UUID format.","commit_id":"73b01b26eba75f53c30be478dbd0e84d1bd3e2ef"}]}
