)]}'
{"nova/compute/resource_tracker.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9694ddf441418e433c219c879dd8c605e6af0d96","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                    self.pci_tracker.update_pci_for_migration(instance,"},{"line_number":242,"context_line":"                                                              sign\u003d-1)"},{"line_number":243,"context_line":"                self._update_usage(self.compute_node, itype, sign\u003d-1)"},{"line_number":244,"context_line":"                self.compute_node[\u0027stats\u0027] \u003d jsonutils.dumps(self.stats)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"                ctxt \u003d context.get_admin_context()"},{"line_number":247,"context_line":"                self._update(ctxt, self.compute_node)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BFAM%3D","line":244,"updated":"2014-01-30 12:01:29.000000000","message":"Part of me feels like we should do this in the instance object, maybe an extra property, maybe having the raw stats as self._stats?","commit_id":"b5793947c8557b68f62de3244f055365f675b237"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"4fc46b2dfa016c9bb81fe5db234d272174c07698","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                    self.pci_tracker.update_pci_for_migration(instance,"},{"line_number":242,"context_line":"                                                              sign\u003d-1)"},{"line_number":243,"context_line":"                self._update_usage(self.compute_node, itype, sign\u003d-1)"},{"line_number":244,"context_line":"                self.compute_node[\u0027stats\u0027] \u003d jsonutils.dumps(self.stats)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"                ctxt \u003d context.get_admin_context()"},{"line_number":247,"context_line":"                self._update(ctxt, self.compute_node)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9y9c%3D","line":244,"in_reply_to":"AAAAUH%2F%2BFAM%3D","updated":"2014-02-03 20:47:02.000000000","message":"It\u0027s a good idea, but the RT isn\u0027t using objects yet. :)","commit_id":"b5793947c8557b68f62de3244f055365f675b237"}],"nova/objects/compute_node.py":[{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"aeab9e259a8d321fb3db21cb2dd3d14039c63df3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027cpu_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FXOs%3D","line":46,"updated":"2014-01-14 16:34:23.000000000","message":"This could be a fields.DictOfStringsField(nullable\u003dTrue). @danms has been pretty keen on avoiding untyped json blobs - metrics etc. are being converted for this reason. I think stats is a perfect candidate for the this case - what do you think?","commit_id":"3ccf144adb8fd9b3f562688aa8cd12992bd8b72a"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"f2f61fb950108ade9cba4dcd251b7f65195e1a5f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \u0027cpu_info\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FKbg%3D","line":46,"in_reply_to":"AAAAUH%2F%2FXOs%3D","updated":"2014-01-16 20:35:57.000000000","message":"Sure, that type would probably be better.  I\u0027ll give that a go.","commit_id":"3ccf144adb8fd9b3f562688aa8cd12992bd8b72a"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"aeab9e259a8d321fb3db21cb2dd3d14039c63df3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @staticmethod"},{"line_number":50,"context_line":"    def _from_db_object(context, compute, db_compute):"},{"line_number":51,"context_line":"        for key in compute.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FXOk%3D","line":48,"updated":"2014-01-14 16:34:23.000000000","message":"Also need to define obj_make_compatible(self, primitive, target_version)","commit_id":"3ccf144adb8fd9b3f562688aa8cd12992bd8b72a"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"f2f61fb950108ade9cba4dcd251b7f65195e1a5f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        }"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @staticmethod"},{"line_number":50,"context_line":"    def _from_db_object(context, compute, db_compute):"},{"line_number":51,"context_line":"        for key in compute.fields:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FKZI%3D","line":48,"in_reply_to":"AAAAUH%2F%2FXOk%3D","updated":"2014-01-16 20:35:57.000000000","message":"Done","commit_id":"3ccf144adb8fd9b3f562688aa8cd12992bd8b72a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9694ddf441418e433c219c879dd8c605e6af0d96","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Copyright 2013 IBM Corp."},{"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":3,"id":"AAAAUH%2F%2BE%2Fc%3D","side":"PARENT","line":1,"updated":"2014-01-30 12:01:29.000000000","message":"?","commit_id":"35ffc74efc6ec50bee6440f1a9be6eb87c3700bd"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"3694a986461e23deeabd4f72dc16b1323a8f054d","unresolved":false,"context_lines":[{"line_number":117,"context_line":"class ComputeNodeList(base.ObjectListBase, base.NovaObject):"},{"line_number":118,"context_line":"    # Version 1.0: Initial version"},{"line_number":119,"context_line":"    #              ComputeNode \u003c\u003d version 1.2"},{"line_number":120,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":121,"context_line":"    fields \u003d {"},{"line_number":122,"context_line":"        \u0027objects\u0027: fields.ListOfObjectsField(\u0027ComputeNode\u0027),"},{"line_number":123,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F9sUE%3D","line":120,"updated":"2014-02-04 22:53:02.000000000","message":"The version number here needs to be bumped and a new mapping added to the child_versions below. i.e. VERSION \u003d \u00271.1\u0027 and child_versions \u003d {\u00271.0\u0027: \u00271.2\u0027, \u00271.1\u0027: \u00271.3\u0027}. The mapping is used so the ComputeNodeList knows what version the children have to be if it is made compatible with an earlier version, so all past versions are retained (until they are obsolete).","commit_id":"df1eca6f171bbfb3973a6a30e8d3a360f4b50d8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77ce8e8bd69f4d3a31a3b822be713ee9cf7a6c1b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":54,"context_line":"            # pre 1.3 version does not have a stats field"},{"line_number":55,"context_line":"            del primitive[\u0027stats\u0027]"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2FmNo%3D","line":53,"updated":"2014-02-12 04:53:32.000000000","message":"We don\u0027t need to check if \u0027stats\u0027 is in primitive here?  Because _from_db_object sets the default?","commit_id":"8a7b95dccdbe449d5235868781b30edebd34bacd"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"0622fd0fcbdfa254fd198348130776a26cd58be0","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":51,"context_line":"        target_version \u003d (int(target_version.split(\u0027.\u0027)[0]),"},{"line_number":52,"context_line":"                          int(target_version.split(\u0027.\u0027)[1]))"},{"line_number":53,"context_line":"        if target_version \u003c (1, 3):"},{"line_number":54,"context_line":"            # pre 1.3 version does not have a stats field"},{"line_number":55,"context_line":"            del primitive[\u0027stats\u0027]"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2FiFU%3D","line":53,"in_reply_to":"AAAAUX%2F%2FmNo%3D","updated":"2014-02-12 15:05:59.000000000","message":"This should check if stats is in primitive. It could be missing if passed in a message from a 1.2 node at least. This check is added here: https://review.openstack.org/#/c/66959/","commit_id":"8a7b95dccdbe449d5235868781b30edebd34bacd"}]}
