)]}'
{"nova/compute/resource_tracker.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2e1133cf924dcdc7ad4b2e1f62ccdf9c75601cd","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        # initialize load stats from existing instances:"},{"line_number":373,"context_line":"        self.compute_node \u003d compute_node_obj.ComputeNode()"},{"line_number":374,"context_line":"        self.compute_node.update(values)"},{"line_number":375,"context_line":"        LOG.info(self.compute_node.__str__())"},{"line_number":376,"context_line":"        self.compute_node.create(context)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def _get_service(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9z24%3D","line":375,"updated":"2013-12-05 17:12:36.000000000","message":"I assume this is debug that is coming out, right?","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"47e3cec60cdb752886d9ca0b4b75589367e8ba54","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        # initialize load stats from existing instances:"},{"line_number":373,"context_line":"        self.compute_node \u003d compute_node_obj.ComputeNode()"},{"line_number":374,"context_line":"        self.compute_node.update(values)"},{"line_number":375,"context_line":"        LOG.info(self.compute_node.__str__())"},{"line_number":376,"context_line":"        self.compute_node.create(context)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def _get_service(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9zoI%3D","line":375,"in_reply_to":"AAAATn%2F9z24%3D","updated":"2013-12-05 18:19:08.000000000","message":"Right - thanks for spotting it - I normally add a comment next to things to be removed","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"7448839a9a9e380620a6d63aca4dfa27559a60ac","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        # initialize load stats from existing instances:"},{"line_number":373,"context_line":"        self.compute_node \u003d compute_node_obj.ComputeNode()"},{"line_number":374,"context_line":"        self.compute_node.update(values)"},{"line_number":375,"context_line":"        LOG.info(self.compute_node.__str__())"},{"line_number":376,"context_line":"        self.compute_node.create(context)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    def _get_service(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9ut8%3D","line":375,"in_reply_to":"AAAATn%2F9zoI%3D","updated":"2013-12-06 17:23:32.000000000","message":"Done","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2e1133cf924dcdc7ad4b2e1f62ccdf9c75601cd","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    def _update(self, context, values, prune_stats\u003dFalse):"},{"line_number":436,"context_line":"        \"\"\"Persist the compute node updates to the DB.\"\"\""},{"line_number":437,"context_line":"        if \"service\" in self.compute_node:"},{"line_number":438,"context_line":"            del self.compute_node.service"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        self.compute_node.update(values)"},{"line_number":441,"context_line":"        self.compute_node.save(context, prune_stats)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9z2k%3D","line":438,"updated":"2013-12-05 17:12:36.000000000","message":"Hmm, does this work?","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"47e3cec60cdb752886d9ca0b4b75589367e8ba54","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    def _update(self, context, values, prune_stats\u003dFalse):"},{"line_number":436,"context_line":"        \"\"\"Persist the compute node updates to the DB.\"\"\""},{"line_number":437,"context_line":"        if \"service\" in self.compute_node:"},{"line_number":438,"context_line":"            del self.compute_node.service"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        self.compute_node.update(values)"},{"line_number":441,"context_line":"        self.compute_node.save(context, prune_stats)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9zck%3D","line":438,"in_reply_to":"AAAATn%2F9z2k%3D","updated":"2013-12-05 18:19:08.000000000","message":"Probably not - its not very objecty anyway - I\u0027ll change it","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"7448839a9a9e380620a6d63aca4dfa27559a60ac","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    def _update(self, context, values, prune_stats\u003dFalse):"},{"line_number":436,"context_line":"        \"\"\"Persist the compute node updates to the DB.\"\"\""},{"line_number":437,"context_line":"        if \"service\" in self.compute_node:"},{"line_number":438,"context_line":"            del self.compute_node.service"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        self.compute_node.update(values)"},{"line_number":441,"context_line":"        self.compute_node.save(context, prune_stats)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9uuE%3D","line":438,"in_reply_to":"AAAATn%2F9zck%3D","updated":"2013-12-06 17:23:32.000000000","message":"This is not needed. compute_node.service has the property decorator. Its created when read, the value is retained in _cached_service, and it is never updated to the database. So it is not necessary to remove it. Previously its presence would mess up the update.","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e6373a4f829bed1a79f3337d0bc880f0da477b64","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        if uuid in self.tracked_instances:"},{"line_number":260,"context_line":"            self._update_usage_from_instance(self.compute_node, instance)"},{"line_number":261,"context_line":"            elevated \u003d context.elevated()"},{"line_number":262,"context_line":"            self._update(elevated)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @property"},{"line_number":265,"context_line":"    def disabled(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9g0s%3D","line":262,"updated":"2013-12-10 18:42:52.000000000","message":"If you have to revise this, I\u0027d just change this to:\n\n  self._update(context.elevated())","commit_id":"b5cec520b3473c9978e1c5b8d519d6597c3fa1a0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6b2a4527f6db68c2f0f111601bcd712c357968d1","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        if uuid in self.tracked_instances:"},{"line_number":260,"context_line":"            self._update_usage_from_instance(self.compute_node, instance)"},{"line_number":261,"context_line":"            elevated \u003d context.elevated()"},{"line_number":262,"context_line":"            self._update(elevated)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @property"},{"line_number":265,"context_line":"    def disabled(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9as0%3D","line":262,"in_reply_to":"AAAATn%2F9dNI%3D","updated":"2013-12-11 18:41:06.000000000","message":"I\u0027d be okay changing the others too, but I see that they do the same for no reason, so that\u0027s fine.","commit_id":"b5cec520b3473c9978e1c5b8d519d6597c3fa1a0"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"fff640490fd4c90bd5545926eb426533c8e0bc46","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        if uuid in self.tracked_instances:"},{"line_number":260,"context_line":"            self._update_usage_from_instance(self.compute_node, instance)"},{"line_number":261,"context_line":"            elevated \u003d context.elevated()"},{"line_number":262,"context_line":"            self._update(elevated)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @property"},{"line_number":265,"context_line":"    def disabled(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9dNI%3D","line":262,"in_reply_to":"AAAATn%2F9g0s%3D","updated":"2013-12-11 10:38:41.000000000","message":"Hi Dan, personally I agree, but I changed this to be consistent. All the other calls in this file like this one don\u0027t inline (either context.elevated() or context.get_admin_context()) - so I changed it to be like the others.","commit_id":"b5cec520b3473c9978e1c5b8d519d6597c3fa1a0"}],"nova/objects/compute_node.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2e1133cf924dcdc7ad4b2e1f62ccdf9c75601cd","unresolved":false,"context_lines":[{"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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9z30%3D","line":47,"updated":"2013-12-05 17:12:36.000000000","message":"You need an obj_make_compatible() helper to backport this to nodes that aren\u0027t expecting the new fields.\n\nAlso, is host_ip really nullable? Meaning, will we ever not have it?","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"47e3cec60cdb752886d9ca0b4b75589367e8ba54","unresolved":false,"context_lines":[{"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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9zdY%3D","line":47,"in_reply_to":"AAAATn%2F9z30%3D","updated":"2013-12-05 18:19:08.000000000","message":"ok - will do","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"7448839a9a9e380620a6d63aca4dfa27559a60ac","unresolved":false,"context_lines":[{"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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9udY%3D","line":47,"in_reply_to":"AAAATn%2F9zdY%3D","updated":"2013-12-06 17:23:32.000000000","message":"There seem to be a number of tests that have host_ip as a null value. Also it is defined as nullable in the database. So I think I will leave it that way.","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c2e1133cf924dcdc7ad4b2e1f62ccdf9c75601cd","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def save(self, context, prune_stats\u003dFalse):"},{"line_number":76,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":77,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":78,"context_line":"        updates.pop(\u0027created_at\u0027, None) #ptm:remove"},{"line_number":79,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":80,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":81,"context_line":"        self._from_db_object(context, self, db_compute)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9z10%3D","line":78,"updated":"2013-12-05 17:12:36.000000000","message":"Is this the source of your timezone issues? This is just because you\u0027re using .update() from the raw object, so I don\u0027t know that popping these off is bad.","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"47e3cec60cdb752886d9ca0b4b75589367e8ba54","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def save(self, context, prune_stats\u003dFalse):"},{"line_number":76,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":77,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":78,"context_line":"        updates.pop(\u0027created_at\u0027, None) #ptm:remove"},{"line_number":79,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":80,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":81,"context_line":"        self._from_db_object(context, self, db_compute)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9zdk%3D","line":78,"in_reply_to":"AAAATn%2F9z10%3D","updated":"2013-12-05 18:19:08.000000000","message":"Removing the created_at here avoids the problem. Whithout this line I get the exception in compute_node_update (or rather at the bottom of sqlalchemy). I need to trace where created_at gets changed/converted.","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"7448839a9a9e380620a6d63aca4dfa27559a60ac","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def save(self, context, prune_stats\u003dFalse):"},{"line_number":76,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":77,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":78,"context_line":"        updates.pop(\u0027created_at\u0027, None) #ptm:remove"},{"line_number":79,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":80,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":81,"context_line":"        self._from_db_object(context, self, db_compute)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9utw%3D","line":78,"in_reply_to":"AAAATn%2F9zdk%3D","updated":"2013-12-06 17:23:32.000000000","message":"I have found the bug and removed this line.","commit_id":"7d1833393a5f1c349cc905e5904aa98bc03a5a25"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e6373a4f829bed1a79f3337d0bc880f0da477b64","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # but defining this method to be sure."},{"line_number":53,"context_line":"        if target_version \u003d\u003d \u00271.2\u0027:"},{"line_number":54,"context_line":"            del fields[\u0027host_ip\u0027]"},{"line_number":55,"context_line":"            del fields[\u0027pci_stats\u0027]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"},{"line_number":58,"context_line":"    def _from_db_object(context, compute, db_compute):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9g0A%3D","line":55,"updated":"2013-12-10 18:42:52.000000000","message":"Won\u0027t this throw a NameError for fields?\n\nIf it *did* work, it would modify the whole local class definition, which we definitely don\u0027t want. Just remove the actual entries from the primitive (see https://review.openstack.org/#/c/52547/ for an example).","commit_id":"b5cec520b3473c9978e1c5b8d519d6597c3fa1a0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"ea262a64fc86cc2ed219c253612a5638d48fe8d7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # but defining this method to be sure."},{"line_number":53,"context_line":"        if target_version \u003d\u003d \u00271.2\u0027:"},{"line_number":54,"context_line":"            del fields[\u0027host_ip\u0027]"},{"line_number":55,"context_line":"            del fields[\u0027pci_stats\u0027]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"},{"line_number":58,"context_line":"    def _from_db_object(context, compute, db_compute):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9dF8%3D","line":55,"in_reply_to":"AAAATn%2F9g0A%3D","updated":"2013-12-11 11:10:09.000000000","message":"Done","commit_id":"b5cec520b3473c9978e1c5b8d519d6597c3fa1a0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5be88dda1bcd4f9f91b5baddec15459a54f393f2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # but defining this method to be sure."},{"line_number":53,"context_line":"        if target_version \u003d\u003d \u00271.2\u0027:"},{"line_number":54,"context_line":"            del primitive[\u0027host_ip\u0027]"},{"line_number":55,"context_line":"            del primitive[\u0027pci_stats\u0027]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"},{"line_number":58,"context_line":"    def _from_db_object(context, compute, db_compute):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9asY%3D","line":55,"updated":"2013-12-11 18:41:59.000000000","message":"This needs a test.","commit_id":"6e0031fa0a94b6b17fb8900890fa401bb1f9972e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"03ee1654620b126a91e7aa33225b5749eec82e7d","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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9Tzs%3D","line":46,"updated":"2013-12-12 19:31:12.000000000","message":"This should be a strongly-typed IPAddress field","commit_id":"fd925e166decdf630dd874d58839fe9b0e9f9a7f"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"ab0b5a9e7317fff5f57e75d4e75ec51c4ba0ea55","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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9QAI%3D","line":46,"in_reply_to":"AAAATn%2F9Tzs%3D","updated":"2013-12-13 14:22:07.000000000","message":"Done","commit_id":"fd925e166decdf630dd874d58839fe9b0e9f9a7f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"03ee1654620b126a91e7aa33225b5749eec82e7d","unresolved":false,"context_lines":[{"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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9TzY%3D","line":47,"updated":"2013-12-12 19:31:12.000000000","message":"Looking at the database models, this is just a JSON blob, which is unversioned and unstructured. If we add this, we have no way of validating or guaranteeing compatibility during upgrades. If this is just a dictionary of key\u003dvalue properties, then it should be a DictOfStrings type field.","commit_id":"fd925e166decdf630dd874d58839fe9b0e9f9a7f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"970a1460438461a4bdbcbafe2139a8a2d19b4284","unresolved":false,"context_lines":[{"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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9OLM%3D","line":47,"in_reply_to":"AAAATn%2F9QAA%3D","updated":"2013-12-13 20:45:31.000000000","message":"DictOfStrings doesn\u0027t make it an object, it enforces the contents of what people try to put there.\n\nIMHO, just throwing a JSON blob in here is not sufficient for defining the contents so that we can ensure that they are compatible between releases.","commit_id":"fd925e166decdf630dd874d58839fe9b0e9f9a7f"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"ab0b5a9e7317fff5f57e75d4e75ec51c4ba0ea55","unresolved":false,"context_lines":[{"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":"        \u0027host_ip\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9QAA%3D","line":47,"in_reply_to":"AAAATn%2F9TzY%3D","updated":"2013-12-13 14:22:07.000000000","message":"Hi Dan, we believe this is more of a DictOfDictOfStrings, which is at my limit for Hungarian type parameterisation. StringField matches the current use in the code, which dumps a JSON string. This also leaves maximum flexibility and ensures good change-tracking. If we make this a mutable object, change-tracking becomes more difficult.","commit_id":"fd925e166decdf630dd874d58839fe9b0e9f9a7f"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"1f17f1e33e8f1f3df73909ff63fa68520ffe27f0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        expected_attrs \u003d [attr for attr in OPTIONAL_FIELDS"},{"line_number":152,"context_line":"                          if attr in updates]"},{"line_number":153,"context_line":"        updates.pop(\u0027pci_stats\u0027, None)"},{"line_number":154,"context_line":"        updates.pop(\u0027metrics\u0027, None)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"},{"line_number":157,"context_line":"        self._from_db_object(context, self, db_compute,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FzTE%3D","line":154,"updated":"2014-01-08 09:42:39.000000000","message":"Dear reviewers, I don\u0027t know if this is a valid change, waiting for feedback from Shane Wang. Makes the tests pass though!","commit_id":"f2fde63d4103f1ba9221299cbd6f7cce9aac6aac"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"1f17f1e33e8f1f3df73909ff63fa68520ffe27f0","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        expected_attrs \u003d [attr for attr in OPTIONAL_FIELDS"},{"line_number":165,"context_line":"                          if attr in updates]"},{"line_number":166,"context_line":"        updates.pop(\u0027pci_stats\u0027, None)"},{"line_number":167,"context_line":"        updates.pop(\u0027metrics\u0027, None)"},{"line_number":168,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":169,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":170,"context_line":"        self._from_db_object(context, self, db_compute,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FzTA%3D","line":167,"updated":"2014-01-08 09:42:39.000000000","message":"Dear reviewers, I don\u0027t know if this is a valid change, waiting for feedback from Shane Wang. Makes the tests pass though!","commit_id":"f2fde63d4103f1ba9221299cbd6f7cce9aac6aac"}],"nova/tests/compute/test_resource_tracker.py":[{"author":{"_account_id":1865,"name":"Andrea Rosa","email":"andrea.rosa@gmail.com","username":"andrea-rosa-m"},"change_message_id":"9c89272332297ff01e3c5292c86e838de60b498b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\"Tests for compute resource tracking.\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"},{"line_number":21,"context_line":"# import re"},{"line_number":22,"context_line":"import uuid"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BFWQ%3D","line":21,"updated":"2014-01-30 10:29:03.000000000","message":"instead of comment the line, please can you remove it completley?","commit_id":"4033ea328bdd37dd3b4f8d07a6bf7879be975940"},{"author":{"_account_id":1865,"name":"Andrea Rosa","email":"andrea.rosa@gmail.com","username":"andrea-rosa-m"},"change_message_id":"9c89272332297ff01e3c5292c86e838de60b498b","unresolved":false,"context_lines":[{"line_number":577,"context_line":"#"},{"line_number":578,"context_line":"#    def _driver(self):"},{"line_number":579,"context_line":"#        return FakeVirtDriver(pci_support\u003dTrue)"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"class InstanceClaimTestCase(BaseTrackerTestCase):"},{"line_number":583,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BFWI%3D","line":580,"updated":"2014-01-30 10:29:03.000000000","message":"same as above","commit_id":"4033ea328bdd37dd3b4f8d07a6bf7879be975940"}]}
