)]}'
{"nova/compute/manager.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":5548,"context_line":"        vol_usage.curr_writes \u003d wr_req"},{"line_number":5549,"context_line":"        vol_usage.curr_write_bytes \u003d wr_bytes"},{"line_number":5550,"context_line":"        vol_usage.save(update_totals\u003dTrue)"},{"line_number":5551,"context_line":"        self.notifier.info(context, \u0027volume.usage\u0027, vol_usage.to_dict())"},{"line_number":5552,"context_line":"        compute_utils.notify_about_volume_usage(context, vol_usage, self.host)"},{"line_number":5553,"context_line":""},{"line_number":5554,"context_line":"    def _detach_volume(self, context, bdm, instance, destroy_bdm\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_194e9295","line":5551,"range":{"start_line":5551,"start_character":52,"end_line":5551,"end_character":71},"updated":"2018-10-03 10:33:50.000000000","message":"This change should really have been a separate one, however, there\u0027s essentially no difference here","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"}],"nova/compute/utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":849,"context_line":"                      \"was not found\", instance\u003dinstance)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"def usage_volume_info(vol_usage):"},{"line_number":853,"context_line":"    def null_safe_str(s):"},{"line_number":854,"context_line":"        return str(s) if s else \u0027\u0027"},{"line_number":855,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_397b4ebf","side":"PARENT","line":852,"range":{"start_line":852,"start_character":0,"end_line":852,"end_character":33},"updated":"2018-10-03 10:33:50.000000000","message":"This function as a whole has moved to [1]\n\n[1] https://review.openstack.org/#/c/580345/15/nova/objects/volume_usage.py@87","commit_id":"eb26f1b719395f5e14f75550872e589879b79f92"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":853,"context_line":"    def null_safe_str(s):"},{"line_number":854,"context_line":"        return str(s) if s else \u0027\u0027"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"    tot_refreshed \u003d vol_usage.tot_last_refreshed"},{"line_number":857,"context_line":"    curr_refreshed \u003d vol_usage.curr_last_refreshed"},{"line_number":858,"context_line":"    if tot_refreshed and curr_refreshed:"},{"line_number":859,"context_line":"        last_refreshed_time \u003d max(tot_refreshed, curr_refreshed)"},{"line_number":860,"context_line":"    elif tot_refreshed:"},{"line_number":861,"context_line":"        last_refreshed_time \u003d tot_refreshed"},{"line_number":862,"context_line":"    else:"},{"line_number":863,"context_line":"        # curr_refreshed must be set"},{"line_number":864,"context_line":"        last_refreshed_time \u003d curr_refreshed"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"    usage_info \u003d dict("},{"line_number":867,"context_line":"          volume_id\u003dvol_usage.volume_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_d99c9a0e","side":"PARENT","line":864,"range":{"start_line":856,"start_character":0,"end_line":864,"end_character":44},"updated":"2018-10-03 10:33:50.000000000","message":"This has moved to [1]\n\n[1] https://review.openstack.org/#/c/580345/15/nova/objects/volume_usage.py@45","commit_id":"eb26f1b719395f5e14f75550872e589879b79f92"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":870,"context_line":"          availability_zone\u003dvol_usage.availability_zone,"},{"line_number":871,"context_line":"          instance_id\u003dvol_usage.instance_uuid,"},{"line_number":872,"context_line":"          last_refreshed\u003dnull_safe_str(last_refreshed_time),"},{"line_number":873,"context_line":"          reads\u003dvol_usage.tot_reads + vol_usage.curr_reads,"},{"line_number":874,"context_line":"          read_bytes\u003dvol_usage.tot_read_bytes +"},{"line_number":875,"context_line":"                vol_usage.curr_read_bytes,"},{"line_number":876,"context_line":"          writes\u003dvol_usage.tot_writes + vol_usage.curr_writes,"},{"line_number":877,"context_line":"          write_bytes\u003dvol_usage.tot_write_bytes +"},{"line_number":878,"context_line":"                vol_usage.curr_write_bytes)"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"    return usage_info"},{"line_number":881,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_b9675e24","side":"PARENT","line":878,"range":{"start_line":873,"start_character":0,"end_line":878,"end_character":43},"updated":"2018-10-03 10:33:50.000000000","message":"These have moved to [1]\n\n[1] https://review.openstack.org/#/c/580345/15/nova/objects/volume_usage.py@54","commit_id":"eb26f1b719395f5e14f75550872e589879b79f92"}],"nova/notifications/objects/volume.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"780e343aee9d7ad4e84545f811d6c83a536b6242","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def __init__(self, vol_usage):"},{"line_number":58,"context_line":"        super(VolumeUsagePayload, self).__init__()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        tot_refreshed \u003d vol_usage.tot_last_refreshed"},{"line_number":61,"context_line":"        curr_refreshed \u003d vol_usage.curr_last_refreshed"},{"line_number":62,"context_line":"        if tot_refreshed and curr_refreshed:"},{"line_number":63,"context_line":"            self.last_refreshed \u003d max(tot_refreshed, curr_refreshed)"},{"line_number":64,"context_line":"        elif tot_refreshed:"},{"line_number":65,"context_line":"            self.last_refreshed \u003d tot_refreshed"},{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            # curr_refreshed must be set"},{"line_number":68,"context_line":"            self.last_refreshed \u003d curr_refreshed"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        self.reads \u003d vol_usage.tot_reads + vol_usage.curr_reads"},{"line_number":71,"context_line":"        self.read_bytes \u003d ("},{"line_number":72,"context_line":"            vol_usage.tot_read_bytes + vol_usage.curr_read_bytes)"},{"line_number":73,"context_line":"        self.writes \u003d vol_usage.tot_writes + vol_usage.curr_writes"},{"line_number":74,"context_line":"        self.write_bytes \u003d ("},{"line_number":75,"context_line":"            vol_usage.tot_write_bytes + vol_usage.curr_write_bytes)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.populate_schema(vol_usage\u003dvol_usage)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_dfb22a4a","line":75,"range":{"start_line":60,"start_character":1,"end_line":75,"end_character":67},"updated":"2018-07-10 09:12:06.000000000","message":"--later--\nI figured out that this is a copy-paste of the content of nova.compute.utils.usage_volume_info() function used in the legacy call. I suggest not to duplicate the logic.\n\nAlso figured out that tot + curr done after the db layer already did the same is not a problem as the db layer resets curr to 0 so here we not double add it.","commit_id":"5f2ef3b683ea79ce3f189136071f841a2442e26c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"780e343aee9d7ad4e84545f811d6c83a536b6242","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            # curr_refreshed must be set"},{"line_number":68,"context_line":"            self.last_refreshed \u003d curr_refreshed"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        self.reads \u003d vol_usage.tot_reads + vol_usage.curr_reads"},{"line_number":71,"context_line":"        self.read_bytes \u003d ("},{"line_number":72,"context_line":"            vol_usage.tot_read_bytes + vol_usage.curr_read_bytes)"},{"line_number":73,"context_line":"        self.writes \u003d vol_usage.tot_writes + vol_usage.curr_writes"},{"line_number":74,"context_line":"        self.write_bytes \u003d ("},{"line_number":75,"context_line":"            vol_usage.tot_write_bytes + vol_usage.curr_write_bytes)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.populate_schema(vol_usage\u003dvol_usage)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_44708fda","line":75,"range":{"start_line":70,"start_character":1,"end_line":75,"end_character":67},"updated":"2018-07-10 09:12:06.000000000","message":"Why we need to do the calculation here? I think it is done in the db layer automatically [1] when the data is saved to the db before the notifications are sent out[2].\n\n[1] https://github.com/openstack/nova/blob/4b4467aaf80bd2de98d6302891bc8c9061128034/nova/db/sqlalchemy/api.py#L4883\n[2]https://github.com/openstack/nova/blob/4b4467aaf80bd2de98d6302891bc8c9061128034/nova/compute/manager.py#L5419","commit_id":"5f2ef3b683ea79ce3f189136071f841a2442e26c"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ee8412e048d8aca5719d1991c7172f4a1c5e14e5","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def __init__(self, vol_usage):"},{"line_number":58,"context_line":"        super(VolumeUsagePayload, self).__init__()"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        tot_refreshed \u003d vol_usage.tot_last_refreshed"},{"line_number":61,"context_line":"        curr_refreshed \u003d vol_usage.curr_last_refreshed"},{"line_number":62,"context_line":"        if tot_refreshed and curr_refreshed:"},{"line_number":63,"context_line":"            self.last_refreshed \u003d max(tot_refreshed, curr_refreshed)"},{"line_number":64,"context_line":"        elif tot_refreshed:"},{"line_number":65,"context_line":"            self.last_refreshed \u003d tot_refreshed"},{"line_number":66,"context_line":"        else:"},{"line_number":67,"context_line":"            # curr_refreshed must be set"},{"line_number":68,"context_line":"            self.last_refreshed \u003d curr_refreshed"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        self.reads \u003d vol_usage.tot_reads + vol_usage.curr_reads"},{"line_number":71,"context_line":"        self.read_bytes \u003d ("},{"line_number":72,"context_line":"            vol_usage.tot_read_bytes + vol_usage.curr_read_bytes)"},{"line_number":73,"context_line":"        self.writes \u003d vol_usage.tot_writes + vol_usage.curr_writes"},{"line_number":74,"context_line":"        self.write_bytes \u003d ("},{"line_number":75,"context_line":"            vol_usage.tot_write_bytes + vol_usage.curr_write_bytes)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.populate_schema(vol_usage\u003dvol_usage)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_11e93b18","line":75,"range":{"start_line":60,"start_character":1,"end_line":75,"end_character":67},"in_reply_to":"5f7c97a3_dfb22a4a","updated":"2018-07-12 11:35:10.000000000","message":"There are 2 cases when the volume usage object is saved.\nThe one is the case update_totals\u003dTrue, the other is the case update_totals\u003dFalse(default).\nSo IMO, the calculation is required.\n\nI moved the logic from compute.utils to volume usage object to avoid a duplication of the logic.\n\nhttps://github.com/openstack/nova/blob/39b05ee9e34ae7e7c1854439f887588ec157bc69/nova/compute/manager.py#L5419-L5421\nhttps://github.com/openstack/nova/blob/39b05ee9e34ae7e7c1854439f887588ec157bc69/nova/compute/manager.py#L7159-L7161","commit_id":"5f2ef3b683ea79ce3f189136071f841a2442e26c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    SCHEMA \u003d {"},{"line_number":37,"context_line":"        \u0027volume_id\u0027: (\u0027vol_usage\u0027, \u0027volume_id\u0027),"},{"line_number":38,"context_line":"        \u0027project_id\u0027: (\u0027vol_usage\u0027, \u0027project_id\u0027),"},{"line_number":39,"context_line":"        \u0027user_id\u0027: (\u0027vol_usage\u0027, \u0027user_id\u0027),"},{"line_number":40,"context_line":"        \u0027availability_zone\u0027: (\u0027vol_usage\u0027, \u0027availability_zone\u0027),"},{"line_number":41,"context_line":"        \u0027instance_uuid\u0027: (\u0027vol_usage\u0027, \u0027instance_uuid\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_594f2a8b","line":38,"range":{"start_line":38,"start_character":9,"end_line":38,"end_character":19},"updated":"2018-10-03 10:33:50.000000000","message":"this was previously tenant_id but I guess we\u0027re updating these across the board (and the object itself uses project_id)","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"439d06bf85daf72b0451dbecd73cf4f4b3e1393d","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    SCHEMA \u003d {"},{"line_number":37,"context_line":"        \u0027volume_id\u0027: (\u0027vol_usage\u0027, \u0027volume_id\u0027),"},{"line_number":38,"context_line":"        \u0027project_id\u0027: (\u0027vol_usage\u0027, \u0027project_id\u0027),"},{"line_number":39,"context_line":"        \u0027user_id\u0027: (\u0027vol_usage\u0027, \u0027user_id\u0027),"},{"line_number":40,"context_line":"        \u0027availability_zone\u0027: (\u0027vol_usage\u0027, \u0027availability_zone\u0027),"},{"line_number":41,"context_line":"        \u0027instance_uuid\u0027: (\u0027vol_usage\u0027, \u0027instance_uuid\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_fab93ac4","line":38,"range":{"start_line":38,"start_character":9,"end_line":38,"end_character":19},"in_reply_to":"3f79a3b5_594f2a8b","updated":"2018-10-16 10:48:18.000000000","message":"+1 for project_id","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027project_id\u0027: (\u0027vol_usage\u0027, \u0027project_id\u0027),"},{"line_number":39,"context_line":"        \u0027user_id\u0027: (\u0027vol_usage\u0027, \u0027user_id\u0027),"},{"line_number":40,"context_line":"        \u0027availability_zone\u0027: (\u0027vol_usage\u0027, \u0027availability_zone\u0027),"},{"line_number":41,"context_line":"        \u0027instance_uuid\u0027: (\u0027vol_usage\u0027, \u0027instance_uuid\u0027),"},{"line_number":42,"context_line":"        \u0027last_refreshed\u0027: (\u0027vol_usage\u0027, \u0027last_refreshed\u0027),"},{"line_number":43,"context_line":"        \u0027reads\u0027: (\u0027vol_usage\u0027, \u0027reads\u0027),"},{"line_number":44,"context_line":"        \u0027read_bytes\u0027: (\u0027vol_usage\u0027, \u0027read_bytes\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_f92f16a4","line":41,"range":{"start_line":41,"start_character":9,"end_line":41,"end_character":22},"updated":"2018-10-03 10:33:50.000000000","message":"formerly instance_id but the object uses instance_uuid too","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"439d06bf85daf72b0451dbecd73cf4f4b3e1393d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027project_id\u0027: (\u0027vol_usage\u0027, \u0027project_id\u0027),"},{"line_number":39,"context_line":"        \u0027user_id\u0027: (\u0027vol_usage\u0027, \u0027user_id\u0027),"},{"line_number":40,"context_line":"        \u0027availability_zone\u0027: (\u0027vol_usage\u0027, \u0027availability_zone\u0027),"},{"line_number":41,"context_line":"        \u0027instance_uuid\u0027: (\u0027vol_usage\u0027, \u0027instance_uuid\u0027),"},{"line_number":42,"context_line":"        \u0027last_refreshed\u0027: (\u0027vol_usage\u0027, \u0027last_refreshed\u0027),"},{"line_number":43,"context_line":"        \u0027reads\u0027: (\u0027vol_usage\u0027, \u0027reads\u0027),"},{"line_number":44,"context_line":"        \u0027read_bytes\u0027: (\u0027vol_usage\u0027, \u0027read_bytes\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_badd0214","line":41,"range":{"start_line":41,"start_character":9,"end_line":41,"end_character":22},"in_reply_to":"3f79a3b5_f92f16a4","updated":"2018-10-16 10:48:18.000000000","message":"+1 for instance_uuid","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"}],"nova/objects/volume_usage.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self.availability_zone, update_totals\u003dupdate_totals)"},{"line_number":85,"context_line":"        self._from_db_object(self._context, self, db_vol_usage)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def to_dict(self):"},{"line_number":88,"context_line":"        return {"},{"line_number":89,"context_line":"            \u0027volume_id\u0027: self.volume_id,"},{"line_number":90,"context_line":"            \u0027tenant_id\u0027: self.project_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_b90e7e3a","line":87,"range":{"start_line":87,"start_character":0,"end_line":87,"end_character":22},"updated":"2018-10-03 10:33:50.000000000","message":"If you need to respin, could you add a note stating that this function only exists for use in legacy notifications. Most of the \u0027to_dict\u0027 or \u0027to_json\u0027 functions are used for similar reasons and I imagine we want to get rid of them all at some point in the (distant) future","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            \u0027user_id\u0027: self.user_id,"},{"line_number":92,"context_line":"            \u0027availability_zone\u0027: self.availability_zone,"},{"line_number":93,"context_line":"            \u0027instance_id\u0027: self.instance_uuid,"},{"line_number":94,"context_line":"            \u0027last_refreshed\u0027: str("},{"line_number":95,"context_line":"                self.last_refreshed) if self.last_refreshed else \u0027\u0027,"},{"line_number":96,"context_line":"            \u0027reads\u0027: self.reads,"},{"line_number":97,"context_line":"            \u0027read_bytes\u0027: self.read_bytes,"},{"line_number":98,"context_line":"            \u0027writes\u0027: self.writes,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_39f82e48","line":95,"range":{"start_line":94,"start_character":30,"end_line":95,"end_character":68},"updated":"2018-10-03 10:33:50.000000000","message":"nit:\n\n  str(self.last_refreshed or \u0027\u0027)","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"}],"nova/virt/fake.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"485a29a418a9b322733d9eec95feeb539a7d7c1a","unresolved":false,"context_lines":[{"line_number":409,"context_line":"           a given host."},{"line_number":410,"context_line":"        \"\"\""},{"line_number":411,"context_line":"        volusage \u003d []"},{"line_number":412,"context_line":"        if compute_host_bdms:"},{"line_number":413,"context_line":"            volusage \u003d [{\u0027volume\u0027: compute_host_bdms[0]["},{"line_number":414,"context_line":"                                       \u0027instance_bdms\u0027][0][\u0027volume_id\u0027],"},{"line_number":415,"context_line":"                         \u0027instance\u0027: compute_host_bdms[0][\u0027instance\u0027],"},{"line_number":416,"context_line":"                         \u0027rd_bytes\u0027: 0,"},{"line_number":417,"context_line":"                         \u0027rd_req\u0027: 0,"},{"line_number":418,"context_line":"                         \u0027wr_bytes\u0027: 0,"},{"line_number":419,"context_line":"                         \u0027wr_req\u0027: 0}]"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        return volusage"},{"line_number":422,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_59fdea06","line":419,"range":{"start_line":412,"start_character":0,"end_line":419,"end_character":38},"updated":"2018-10-03 10:33:50.000000000","message":"Added for testing purposes, obv","commit_id":"f242715fdb01b75d36bd6b93ad5fe0a5866bd2ec"}]}
