)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1976f405be46e0d019faa6455487a1921eccae0b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"versioning. Also it will force contributors to dump objects"},{"line_number":12,"context_line":"version in case of any changes."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Some new field were added/modified to be in accordance with updated"},{"line_number":15,"context_line":"diagnostic info spec I1b775c565012931aec09a6ac11ad14d8fcdcd857"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Also some changes were made in libvirt driver method"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"ba5201f7_e99c3d6c","line":14,"updated":"2017-01-11 15:28:01.000000000","message":"fields","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"74e25a49fffca641c3aff30ab74d43251bfaa41f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"versioning. Also it will force contributors to dump objects"},{"line_number":12,"context_line":"version in case of any changes."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Some new field were added/modified to be in accordance with updated"},{"line_number":15,"context_line":"diagnostic info spec I1b775c565012931aec09a6ac11ad14d8fcdcd857"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Also some changes were made in libvirt driver method"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"ba5201f7_f5908aef","line":14,"in_reply_to":"ba5201f7_e99c3d6c","updated":"2017-01-11 16:27:25.000000000","message":"Done","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"}],"nova/compute/manager.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"89a01613beecb682caae7a5bdae0f23ad3c7f0c1","unresolved":false,"context_lines":[{"line_number":4176,"context_line":"        current_power_state \u003d self._get_power_state(context, instance)"},{"line_number":4177,"context_line":"        if current_power_state \u003d\u003d power_state.RUNNING:"},{"line_number":4178,"context_line":"            LOG.info(_LI(\"Retrieving diagnostics\"), instance\u003dinstance)"},{"line_number":4179,"context_line":"            return self.driver.get_instance_diagnostics(instance)"},{"line_number":4180,"context_line":"        else:"},{"line_number":4181,"context_line":"            raise exception.InstanceInvalidState("},{"line_number":4182,"context_line":"                attr\u003d\u0027power state\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa31d9ce_83be1b63","line":4179,"updated":"2017-02-14 11:08:57.000000000","message":"This seems a little odd to me. I think the API code might break across upgrades because there is no way to discover this change.\n\nOld computes will be returning the old dictionary, but the newer compute nodes will be sending objects. We probably currently get away with it because of the dict compat mode in the object, but that feels a little odd.\n\nWhat I was expecting to see what passing in a send_object\u003dTrue from new clients, and sending dictionaries for anyone else. \n\nIf we do that, the API can only allow the new microversion when we hit a certain minimum service version for the compute nodes.","commit_id":"761338c48073560580b550557070904fb38ddfa5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bad35bf53bf01014841dbd5c56b7ed313de82a8c","unresolved":false,"context_lines":[{"line_number":4176,"context_line":"        current_power_state \u003d self._get_power_state(context, instance)"},{"line_number":4177,"context_line":"        if current_power_state \u003d\u003d power_state.RUNNING:"},{"line_number":4178,"context_line":"            LOG.info(_LI(\"Retrieving diagnostics\"), instance\u003dinstance)"},{"line_number":4179,"context_line":"            return self.driver.get_instance_diagnostics(instance)"},{"line_number":4180,"context_line":"        else:"},{"line_number":4181,"context_line":"            raise exception.InstanceInvalidState("},{"line_number":4182,"context_line":"                attr\u003d\u0027power state\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa31d9ce_4597c047","line":4179,"in_reply_to":"fa31d9ce_83be1b63","updated":"2017-02-14 14:18:32.000000000","message":"\u003e We probably currently get away with it because of the dict compat mode in the object\n\nThere isn\u0027t actually the DictCompat mixin in the object, but you\u0027re right that this seems fishy.\n\nI\u0027m assuming CI isn\u0027t failing because (a) we aren\u0027t running the tempest test on this and/or (b) if we are running it in the multinode job it\u0027s not fetching an instance from the ocata-level compute.","commit_id":"761338c48073560580b550557070904fb38ddfa5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7bcc87ebeec3da060ca942008e68e97c6a408ddc","unresolved":false,"context_lines":[{"line_number":4203,"context_line":"        current_power_state \u003d self._get_power_state(context, instance)"},{"line_number":4204,"context_line":"        if current_power_state \u003d\u003d power_state.RUNNING:"},{"line_number":4205,"context_line":"            LOG.info(_LI(\"Retrieving diagnostics\"), instance\u003dinstance)"},{"line_number":4206,"context_line":"            return self.driver.get_instance_diagnostics(instance)"},{"line_number":4207,"context_line":"        else:"},{"line_number":4208,"context_line":"            raise exception.InstanceInvalidState("},{"line_number":4209,"context_line":"                attr\u003d\u0027power state\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"7ffa3b31_be07e31c","line":4206,"updated":"2017-04-18 13:28:22.000000000","message":"I am unsure how this doesn\u0027t break our RPC versioning scheme. This is what I was expecting...\n\nAn extra argument that is something like \"send_object\u003dFalse\" by default? i.e. we keep sending the same sort of dictionary when not everyone is upgraded.\n\nOnce all API and Compute nodes are upgraded, we then request send_object\u003dTrue and expect in the API to get back the new return values.\n\nThen deprecate the argument and remove at the next major version bump.\n\n...\n\nNow, we could make an exception for all that complexity in the case there are no users of this code, but we should be clear that is why an exception is being made here.","commit_id":"0651a5c1fc0d91ee0a3fbbad5cbc925012169380"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"967dfa0a2b3e4e430d3c319e078de2589e3be3f5","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        return cctxt.call(ctxt, \u0027get_diagnostics\u0027, instance\u003dinstance)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_instance_diagnostics(self, ctxt, instance):"},{"line_number":580,"context_line":"        version \u003d \u00274.14\u0027"},{"line_number":581,"context_line":"        client \u003d self.router.by_instance(ctxt, instance)"},{"line_number":582,"context_line":"        if not client.can_send_version(version):"},{"line_number":583,"context_line":"            # NOTE(snikitin): Since version 4.14 method"},{"line_number":584,"context_line":"            # get_instance_diagnostics() returns Diagnostics object instead of"},{"line_number":585,"context_line":"            # dictionary so we do not need to do anything here."},{"line_number":586,"context_line":"            version \u003d \u00274.13\u0027"},{"line_number":587,"context_line":"        if not client.can_send_version(version):"},{"line_number":588,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":589,"context_line":"            instance \u003d objects_base.obj_to_primitive(instance)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a1ff146_379189f1","line":586,"range":{"start_line":580,"start_character":0,"end_line":586,"end_character":28},"updated":"2017-03-15 16:21:37.000000000","message":"Could you explain what\u0027s happening here? I would have expected to see some kind of conversion from the Diagnostics object to the dictionary expected of older clients, but we don\u0027t seem to be doing anything different for 4.14 compared to 4.13. If nothing has changed, why can\u0027t we leave the version fixed at 4.13?","commit_id":"cbe3db2bea921900c2143925a7a1c0d651f1a7f2"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"4d1b18b2fa4ea686254537570a568c0d5500ff55","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        return cctxt.call(ctxt, \u0027get_diagnostics\u0027, instance\u003dinstance)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_instance_diagnostics(self, ctxt, instance):"},{"line_number":580,"context_line":"        version \u003d \u00274.14\u0027"},{"line_number":581,"context_line":"        client \u003d self.router.by_instance(ctxt, instance)"},{"line_number":582,"context_line":"        if not client.can_send_version(version):"},{"line_number":583,"context_line":"            # NOTE(snikitin): Since version 4.14 method"},{"line_number":584,"context_line":"            # get_instance_diagnostics() returns Diagnostics object instead of"},{"line_number":585,"context_line":"            # dictionary so we do not need to do anything here."},{"line_number":586,"context_line":"            version \u003d \u00274.13\u0027"},{"line_number":587,"context_line":"        if not client.can_send_version(version):"},{"line_number":588,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":589,"context_line":"            instance \u003d objects_base.obj_to_primitive(instance)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a1ff146_4aab9ad6","line":586,"range":{"start_line":580,"start_character":0,"end_line":586,"end_character":28},"in_reply_to":"3a1ff146_379189f1","updated":"2017-03-16 11:55:38.000000000","message":"The main change is here: https://review.openstack.org/#/c/394480/30/nova/compute/manager.py\nThere we change returning of dictionary to returning of object. \n\nLet me explain:\n\nOld computes returns a dictionary. New computes returns an object. During upgrade we can face with problem when we have old computes and new API. It means that old compute will return a dictionary and new API will be wait an object. To detect such case we bumped RPC API version to say \"since version 4.14 we return object\". This version will be checked in API to ensure that an object will be recieved from compute:\nhttps://review.openstack.org/#/c/355540/40/nova/api/openstack/compute/server_diagnostics.py\n\nThis is John Garbutt\u0027s idea\n\nAlso some information about it here: \nhttps://review.openstack.org/#/c/355540/32/nova/api/openstack/compute/server_diagnostics.py","commit_id":"cbe3db2bea921900c2143925a7a1c0d651f1a7f2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7bcc87ebeec3da060ca942008e68e97c6a408ddc","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        can handle the version_cap being set to 4.13"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        * 4.14 - Make get_instance_diagnostics return a diagnostics object"},{"line_number":324,"context_line":"                 intead of dictionary"},{"line_number":325,"context_line":"    \u0027\u0027\u0027"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":31,"id":"7ffa3b31_59d6b929","line":324,"updated":"2017-04-18 13:28:22.000000000","message":"We should note this doesn\u0027t require a version bump as we currently have no consumers of this API. The version is just bumped to signal the availability of the corrected RPC API.\n\nMaybe we should also note this is really here to replace the older get_diagnostics call for a new API micro versions.","commit_id":"0651a5c1fc0d91ee0a3fbbad5cbc925012169380"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7bcc87ebeec3da060ca942008e68e97c6a408ddc","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        return cctxt.call(ctxt, \u0027get_diagnostics\u0027, instance\u003dinstance)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_instance_diagnostics(self, ctxt, instance):"},{"line_number":580,"context_line":"        version \u003d \u00274.14\u0027"},{"line_number":581,"context_line":"        client \u003d self.router.by_instance(ctxt, instance)"},{"line_number":582,"context_line":"        if not client.can_send_version(version):"},{"line_number":583,"context_line":"            # NOTE(snikitin): Since version 4.14 method"},{"line_number":584,"context_line":"            # get_instance_diagnostics() returns Diagnostics object instead of"},{"line_number":585,"context_line":"            # dictionary. We do not need to do anything here because no input"},{"line_number":586,"context_line":"            # paramerers were changed but we have to add a new version 4.14"},{"line_number":587,"context_line":"            # to indicate that since this version you will recive"},{"line_number":588,"context_line":"            # a Diagnostics object. This check used at API layer to understand"},{"line_number":589,"context_line":"            # what we expect to recive from compute."},{"line_number":590,"context_line":"            version \u003d \u00274.13\u0027"},{"line_number":591,"context_line":"        if not client.can_send_version(version):"},{"line_number":592,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":593,"context_line":"            instance \u003d objects_base.obj_to_primitive(instance)"},{"line_number":594,"context_line":"        cctxt \u003d client.prepare(server\u003d_compute_host(None, instance),"},{"line_number":595,"context_line":"                                    version\u003dversion)"},{"line_number":596,"context_line":"        return cctxt.call(ctxt, \u0027get_instance_diagnostics\u0027, instance\u003dinstance)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    def get_vnc_console(self, ctxt, instance, console_type):"},{"line_number":599,"context_line":"        version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"7ffa3b31_7914d5a0","line":596,"range":{"start_line":580,"start_character":0,"end_line":596,"end_character":78},"updated":"2017-04-18 13:28:22.000000000","message":"Would not not be better to just raise an exception if we can\u0027t send \u00274.14\u0027 and raise some NotSupported exception?\n\nReally no one can use this unless we have the latest version available here, as no code is know to exist that access the old version.","commit_id":"0651a5c1fc0d91ee0a3fbbad5cbc925012169380"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"83f5cadc2305756d4c201d207596592bbb76cdea","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        return cctxt.call(ctxt, \u0027get_diagnostics\u0027, instance\u003dinstance)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def get_instance_diagnostics(self, ctxt, instance):"},{"line_number":580,"context_line":"        version \u003d \u00274.14\u0027"},{"line_number":581,"context_line":"        client \u003d self.router.by_instance(ctxt, instance)"},{"line_number":582,"context_line":"        if not client.can_send_version(version):"},{"line_number":583,"context_line":"            # NOTE(snikitin): Since version 4.14 method"},{"line_number":584,"context_line":"            # get_instance_diagnostics() returns Diagnostics object instead of"},{"line_number":585,"context_line":"            # dictionary. We do not need to do anything here because no input"},{"line_number":586,"context_line":"            # paramerers were changed but we have to add a new version 4.14"},{"line_number":587,"context_line":"            # to indicate that since this version you will recive"},{"line_number":588,"context_line":"            # a Diagnostics object. This check used at API layer to understand"},{"line_number":589,"context_line":"            # what we expect to recive from compute."},{"line_number":590,"context_line":"            version \u003d \u00274.13\u0027"},{"line_number":591,"context_line":"        if not client.can_send_version(version):"},{"line_number":592,"context_line":"            version \u003d \u00274.0\u0027"},{"line_number":593,"context_line":"            instance \u003d objects_base.obj_to_primitive(instance)"},{"line_number":594,"context_line":"        cctxt \u003d client.prepare(server\u003d_compute_host(None, instance),"},{"line_number":595,"context_line":"                                    version\u003dversion)"},{"line_number":596,"context_line":"        return cctxt.call(ctxt, \u0027get_instance_diagnostics\u0027, instance\u003dinstance)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    def get_vnc_console(self, ctxt, instance, console_type):"},{"line_number":599,"context_line":"        version \u003d \u00274.0\u0027"}],"source_content_type":"text/x-python","patch_set":31,"id":"5ff73747_043f6a87","line":596,"range":{"start_line":580,"start_character":0,"end_line":596,"end_character":78},"in_reply_to":"7ffa3b31_7914d5a0","updated":"2017-04-27 11:57:47.000000000","message":"lets do it!","commit_id":"0651a5c1fc0d91ee0a3fbbad5cbc925012169380"}],"nova/exception.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b313b1bbaeb0f2775ae73d0fff8a4b12f3f951a","unresolved":false,"context_lines":[{"line_number":2043,"context_line":""},{"line_number":2044,"context_line":""},{"line_number":2045,"context_line":"class InstanceDiagnosticsNotSupported(Invalid):"},{"line_number":2046,"context_line":"    msg_fmt \u003d _(\"Instance diagnostics is not supported by compute node.\")"},{"line_number":2047,"context_line":""},{"line_number":2048,"context_line":""},{"line_number":2049,"context_line":"class InvalidReservedMemoryPagesOption(Invalid):"}],"source_content_type":"text/x-python","patch_set":35,"id":"df140735_7e95e03f","line":2046,"range":{"start_line":2046,"start_character":38,"end_line":2046,"end_character":40},"updated":"2017-05-31 09:48:37.000000000","message":"are","commit_id":"a6335343cf63c1efc2bf4798ebb22f09ce077948"}],"nova/objects/diagnostics.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b6bf30845c91595f7fe9c0d4872138bd44c5a10a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":104,"context_line":"        super(Diagnostics, self).__init__(*args, **kwargs)"},{"line_number":105,"context_line":"        if \u0027cpu_details\u0027 not in kwargs:"},{"line_number":106,"context_line":"            self.cpu_details \u003d []"},{"line_number":107,"context_line":"            self.obj_reset_changes([\u0027cpu_details\u0027])"},{"line_number":108,"context_line":"        if \u0027nic_details\u0027 not in kwargs:"},{"line_number":109,"context_line":"            self.nic_details \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_f346f14d","line":106,"updated":"2017-01-11 12:53:12.000000000","message":"This can be instead of: \"\u0027cpu_details\u0027: fields.ListOfObjectsField(\u0027CpuDiagnostics\u0027, default\u003d[])\" at line 95?","commit_id":"a203f53712dc0899eb2924d557ee0c8e9d2d1641"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"4cac0afc1ff24d8bf63c5c29ef559062ce72a1e7","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":104,"context_line":"        super(Diagnostics, self).__init__(*args, **kwargs)"},{"line_number":105,"context_line":"        if \u0027cpu_details\u0027 not in kwargs:"},{"line_number":106,"context_line":"            self.cpu_details \u003d []"},{"line_number":107,"context_line":"            self.obj_reset_changes([\u0027cpu_details\u0027])"},{"line_number":108,"context_line":"        if \u0027nic_details\u0027 not in kwargs:"},{"line_number":109,"context_line":"            self.nic_details \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_e218d977","line":106,"in_reply_to":"ba5201f7_f346f14d","updated":"2017-01-11 14:04:28.000000000","message":"good point","commit_id":"a203f53712dc0899eb2924d557ee0c8e9d2d1641"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1976f405be46e0d019faa6455487a1921eccae0b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 VMware, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_a9d235fe","line":1,"updated":"2017-01-11 15:28:01.000000000","message":"Since this is a new file created by you, I\u0027m guessing the above is not right?","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"74e25a49fffca641c3aff30ab74d43251bfaa41f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 VMware, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_757f3a17","line":1,"in_reply_to":"ba5201f7_a9d235fe","updated":"2017-01-11 16:27:25.000000000","message":"copy paste :)","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1976f405be46e0d019faa6455487a1921eccae0b","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def add_disk(self, read_bytes\u003dNone, read_requests\u003dNone, write_bytes\u003dNone,"},{"line_number":157,"context_line":"                 write_requests\u003dNone, errors_count\u003dNone):"},{"line_number":158,"context_line":"        \"\"\"Create a new DiskDiagnostics object"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :param read_bytes: Disk reads in bytes(Integer)"},{"line_number":161,"context_line":"        :param read_requests: Read requests (Integer)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_e9743dff","line":158,"updated":"2017-01-11 15:28:01.000000000","message":"Is there any way to identify which disk this DiskDiagnostics is associated with?\n\nThe original (non-ovo) object had an \u0027id\u0027 field, why isn\u0027t that here?","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"84375f24e0338218e70e3c236b76c6e832b343e9","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def add_disk(self, read_bytes\u003dNone, read_requests\u003dNone, write_bytes\u003dNone,"},{"line_number":157,"context_line":"                 write_requests\u003dNone, errors_count\u003dNone):"},{"line_number":158,"context_line":"        \"\"\"Create a new DiskDiagnostics object"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :param read_bytes: Disk reads in bytes(Integer)"},{"line_number":161,"context_line":"        :param read_requests: Read requests (Integer)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_0ff7c159","line":158,"in_reply_to":"ba5201f7_e9743dff","updated":"2017-01-11 15:55:09.000000000","message":"mriedem and I cleared this up in IRC, based on initial discussion on the spec. link to irc: http://p.anticdent.org/30up","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1a56117c60b394a60cfb23530492dfc2e8f4574e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    fields \u003d {"},{"line_number":27,"context_line":"        \u0027id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":28,"context_line":"        \u0027time\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027utilisation\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":30,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_b7a57405","line":27,"range":{"start_line":27,"start_character":8,"end_line":27,"end_character":49},"updated":"2017-01-26 12:59:40.000000000","message":"For other reviewers - new field","commit_id":"943cd8f57b65dbd25efc4881d81b83bb0b9cf844"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1a56117c60b394a60cfb23530492dfc2e8f4574e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    fields \u003d {"},{"line_number":27,"context_line":"        \u0027id\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":28,"context_line":"        \u0027time\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":29,"context_line":"        \u0027utilisation\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":30,"context_line":"    }"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_97a078f6","line":29,"range":{"start_line":29,"start_character":8,"end_line":29,"end_character":58},"updated":"2017-01-26 12:59:40.000000000","message":"New field","commit_id":"943cd8f57b65dbd25efc4881d81b83bb0b9cf844"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1a56117c60b394a60cfb23530492dfc2e8f4574e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    fields \u003d {"},{"line_number":88,"context_line":"        \u0027state\u0027: fields.InstancePowerStateField(),"},{"line_number":89,"context_line":"        \u0027driver\u0027: fields.StringField(),"},{"line_number":90,"context_line":"        \u0027hypervisor\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":91,"context_line":"        \u0027hypervisor_os\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027uptime\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":"        \u0027config_drive\u0027: fields.BooleanField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_f741bc3a","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":56},"updated":"2017-01-26 12:59:40.000000000","message":"New field","commit_id":"943cd8f57b65dbd25efc4881d81b83bb0b9cf844"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1a56117c60b394a60cfb23530492dfc2e8f4574e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \u0027nic_details\u0027: fields.ListOfObjectsField(\u0027NicDiagnostics\u0027, default\u003d[]),"},{"line_number":98,"context_line":"        \u0027disk_details\u0027: fields.ListOfObjectsField(\u0027DiskDiagnostics\u0027,"},{"line_number":99,"context_line":"                                                  default\u003d[]),"},{"line_number":100,"context_line":"        \u0027num_cpus\u0027: fields.IntegerField(),"},{"line_number":101,"context_line":"        \u0027num_nics\u0027: fields.IntegerField(),"},{"line_number":102,"context_line":"        \u0027num_disks\u0027: fields.IntegerField()"},{"line_number":103,"context_line":"    }"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_173808d3","line":102,"range":{"start_line":100,"start_character":0,"end_line":102,"end_character":42},"updated":"2017-01-26 12:59:40.000000000","message":"New field.\n\nnit: I personally would have modified the original version of these objects (found in nova/virt/diagnostics.py) first, as this is really a separate change. I won\u0027t hold it up on FF day though","commit_id":"943cd8f57b65dbd25efc4881d81b83bb0b9cf844"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6488b06c3e998aadc59088598de7e5ceb79b6deb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    fields \u003d {"},{"line_number":40,"context_line":"        \u0027mac_address\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027rx_octets\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027rx_errors\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027rx_drop\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a461143_24722aae","line":40,"range":{"start_line":40,"start_character":30,"end_line":40,"end_character":41},"updated":"2017-01-26 15:31:54.000000000","message":"We have a mac address field you could use here.","commit_id":"8d2f159c5aa790994c0d54d418a8e8615fcda130"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"74e91e627fd41959dcb72fe6ed38288048a64b99","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    fields \u003d {"},{"line_number":40,"context_line":"        \u0027mac_address\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":41,"context_line":"        \u0027rx_octets\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":42,"context_line":"        \u0027rx_errors\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027rx_drop\u0027: fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a461143_186f4dc6","line":40,"range":{"start_line":40,"start_character":30,"end_line":40,"end_character":41},"in_reply_to":"3a461143_24722aae","updated":"2017-01-26 16:52:14.000000000","message":"yep","commit_id":"8d2f159c5aa790994c0d54d418a8e8615fcda130"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6488b06c3e998aadc59088598de7e5ceb79b6deb","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    fields \u003d {"},{"line_number":88,"context_line":"        \u0027state\u0027: fields.InstancePowerStateField(),"},{"line_number":89,"context_line":"        \u0027driver\u0027: fields.StringField(),"},{"line_number":90,"context_line":"        \u0027hypervisor\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":91,"context_line":"        \u0027hypervisor_os\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027uptime\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":"        \u0027config_drive\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":94,"context_line":"        \u0027memory_details\u0027: fields.ObjectField(\u0027MemoryDiagnostics\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a461143_84bafe21","line":91,"range":{"start_line":89,"start_character":0,"end_line":91,"end_character":59},"updated":"2017-01-26 15:31:54.000000000","message":"Feels like these should really be enums.","commit_id":"8d2f159c5aa790994c0d54d418a8e8615fcda130"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"74e91e627fd41959dcb72fe6ed38288048a64b99","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    fields \u003d {"},{"line_number":88,"context_line":"        \u0027state\u0027: fields.InstancePowerStateField(),"},{"line_number":89,"context_line":"        \u0027driver\u0027: fields.StringField(),"},{"line_number":90,"context_line":"        \u0027hypervisor\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":91,"context_line":"        \u0027hypervisor_os\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":92,"context_line":"        \u0027uptime\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":93,"context_line":"        \u0027config_drive\u0027: fields.BooleanField(nullable\u003dTrue),"},{"line_number":94,"context_line":"        \u0027memory_details\u0027: fields.ObjectField(\u0027MemoryDiagnostics\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a461143_984c1d72","line":91,"range":{"start_line":89,"start_character":0,"end_line":91,"end_character":59},"in_reply_to":"3a461143_84bafe21","updated":"2017-01-26 16:52:14.000000000","message":"agree about drive but now sure about hypervisor and hypervisor_os","commit_id":"8d2f159c5aa790994c0d54d418a8e8615fcda130"}],"nova/tests/unit/objects/test_diagnostics.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1976f405be46e0d019faa6455487a1921eccae0b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 VMware, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_299645f0","line":1,"updated":"2017-01-11 15:28:01.000000000","message":"not 2014, not vmware :)","commit_id":"c8b9f52077a9d44e0cdcefa4b3eabd7b83f41065"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1a56117c60b394a60cfb23530492dfc2e8f4574e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from nova import test"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def assertDiagnosticsEqual(self, expected, actual):"},{"line_number":20,"context_line":"    expected.obj_reset_changes(recursive\u003dTrue)"},{"line_number":21,"context_line":"    actual.obj_reset_changes(recursive\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    # NOTE(snikitin): Fields \u0027cpu_details\u0027, \u0027disk_details\u0027 and \u0027nic_details\u0027"},{"line_number":24,"context_line":"    # are list objects. They wouldn\u0027t be marked as \u0027changed\u0027 if new item will"},{"line_number":25,"context_line":"    # be added by \u0027append()\u0027 method (like Diagnostics.add_*** methods do)."},{"line_number":26,"context_line":"    # So we have to reset these objects manually."},{"line_number":27,"context_line":"    for obj in [expected, actual]:"},{"line_number":28,"context_line":"        for field in [\u0027cpu_details\u0027, \u0027disk_details\u0027, \u0027nic_details\u0027]:"},{"line_number":29,"context_line":"            for item in getattr(obj, field):"},{"line_number":30,"context_line":"                item.obj_reset_changes()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    self.assertEqual(expected.obj_to_primitive(),"},{"line_number":33,"context_line":"                     actual.obj_to_primitive())"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class DiagnosticsTests(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_d781204c","line":33,"range":{"start_line":19,"start_character":0,"end_line":33,"end_character":47},"updated":"2017-01-26 12:59:40.000000000","message":"nit: I don\u0027t like how this uses self outside of a class. I can only assume you\u0027ve done things this way to avoid duplicating code. If so, could you not have used a mixin instead?\n\n    class DiagnosticsComparisonMixin(object):\n\n        ...","commit_id":"943cd8f57b65dbd25efc4881d81b83bb0b9cf844"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1a56117c60b394a60cfb23530492dfc2e8f4574e","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            uptime\u003d10)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    if with_cpus:"},{"line_number":369,"context_line":"        for id, t in enumerate([15340000000, 1640000000,"},{"line_number":370,"context_line":"                                3040000000, 1420000000]):"},{"line_number":371,"context_line":"            obj.add_cpu(id\u003did, time\u003dt)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    if with_disks:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_973158a5","line":370,"range":{"start_line":369,"start_character":0,"end_line":370,"end_character":57},"updated":"2017-01-26 12:59:40.000000000","message":"nit: A comment on what these values represent would help - here or on the object itself","commit_id":"943cd8f57b65dbd25efc4881d81b83bb0b9cf844"}],"nova/tests/unit/virt/test_diagnostics.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6deeb2424e76a3e960a8d988a7a0ef524014cae1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 VMware, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_e9074e7f","side":"PARENT","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":33},"updated":"2017-01-18 21:23:14.000000000","message":"If you\u0027re using any of the tests from here in the new nova/tests/unit/objects/test_diagnostics.py file you should retain the copyright.","commit_id":"351493b57d00733a9b64ab8d68eee0077804d133"}],"nova/virt/diagnostics.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6deeb2424e76a3e960a8d988a7a0ef524014cae1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 VMware, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a3c09a3_89f16a98","side":"PARENT","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":33},"updated":"2017-01-18 21:23:14.000000000","message":"same","commit_id":"351493b57d00733a9b64ab8d68eee0077804d133"}]}
