)]}'
{"nova/api/openstack/compute/simple_tenant_usage.py":[{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"02b112fb17a47f53d77b9092ade0eb8828072ba1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"class SimpleTenantUsageController(wsgi.Controller):"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    _view_builder_class \u003d usages_view.ViewBuilder"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _get_flavor(self, context, instance, flavors_cache):"},{"line_number":55,"context_line":"        \"\"\"Get flavor information from the instance object,"},{"line_number":56,"context_line":"        allowing a fallback to lookup by-id for deleted instances only."}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_4a345393","line":53,"updated":"2020-03-06 13:09:02.000000000","message":"Hello Rafael, what you think in create a Class to deal with the complexity of calculating the VMs uptime? If you agree, I have a suggestion bellow, something like this:\n\ndef up(tick, time):\n    return (tick.time - tick.before.time).total_seconds() + time\n\n\ndef dont_care(tick, time):\n    return time\n\n\nclass Tick(object):\n\n    def do_calc(self, time\u003d0):\n        if not self.next:\n            return self.operate(self, time)\n        time \u003d self.operate(self, time)\n        return self.next.do_calc(time)\n\n    def __init__(self, time, name, before, events):\n        self.time \u003d time\n        self.name \u003d name\n        self.before \u003d before\n        self.next \u003d None\n        self.operate \u003d dont_care\n        if before:\n            self.before.next \u003d self\n            if before.name in events[\u0027all_start_account_hours_event\u0027]:\n                self.operate \u003d up\n            elif before.name not in events[\u0027all_stop_account_hours_event\u0027]:\n                self.operate \u003d before.operate\n\n\nclass UptimeCalc(object):\n    def __init__(self, beg, end, events_config, instance_events):\n        events_consumer \u003d iter(instance_events)\n        self.beg \u003d beg\n        self.end \u003d end\n        self.start_tick \u003d self.get_start_tick(events_consumer, events_config)\n        if not self.start_tick:\n            return\n        current_tick \u003d self.start_tick.next or self.start_tick\n        for e in events_consumer:\n            time \u003d SimpleTenantUsageController.get_event_time(e)\n            if time \u003e\u003d end:\n                Tick(end, current_tick.name, current_tick, events_config)\n                break\n            current_tick \u003d Tick(time, e.action, current_tick, events_config)\n        self.define_end_tick(events_consumer, current_tick, events_config)\n\n    def get_start_tick(self, instance_events, events):\n        before \u003d None\n        for e in instance_events:\n            time \u003d SimpleTenantUsageController.get_event_time(e)\n            if time \u003e\u003d self.end:\n                return None\n            if time \u003e self.beg:\n                tick \u003d Tick(time, e.action, before, events)\n                return before or tick\n            before \u003d Tick(self.beg, e.action, before, events)\n        return before\n\n    def define_end_tick(self, instance_events, current, events):\n        try:\n            next(instance_events)\n        except StopIteration:\n            Tick(self.end, current.name, current, events)\n\n    def do_calc(self):\n        if not self.start_tick:\n            return 0\n        return self.start_tick.do_calc() / 3600","commit_id":"731f12db5b8b29701e571dc3f1e6b3530839c38c"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"aebfb270d898d8e0e0bad8bd5809de65ff5f3087","unresolved":false,"context_lines":[{"line_number":50,"context_line":"class SimpleTenantUsageController(wsgi.Controller):"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    _view_builder_class \u003d usages_view.ViewBuilder"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _get_flavor(self, context, instance, flavors_cache):"},{"line_number":55,"context_line":"        \"\"\"Get flavor information from the instance object,"},{"line_number":56,"context_line":"        allowing a fallback to lookup by-id for deleted instances only."}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4c43b2_920abe23","line":53,"in_reply_to":"1fa4df85_4a345393","updated":"2020-04-14 18:06:13.000000000","message":"Awesome! Thanks for the suggestion. I did implement it as you suggested. I just changed a bit the code and added some logging.","commit_id":"731f12db5b8b29701e571dc3f1e6b3530839c38c"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"02b112fb17a47f53d77b9092ade0eb8828072ba1","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                  \"for VM usage is stopped.\","},{"line_number":266,"context_line":"                  override_account_configs[\"all_stop_account_hours_event\"])"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for event in instance_events:"},{"line_number":269,"context_line":"            if event.action not in \\"},{"line_number":270,"context_line":"                    override_account_configs[\"all_start_account_hours_event\"] \\"},{"line_number":271,"context_line":"                    + \\"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_aae947e6","line":268,"updated":"2020-03-06 13:09:02.000000000","message":"Then, here you could use the new class to calculate the uptime.\n\nuptime_calc \u003d UptimeCalc(period_start, period_stop,\n                         override_account_configs,                                     \n                         instance_events)\n\nreturn uptime_calc.do_calc()","commit_id":"731f12db5b8b29701e571dc3f1e6b3530839c38c"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"aebfb270d898d8e0e0bad8bd5809de65ff5f3087","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                  \"for VM usage is stopped.\","},{"line_number":266,"context_line":"                  override_account_configs[\"all_stop_account_hours_event\"])"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        for event in instance_events:"},{"line_number":269,"context_line":"            if event.action not in \\"},{"line_number":270,"context_line":"                    override_account_configs[\"all_start_account_hours_event\"] \\"},{"line_number":271,"context_line":"                    + \\"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4c43b2_f207c21b","line":268,"in_reply_to":"1fa4df85_aae947e6","updated":"2020-04-14 18:06:13.000000000","message":"Done","commit_id":"731f12db5b8b29701e571dc3f1e6b3530839c38c"}],"nova/tests/unit/api/openstack/compute/test_simple_tenant_usage.py":[{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"02b112fb17a47f53d77b9092ade0eb8828072ba1","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"    @mock.patch(\u0027nova.objects.InstanceActionList.get_by_instance_uuid\u0027,"},{"line_number":644,"context_line":"                fake_get_by_instance_uuid)"},{"line_number":645,"context_line":"    def test_calculate_virtual_machine_usage_hours_vm_stop_before_period("},{"line_number":646,"context_line":"            self):"},{"line_number":647,"context_line":"        start_vm_time \u003d START - datetime.timedelta(hours\u003dHOURS * 2)"},{"line_number":648,"context_line":"        vm_stop_time \u003d START - datetime.timedelta(hours\u003dHOURS - 6)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_6aaa6f19","line":645,"updated":"2020-03-06 13:09:02.000000000","message":"I think that this test name could be changed to something like : \n\ntest_default_behavior_when_stopping_vm_before_search_period","commit_id":"731f12db5b8b29701e571dc3f1e6b3530839c38c"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"aebfb270d898d8e0e0bad8bd5809de65ff5f3087","unresolved":false,"context_lines":[{"line_number":642,"context_line":""},{"line_number":643,"context_line":"    @mock.patch(\u0027nova.objects.InstanceActionList.get_by_instance_uuid\u0027,"},{"line_number":644,"context_line":"                fake_get_by_instance_uuid)"},{"line_number":645,"context_line":"    def test_calculate_virtual_machine_usage_hours_vm_stop_before_period("},{"line_number":646,"context_line":"            self):"},{"line_number":647,"context_line":"        start_vm_time \u003d START - datetime.timedelta(hours\u003dHOURS * 2)"},{"line_number":648,"context_line":"        vm_stop_time \u003d START - datetime.timedelta(hours\u003dHOURS - 6)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4c43b2_7509dc2a","line":645,"in_reply_to":"1fa4df85_6aaa6f19","updated":"2020-04-14 18:06:13.000000000","message":"Done","commit_id":"731f12db5b8b29701e571dc3f1e6b3530839c38c"}]}
