)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eef1c4b8e83b741a1709b10e07a862ed83420324","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Pavel Kholkin \u003cpkholkin@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-01 18:35:58 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Microversion 2.28 changes cpu_info string to json"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After this microversion Nova API the GET request to"},{"line_number":10,"context_line":"/v2.1/os-hypervisors/{hypervisor_id} responses cpu_info"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"9abb7d3a_0bfe5ead","line":7,"updated":"2016-06-01 15:49:07.000000000","message":"Sorry to nit out on this, but it should be s/json/object/ or something right? If the response (which is json) contains json, then that would be a string inside the original json response, right?","commit_id":"d5093d4156ba08d478b68cca0ec3890f589bdc19"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"cfa6592e565eb3c38465945a2d1f667a8fc39790","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Pavel Kholkin \u003cpkholkin@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-01 18:35:58 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Microversion 2.28 changes cpu_info string to json"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After this microversion Nova API the GET request to"},{"line_number":10,"context_line":"/v2.1/os-hypervisors/{hypervisor_id} responses cpu_info"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"9abb7d3a_2176e33d","line":7,"in_reply_to":"9abb7d3a_0bfe5ead","updated":"2016-06-01 16:26:36.000000000","message":"decided to update to json object","commit_id":"d5093d4156ba08d478b68cca0ec3890f589bdc19"}],"nova/api/openstack/compute/hypervisors.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6a948cf4683820e82aeb9d542eb1ce0c2d09e1ce","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                \u0027disabled_reason\u0027: service.disabled_reason,"},{"line_number":66,"context_line":"                }"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"            req \u003d kwargs.pop(\u0027req\u0027, None)"},{"line_number":69,"context_line":"            if req and api_version_request.is_supported("},{"line_number":70,"context_line":"                    req, min_version\u003d\u00272.28\u0027):"},{"line_number":71,"context_line":"                hyp_dict[\u0027cpu_info\u0027] \u003d jsonutils.loads(hypervisor.cpu_info)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_a394a08a","line":68,"updated":"2016-06-01 14:37:29.000000000","message":"I would just make req a formal positional arg to this method. You can pass it in even on index (i.e. non-detail). Someday it could be useful even for that operation and it makes it more consistent.","commit_id":"47c19b04018af223a59f4beb88ac3d2a3ee82777"}],"nova/objects/compute_node.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":74,"context_line":"        # TODO(melwitt): cpu_info is non-nullable in the schema but we must"},{"line_number":75,"context_line":"        # wait until version 2.0 of ComputeNode to change it to non-nullable"},{"line_number":76,"context_line":"        \u0027cpu_info\u0027: fields.ObjectField(\u0027HWCPUModel\u0027, nullable\u003dTrue),"},{"line_number":77,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":78,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027stats\u0027: fields.DictOfNullableStringsField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_44f9204d","line":76,"updated":"2016-05-24 15:26:04.000000000","message":"You can\u0027t change this. Older nodes sending to a newer node will send something that is not loadable. You don\u0027t get to make the compatibility adjustment on load because all changes have to be forward compatible.","commit_id":"6199cc42723bf4cfee2bf7d0ce9c65bca74b3fdf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":100,"context_line":"        if target_version \u003c (1, 17):"},{"line_number":101,"context_line":"            if \u0027cpu_info\u0027 in primitive:"},{"line_number":102,"context_line":"                primitive[\u0027cpu_info\u0027] \u003d primitive[\u0027cpu_info\u0027].to_json()"},{"line_number":103,"context_line":"        if target_version \u003c (1, 16):"},{"line_number":104,"context_line":"            if \u0027disk_allocation_ratio\u0027 in primitive:"},{"line_number":105,"context_line":"                del primitive[\u0027disk_allocation_ratio\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_a4944ce8","line":102,"range":{"start_line":102,"start_character":40,"end_line":102,"end_character":71},"updated":"2016-05-24 15:26:04.000000000","message":"primitive[\u0027cpu_info\u0027] is a dict here, so you can\u0027t call to_json() on it.","commit_id":"6199cc42723bf4cfee2bf7d0ce9c65bca74b3fdf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        if \u0027cpu_info\u0027 in updates:"},{"line_number":291,"context_line":"            cpu_info \u003d updates.pop(\u0027cpu_info\u0027, None)"},{"line_number":292,"context_line":"            if cpu_info is not None:"},{"line_number":293,"context_line":"                cpu_info \u003d cpu_info.to_json()"},{"line_number":294,"context_line":"            updates[\u0027cpu_info\u0027] \u003d cpu_info"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_844e6894","line":293,"updated":"2016-05-24 15:26:04.000000000","message":"Adding more things stored as blobs is a bad plan, IMHO. You should let this be serialized in the versioned format, IMHO.","commit_id":"6199cc42723bf4cfee2bf7d0ce9c65bca74b3fdf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        if \u0027cpu_info\u0027 in resources:"},{"line_number":495,"context_line":"            cpu_info \u003d resources[\u0027cpu_info\u0027]"},{"line_number":496,"context_line":"            self.cpu_info \u003d objects.HWCPUModel.from_json(cpu_info)"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        # supported_instances has a different name in compute_node"},{"line_number":499,"context_line":"        if \u0027supported_instances\u0027 in resources:"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_6458a457","line":496,"updated":"2016-05-24 15:26:04.000000000","message":"Why not make the virt drivers return the new object?","commit_id":"6199cc42723bf4cfee2bf7d0ce9c65bca74b3fdf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":520,"context_line":"    # Version 1.13 ComputeNode version 1.13"},{"line_number":521,"context_line":"    # Version 1.14 ComputeNode version 1.14"},{"line_number":522,"context_line":"    # Version 1.15 ComputeNode version 1.17"},{"line_number":523,"context_line":"    VERSION \u003d \u00271.15\u0027"},{"line_number":524,"context_line":"    fields \u003d {"},{"line_number":525,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"},{"line_number":526,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_245e9c45","line":523,"updated":"2016-05-24 15:26:04.000000000","message":"Why?","commit_id":"6199cc42723bf4cfee2bf7d0ce9c65bca74b3fdf"}],"nova/objects/vcpu_model.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from nova.objects import fields"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":21,"context_line":"class VirtCPUModel(base.NovaObject):"},{"line_number":22,"context_line":"    # Version 1.0: Initial version"},{"line_number":23,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_27417e3a","side":"PARENT","line":20,"updated":"2016-05-24 15:26:04.000000000","message":"You can\u0027t just stop registering an object if there is any chance we\u0027ll need to deserialize it at some point. I\u0027m pretty sure this does not qualify right?","commit_id":"fe8a119e8d80de35d7f99e0c1d9a9e5095840146"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                                              default\u003d[]),"},{"line_number":32,"context_line":"        \u0027mode\u0027: fields.CPUModeField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027model\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027match\u0027: fields.CPUMatchField(nullable\u003dTrue),"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def obj_load_attr(self, attrname):"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_27685eba","side":"PARENT","line":34,"updated":"2016-05-24 15:26:04.000000000","message":"Assuming the above is true, you can\u0027t change/remove these fields.","commit_id":"fe8a119e8d80de35d7f99e0c1d9a9e5095840146"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027match\u0027: fields.CPUMatchField(nullable\u003dTrue),"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":38,"context_line":"        setattr(self, attrname, None)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def to_json(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_e71f7659","side":"PARENT","line":37,"updated":"2016-05-24 15:26:04.000000000","message":"Why is this removed?","commit_id":"fe8a119e8d80de35d7f99e0c1d9a9e5095840146"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d1d209b9ef3defdff7723543318ca3b4953e0eb5","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":46,"context_line":"class HWCPUModel(CPUModel):"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":48,"context_line":"    fields \u003d {"},{"line_number":49,"context_line":"        \u0027features\u0027: fields.ListOfStringsField()"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_e708162b","line":46,"updated":"2016-05-24 15:26:04.000000000","message":"Why do we need a new subclass for this and Virt?","commit_id":"6199cc42723bf4cfee2bf7d0ce9c65bca74b3fdf"}]}
