)]}'
{"nova/objects/compute_node.py":[{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f1f26bebdd4446b4d2b92c501f4ed93e8ea4e647","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    # Version 1.1: Added get_by_service_id()"},{"line_number":23,"context_line":"    # Version 1.2: String attributes updated to support unicode"},{"line_number":24,"context_line":"    # Version 1.3: Added missing attributes"},{"line_number":25,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BhVE%3D","line":24,"updated":"2013-11-25 07:18:25.000000000","message":"can we put the new attributes here for reference conveniently?","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"a344adca68c51fac46309a5139a9cb8ea241effa","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    # Version 1.1: Added get_by_service_id()"},{"line_number":23,"context_line":"    # Version 1.2: String attributes updated to support unicode"},{"line_number":24,"context_line":"    # Version 1.3: Added missing attributes"},{"line_number":25,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BRcA%3D","line":24,"in_reply_to":"AAAATn%2F%2BeqU%3D","updated":"2013-11-28 05:39:50.000000000","message":"Done","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3927e8e748eeae0c94f847d8aa4e06fd2d65d88b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    # Version 1.1: Added get_by_service_id()"},{"line_number":23,"context_line":"    # Version 1.2: String attributes updated to support unicode"},{"line_number":24,"context_line":"    # Version 1.3: Added missing attributes"},{"line_number":25,"context_line":"    VERSION \u003d \u00271.3\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BeqU%3D","line":24,"in_reply_to":"AAAATn%2F%2BhVE%3D","updated":"2013-11-25 16:50:29.000000000","message":"Agreed.","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f1f26bebdd4446b4d2b92c501f4ed93e8ea4e647","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027host_ip\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BhVw%3D","line":45,"updated":"2013-11-25 07:18:25.000000000","message":"do we need to considering the possibility of ipv6 here?","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"a344adca68c51fac46309a5139a9cb8ea241effa","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":44,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027host_ip\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BRNw%3D","line":45,"in_reply_to":"AAAATn%2F%2BhVw%3D","updated":"2013-11-28 05:39:50.000000000","message":"Done","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3927e8e748eeae0c94f847d8aa4e06fd2d65d88b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        \u0027host_ip\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2Beps%3D","line":48,"updated":"2013-11-25 16:50:29.000000000","message":"You need an obj_make_compatible() handler that removes the new fields if we\u0027re sending this object to older (i.e. \u003c 1.3) clients.","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"a344adca68c51fac46309a5139a9cb8ea241effa","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        \u0027host_ip\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":46,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BRM4%3D","line":48,"in_reply_to":"AAAATn%2F%2Beps%3D","updated":"2013-11-28 05:39:50.000000000","message":"Done","commit_id":"53adb0804a53e4df010068cb9c536657d8656da1"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2bb6c8544cc6f261a950d2e7fab47931a420f67c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        }"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BPEA%3D","line":49,"updated":"2013-11-28 14:04:43.000000000","message":"is this not a dictionary?\n\nshould you not use fields.DictOfStringsField(nullable\u003dTrue), or fields.ListOfStringsField(nullable\u003dTrue)","commit_id":"4e0a153bccc86399111665307cde993f1d263f65"},{"author":{"_account_id":7543,"name":"Yongli He","email":"yongli.he@intel.com","username":"yongli.he"},"change_message_id":"cd71f928977d311f8627d4e0099154ce718923c8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        }"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BNoM%3D","line":49,"in_reply_to":"AAAATn%2F%2BPEA%3D","updated":"2013-11-29 02:41:26.000000000","message":"Hi,\nin fact, pci_stats is list of dict, and in this dict is the sting (k,v). like:\n[  { }  { } ]\n\nand i want the pci_stats is just a sting, let PCI to determine it internal structure, if possible.\n\nif expose everything here, pci will couple tighter with obj/db, and except pci (filter) no one should access this field.","commit_id":"4e0a153bccc86399111665307cde993f1d263f65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7661bd923c75f2649100b6b7efe86243ea790c6a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return self._cached_service"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":98,"context_line":"        if versionutils.is_compatible(target_version, \u00271.2\u0027):"},{"line_number":99,"context_line":"            del primitive[\u0027host_ip\u0027]"},{"line_number":100,"context_line":"            del primitive[\u0027supported_instance\u0027]"},{"line_number":101,"context_line":"            del primitive[\u0027pci_stats\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BPYE%3D","line":98,"updated":"2013-11-28 12:55:05.000000000","message":"I think this is confusing. Elsewhere we use is_compatible() to determine that an older version can be passed to newer code. Here, you\u0027re reversing it and saying \"if it is compatible, then delete these things [to make it compatible]\".\n\nI think we need another helper to break out the version pieces for easy comparison, but not just abuse (IMHO) the is_compatible() function here.","commit_id":"4e0a153bccc86399111665307cde993f1d263f65"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"4ee669415779de2118bb3b024dca413cb7b880c8","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        return self._cached_service"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":98,"context_line":"        if versionutils.is_compatible(target_version, \u00271.2\u0027):"},{"line_number":99,"context_line":"            del primitive[\u0027host_ip\u0027]"},{"line_number":100,"context_line":"            del primitive[\u0027supported_instance\u0027]"},{"line_number":101,"context_line":"            del primitive[\u0027pci_stats\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BNnY%3D","line":98,"in_reply_to":"AAAATn%2F%2BPYE%3D","updated":"2013-11-29 03:49:31.000000000","message":"Here I mean if the version is compatible with the 1.2 version (1.2 version is also an old version, the new version is 1.3 version so I have to delete those fields). But anyway, new helpers make it more clear.","commit_id":"4e0a153bccc86399111665307cde993f1d263f65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6c339348e31c415581f6bd94ffb696b5ec6f845","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027free_disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027current_workload\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BL00%3D","line":45,"updated":"2013-11-29 14:46:24.000000000","message":"What is the content of this? Just an identifier string?","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"6a2b81be2dfa046ee46dd812c29f6723366b363b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \u0027free_disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":43,"context_line":"        \u0027current_workload\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":44,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":45,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9kPY%3D","line":45,"in_reply_to":"AAAATn%2F%2BL00%3D","updated":"2013-12-10 06:41:53.000000000","message":"a json blob to specify CPU information, for instance,\n{ \"vendor\": \"intel\",\n  \"model\": \"Nehalem\",\n  \"arch\": \"x86_64\",\n  \"features\": [\"rdtscp\", \"xtpr\", \"tm2\", .....]\n  ....\n}","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6c339348e31c415581f6bd94ffb696b5ec6f845","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BL0w%3D","line":48,"updated":"2013-11-29 14:46:24.000000000","message":"This is named as if it is a list. Is it?","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"6a2b81be2dfa046ee46dd812c29f6723366b363b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":46,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9kO0%3D","line":48,"in_reply_to":"AAAATn%2F%2BL0w%3D","updated":"2013-12-10 06:41:53.000000000","message":"a text blob.\ne.g.\n[[\"i686\", \"qemu\", \"hvm\"], [\"i686\", \"kvm\", \"hvm\"], [\"x86_64\", \"qemu\", \"hvm\"], [\"x86_64\", \"kvm\", \"hvm\"]]\n\nIt depends on how you interpret it. a string, a list or a list of list, and how the object callers use it.","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"13987770a8d1d6e3ccf046d35527862e0750e1fe","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BNMU%3D","line":50,"updated":"2013-11-29 06:30:21.000000000","message":"this is a dict/list of dicts - it should not be declared as a string","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"6a2b81be2dfa046ee46dd812c29f6723366b363b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9kOg%3D","line":50,"in_reply_to":"AAAATn%2F%2BL0o%3D","updated":"2013-12-10 06:41:53.000000000","message":"OK.","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6c339348e31c415581f6bd94ffb696b5ec6f845","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BL0o%3D","line":50,"in_reply_to":"AAAATn%2F%2BNKA%3D","updated":"2013-11-29 14:46:24.000000000","message":"Anything with a format that is not concretely constrained becomes an issue for upgrade if it changes in a way that is incompatible with older code. I think Gary is exactly right here, this needs to be not just a JSON blob (which I assume is what you\u0027re planning to stuff in here).","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"1d1be0c704d65ada5a35be23863d3c4778a8e96d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027supported_instances\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027metrics\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027pci_stats\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":51,"context_line":"        }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BNKA%3D","line":50,"in_reply_to":"AAAATn%2F%2BNMU%3D","updated":"2013-11-29 06:50:24.000000000","message":"From Yongli He who is doing PCI stats.\n\n\"Hi, in fact, pci_stats is list of dict, and in this dict is the sting (k,v). like: [ { } { } ]\n\nand i want the pci_stats is just a sting, let PCI to determine it internal structure, if possible.\n\nif expose everything here, pci will couple tighter with obj/db, and except pci (filter) no one should access this field.\"\n\nGary, that is the implementation detail. How detail the attribute of the object should be. If the object thinks that is a string, all string parsing could be done out of the object model (that is the current approach and flexible).\nIf the object model parses the string as list of dict, PCI related code just needs to read the data. Which approach do all of you prefer?\n\nanother question, if pci_stats is list of dict, is cpu_info a dict/list of string?","commit_id":"28fb723853ffd520b3c554515e6056774e91f970"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027domain\u0027: fields.StringField(),"},{"line_number":29,"context_line":"        \u0027bus\u0027: fields.StringField(),"},{"line_number":30,"context_line":"        \u0027slot\u0027: fields.StringField(),"},{"line_number":31,"context_line":"        \u0027function\u0027: fields.StringField(),"},{"line_number":32,"context_line":"        }"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HGQ%3D","line":31,"updated":"2013-12-16 17:48:29.000000000","message":"Are these all really strings? Certainly at least bus and slot are integers, right?","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \u0027domain\u0027: fields.StringField(),"},{"line_number":29,"context_line":"        \u0027bus\u0027: fields.StringField(),"},{"line_number":30,"context_line":"        \u0027slot\u0027: fields.StringField(),"},{"line_number":31,"context_line":"        \u0027function\u0027: fields.StringField(),"},{"line_number":32,"context_line":"        }"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F%2Fuo%3D","line":31,"in_reply_to":"AAAATn%2F9HGQ%3D","updated":"2013-12-26 07:38:08.000000000","message":"Done","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"0cb060db76d668144773b8b3becaca78fe3c7a79","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return pci_addr"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PciStat(base.NovaObject):"},{"line_number":46,"context_line":"    # Version 1.0: Initial version"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F837s%3D","line":45,"updated":"2013-12-19 10:00:27.000000000","message":"Is this the best format to store this info? nova.pci.pci_stats.PciDeviceStats collects devices into pools.\n\nWould it be better to add _from_db_object methods to those classes?","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"f5d624252b1dafdefca60abd3fa1e131f2c18061","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return pci_addr"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PciStat(base.NovaObject):"},{"line_number":46,"context_line":"    # Version 1.0: Initial version"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2FvyQ%3D","line":45,"in_reply_to":"AAAAT3%2F%2F%2Ft0%3D","updated":"2014-01-02 13:44:33.000000000","message":"Hi Shane, sorry I was unclear.\n\n1. Given nova/pci/pci_stats.py already models PciStats, why do we need another pair of classes? Could your req\u0027d functionality be merged into pci_stats.py or vice versa?\n\n2. pci_stats.py states \"a PCI physical function can have up to 256 PCI virtual functions, thus the number of assignable PCI functions in a cloud can be big\". To deal with this, it collates devices with the same vendor and product IDs together. How does your code deal with this? Does phys_function contain all virtual functions or just assigned ones?\n\nI\u0027m still getting up to speed with OpenStack + haven\u0027t been involved in the PCI work before now, so apologies if these are dumb questions.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"0f2c8070b3e3254974b1463b61522bcdc6a334eb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return pci_addr"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PciStat(base.NovaObject):"},{"line_number":46,"context_line":"    # Version 1.0: Initial version"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2FtpA%3D","line":45,"in_reply_to":"AAAAT3%2F%2FvyQ%3D","updated":"2014-01-03 01:24:11.000000000","message":"Hi Alexis,\n\n1. their functions are different, they are for different purposes. nova/pci/pci_stats.py is to collect PCI information, called by scheduler to discover PCI devices to write into the db, but this pcistat is for object models to access db for live-upgrade. You can look at the object model design @ https://wiki.openstack.org/wiki/ObjectProposal for details. nova/pci/pci stuffs do the real thing for PCI - discovery, assignment, etc. Here pci_stat is only to convert data from db to objects.\n\n2.My code doesn\u0027t handle that. It is nova/pci/pci stuffs to handle it. But phys_function contains all VFs. Actually VF is grouped by vendor_id, product_id, and phys_function. For instance, you have 2 NIC cards, each NIC card can do 256 VFs.\nYou will have 2 entries in pci stats.\n {\u0027count\u0027: 256, \u0027vendor_id\u0027: \u00270001\u0027, \u0027product_id\u0027: \u00270002\u0027, \u0027phys_function\u0027: \u0027address1\u0027}\n {\u0027count\u0027: 256, \u0027vendor_id\u0027: \u00270001\u0027, \u0027product_id\u0027: \u00270003\u0027, \u0027phys_function\u0027: \u0027address2\u0027}","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":7543,"name":"Yongli He","email":"yongli.he@intel.com","username":"yongli.he"},"change_message_id":"b2584ed75a9b70b6b273e26f6a629f9c0265924c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return pci_addr"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PciStat(base.NovaObject):"},{"line_number":46,"context_line":"    # Version 1.0: Initial version"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2FtuQ%3D","line":45,"in_reply_to":"AAAAT3%2F%2FvyQ%3D","updated":"2014-01-03 00:56:46.000000000","message":"Hi, Alexis\n\n2):  the phys_function means all these devices share the same PF, this is the PF\u0027s address. \nthanks.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return pci_addr"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class PciStat(base.NovaObject):"},{"line_number":46,"context_line":"    # Version 1.0: Initial version"},{"line_number":47,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F%2Ft0%3D","line":45,"in_reply_to":"AAAATn%2F837s%3D","updated":"2013-12-26 07:38:08.000000000","message":"what do you mean by \"add _from_db_object() to those classes\"?\n\nI have _from_db_object() for each.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    fields \u003d {"},{"line_number":50,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":51,"context_line":"        \u0027vendor_id\u0027: fields.StringField(),"},{"line_number":52,"context_line":"        \u0027product_id\u0027: fields.StringField(),"},{"line_number":53,"context_line":"        \u0027phys_function\u0027: fields.ListOfObjectsField(\u0027PciDevAddr\u0027),"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HGM%3D","line":52,"updated":"2013-12-16 17:48:29.000000000","message":"Aren\u0027t vendor and product also integers?","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    fields \u003d {"},{"line_number":50,"context_line":"        \u0027count\u0027: fields.IntegerField(),"},{"line_number":51,"context_line":"        \u0027vendor_id\u0027: fields.StringField(),"},{"line_number":52,"context_line":"        \u0027product_id\u0027: fields.StringField(),"},{"line_number":53,"context_line":"        \u0027phys_function\u0027: fields.ListOfObjectsField(\u0027PciDevAddr\u0027),"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F%2Fts%3D","line":52,"in_reply_to":"AAAATn%2F9HGM%3D","updated":"2013-12-26 07:38:08.000000000","message":"Done","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        sup_inst[\u0027vm_mode\u0027] \u003d db_sup_inst[2]"},{"line_number":94,"context_line":"        sup_inst._context \u003d context"},{"line_number":95,"context_line":"        sup_inst.obj_reset_changes()"},{"line_number":96,"context_line":"        return sup_inst"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class ComputeNode(base.NovaPersistentObject, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HF0%3D","line":96,"updated":"2013-12-16 17:48:29.000000000","message":"All of these pci-related things should be stored elsewhere, IMHO. Maybe in pci_device.py or in their own files. Putting them here seems very odd.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        sup_inst[\u0027vm_mode\u0027] \u003d db_sup_inst[2]"},{"line_number":94,"context_line":"        sup_inst._context \u003d context"},{"line_number":95,"context_line":"        sup_inst.obj_reset_changes()"},{"line_number":96,"context_line":"        return sup_inst"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class ComputeNode(base.NovaPersistentObject, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F%2Ftg%3D","line":96,"in_reply_to":"AAAATn%2F9HF0%3D","updated":"2013-12-26 07:38:08.000000000","message":"Since here is the only place to use that, ok, I agree to put them into the other files.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                # supported_instances returns"},{"line_number":136,"context_line":"                # [[arch, hypervisor_type, vm_mode], ...] or null"},{"line_number":137,"context_line":"                sup_insts \u003d []"},{"line_number":138,"context_line":"                db_sup_insts \u003d db_compute.get(\u0027supported_instances\u0027)"},{"line_number":139,"context_line":"                db_sup_insts \u003d (jsonutils.loads(db_sup_insts)"},{"line_number":140,"context_line":"                    if db_sup_insts else None)"},{"line_number":141,"context_line":"                if db_sup_insts and isinstance(db_sup_insts, list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HFw%3D","line":138,"updated":"2013-12-16 17:48:29.000000000","message":"Is supported_instances always joined?","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                # supported_instances returns"},{"line_number":136,"context_line":"                # [[arch, hypervisor_type, vm_mode], ...] or null"},{"line_number":137,"context_line":"                sup_insts \u003d []"},{"line_number":138,"context_line":"                db_sup_insts \u003d db_compute.get(\u0027supported_instances\u0027)"},{"line_number":139,"context_line":"                db_sup_insts \u003d (jsonutils.loads(db_sup_insts)"},{"line_number":140,"context_line":"                    if db_sup_insts else None)"},{"line_number":141,"context_line":"                if db_sup_insts and isinstance(db_sup_insts, list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F%2BJw%3D","line":138,"in_reply_to":"AAAATn%2F9HFw%3D","updated":"2013-12-26 07:38:08.000000000","message":"OK, I am going to use expected_attrs for lazy load.\n\nfor supported_instances, it is actually a column in compute node table so there is no join between two tables.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                compute[key] \u003d sup_insts if sup_insts else None"},{"line_number":148,"context_line":"            elif key \u003d\u003d \u0027pci_stats\u0027:"},{"line_number":149,"context_line":"                pci_stats \u003d []"},{"line_number":150,"context_line":"                db_pci_stats \u003d db_compute.get(\u0027pci_stats\u0027)"},{"line_number":151,"context_line":"                db_pci_stats \u003d (jsonutils.loads(db_pci_stats)"},{"line_number":152,"context_line":"                    if db_pci_stats else None)"},{"line_number":153,"context_line":"                if db_pci_stats and isinstance(db_pci_stats, list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HFs%3D","line":150,"updated":"2013-12-16 17:48:29.000000000","message":"Same question here.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                compute[key] \u003d sup_insts if sup_insts else None"},{"line_number":148,"context_line":"            elif key \u003d\u003d \u0027pci_stats\u0027:"},{"line_number":149,"context_line":"                pci_stats \u003d []"},{"line_number":150,"context_line":"                db_pci_stats \u003d db_compute.get(\u0027pci_stats\u0027)"},{"line_number":151,"context_line":"                db_pci_stats \u003d (jsonutils.loads(db_pci_stats)"},{"line_number":152,"context_line":"                    if db_pci_stats else None)"},{"line_number":153,"context_line":"                if db_pci_stats and isinstance(db_pci_stats, list):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F%2BJs%3D","line":150,"in_reply_to":"AAAATn%2F9HFs%3D","updated":"2013-12-26 07:38:08.000000000","message":"OK, will do the same","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @base.remotable"},{"line_number":177,"context_line":"    def create(self, context):"},{"line_number":178,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":179,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"},{"line_number":180,"context_line":"        self._from_db_object(context, self, db_compute)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HFM%3D","line":178,"updated":"2013-12-16 17:48:29.000000000","message":"None of the PCI stuff above will be properly created during this create operation, right? So, how will that information make it into the database? If not through this, then perhaps create() should raise an exception if those attributes are set?","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @base.remotable"},{"line_number":177,"context_line":"    def create(self, context):"},{"line_number":178,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":179,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"},{"line_number":180,"context_line":"        self._from_db_object(context, self, db_compute)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F9rg%3D","line":178,"in_reply_to":"AAAATn%2F9HFM%3D","updated":"2013-12-26 07:38:08.000000000","message":"reasonable.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0bc7acf9b0cc41097747c12af8354221f45e2ce3","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    def save(self, context, prune_stats\u003dFalse):"},{"line_number":184,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":185,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":186,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":187,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":188,"context_line":"        self._from_db_object(context, self, db_compute)"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9HFE%3D","line":186,"updated":"2013-12-16 17:48:29.000000000","message":"Same concern about save.","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"ac3ee00b9309438e1c61f38041d3953f319dcb1b","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    def save(self, context, prune_stats\u003dFalse):"},{"line_number":184,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":185,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":186,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":187,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":188,"context_line":"        self._from_db_object(context, self, db_compute)"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAT3%2F%2F9rc%3D","line":186,"in_reply_to":"AAAATn%2F9HFE%3D","updated":"2013-12-26 07:38:08.000000000","message":"Done","commit_id":"7a28afb1d89fd8ff1b720f74197a49c351c71df5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        \u0027free_disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027current_workload\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":81,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":82,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":83,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":84,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027supported_instances\u0027: fields.ObjectField(\u0027SupportedInstanceList\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FrqQ%3D","line":82,"updated":"2014-01-03 15:47:42.000000000","message":"You can\u0027t make this change without breaking compatibility with older objects that have null values here. If an older compute node passes this object to a newer (on this patchset) conductor, it will fail to deserialize a None cpu_info.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"8e52db8f9020aa88cb66db0c39fff6baf0cea836","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        \u0027free_disk_gb\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":80,"context_line":"        \u0027current_workload\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":81,"context_line":"        \u0027running_vms\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":82,"context_line":"        \u0027cpu_info\u0027: fields.StringField(),"},{"line_number":83,"context_line":"        \u0027disk_available_least\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":84,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027supported_instances\u0027: fields.ObjectField(\u0027SupportedInstanceList\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FUPY%3D","line":82,"in_reply_to":"AAAAT3%2F%2FrqQ%3D","updated":"2014-01-17 06:08:28.000000000","message":"OK, don\u0027t change that in this patch. Let me think about it later.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \u0027host_ip\u0027: fields.IPAddressField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027supported_instances\u0027: fields.ObjectField(\u0027SupportedInstanceList\u0027,"},{"line_number":86,"context_line":"                                                  nullable\u003dTrue),"},{"line_number":87,"context_line":"        \u0027metrics\u0027: fields.ObjectField(\u0027MetricList\u0027, nullable\u003dTrue),"},{"line_number":88,"context_line":"        \u0027pci_stats\u0027: fields.ObjectField(\u0027PciStatList\u0027, nullable\u003dTrue),"},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FrnY%3D","line":87,"updated":"2014-01-03 15:47:42.000000000","message":"Same here, there needs to be some serious accounting and testing for this change.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        return compute"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    @base.remotable_classmethod"},{"line_number":133,"context_line":"    def get_by_id(cls, context, compute_id, expected_attrs\u003dNone):"},{"line_number":134,"context_line":"        db_compute \u003d db.compute_node_get(context, compute_id)"},{"line_number":135,"context_line":"        return cls._from_db_object(context, cls(), db_compute,"},{"line_number":136,"context_line":"                                   expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2Fro0%3D","line":133,"updated":"2014-01-03 15:47:42.000000000","message":"These changes need to be mentioned in the version history as well.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"8e52db8f9020aa88cb66db0c39fff6baf0cea836","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        return compute"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    @base.remotable_classmethod"},{"line_number":133,"context_line":"    def get_by_id(cls, context, compute_id, expected_attrs\u003dNone):"},{"line_number":134,"context_line":"        db_compute \u003d db.compute_node_get(context, compute_id)"},{"line_number":135,"context_line":"        return cls._from_db_object(context, cls(), db_compute,"},{"line_number":136,"context_line":"                                   expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FT7U%3D","line":133,"in_reply_to":"AAAAT3%2F%2Fro0%3D","updated":"2014-01-17 06:08:28.000000000","message":"Done","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":148,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":149,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":150,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FroY%3D","line":150,"updated":"2014-01-03 15:47:42.000000000","message":"The above changes aren\u0027t really related to this patch, right? They\u0027re reasonable, but lets keep them separate please.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"8e52db8f9020aa88cb66db0c39fff6baf0cea836","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":148,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":149,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":150,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FT6s%3D","line":150,"in_reply_to":"AAAAT3%2F%2FroY%3D","updated":"2014-01-17 06:08:28.000000000","message":"OK, that is in https://review.openstack.org/#/c/65030/.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"1b27901b746ae3879d4fe55c8bfd920d6625453d","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2F7Gc%3D","line":154,"updated":"2014-01-06 18:32:30.000000000","message":"Hi Shane, please would you explain why this is an error? We want these saved into the DB, right?","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"6c9f86a4d5667342692382cd33a090a01775f956","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FuP8%3D","line":154,"in_reply_to":"AAAAUH%2F%2F7Gc%3D","updated":"2014-01-09 07:22:49.000000000","message":"First, if pci_stats and metrics are in create(), that is wrong because when a compute node is created, pci and metrics might be blank.\n\nActually their values are not set as the compute node is created but as the compute node is updated by resource tracker later.\n\nFor save() below, originally I was thinking to create two new methods to save them specifically, not together with other fields in ComputeNode, because their structures are a little bit complex as json. What do you think, Alexis? Do you prefer to save them in save()? I am open.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"80cb274740d9f46ddbcc07328ef4be33a2c5a212","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FgJg%3D","line":154,"in_reply_to":"AAAAUH%2F%2FqCk%3D","updated":"2014-01-13 09:17:37.000000000","message":"Exactly, excellent :)","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"9c3819cdfbbf978f7e16b46ce21480f3003e2da3","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Fpz4%3D","line":154,"in_reply_to":"AAAAUH%2F%2Frxc%3D","updated":"2014-01-10 02:39:30.000000000","message":"Good point, Paul. Yes, if any metric is changed, compute_node object can\u0027t detect it by obj_get_changes().\n\nFor how to handle the case, I feel to detect what has been changed in setter() is more generic, as you said. However, in save() in instance.py (line 450), you can see what others have done: if it is NovaObject, save always, otherwise, save those changed.\n\nI will send Dan an email and copy you and Alex to discuss which one is better. For me, I prefer the generic one.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"ec9470ee61bed19d96c163f3cb6ceafba727328a","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Frxc%3D","line":154,"in_reply_to":"AAAAUH%2F%2FuBM%3D","updated":"2014-01-09 16:47:29.000000000","message":"Hi Shane, \n\nif you modify the contents of the lists the compute_node object would not know that they have been updated. I assume you only ever expect the whole list to be re-created (i.e. the list is immutable). Is that right? \n\nIf so, I would do two things: 1) do the saving in the save method, same as usual, 2) to avoid necessary updates, check if the value has actually changed before setting a property. There could be a case for doing that more generically in the setter, but right now I wouldn\u0027t bother.\n\nIf you expect the contents of the list to be changed without setting the property in the compute_node object, you would need a way to inform the compute_node object that there is something has changed. But that could be done by setting the property. \n\nSo personally I would make the save operation handle all saving.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"9c3819cdfbbf978f7e16b46ce21480f3003e2da3","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FqCk%3D","line":154,"in_reply_to":"AAAAUH%2F%2FuBM%3D","updated":"2014-01-10 02:39:30.000000000","message":"OK, my understanding for your idea is to create new methods to handle pci_stats, metrics, and other big blobs, and save() and create() (if necessary later) to call them to save those blobs, right? If so, I agree;-)","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"f38b2abcd025013c0ba3ebd22d50a0adf3b41def","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":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":154,"context_line":"            raise exception.ObjectActionError("},{"line_number":155,"context_line":"                action\u003d\u0027create\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        db_compute \u003d db.compute_node_create(context, updates)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FuBM%3D","line":154,"in_reply_to":"AAAAUH%2F%2FuP8%3D","updated":"2014-01-09 08:35:48.000000000","message":"Hi Shane, thanks for your response. In light of that, the exception in #create makes more sense. If the code changes such that they are set at create-time, the author of that change can decide whether to persist them or not then.\n\nWhile encapsulating the persist logic for pci_stats, metrics (+ supported_instances?) in separate methods would be smart, I don\u0027t see any advantage in widening the interface beyond #save. IE #save should call the new methods. This would make it easy for #create to also call them later if they become available at create-time.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":7461,"name":"Paul Murray","email":"pmurray@hpe.com","username":"ptm"},"change_message_id":"ec9470ee61bed19d96c163f3cb6ceafba727328a","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @base.remotable"},{"line_number":162,"context_line":"    def save(self, context, prune_stats\u003dFalse):"},{"line_number":163,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":164,"context_line":"        updates.pop(\u0027id\u0027, None)"},{"line_number":165,"context_line":"        expected_attrs \u003d [attr for attr in OPTIONAL_FIELDS"},{"line_number":166,"context_line":"                          if attr in updates]"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Frw4%3D","line":163,"updated":"2014-01-09 16:47:29.000000000","message":"see comment above","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                          if attr in updates]"},{"line_number":167,"context_line":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":168,"context_line":"            raise exception.ObjectActionError("},{"line_number":169,"context_line":"                action\u003d\u0027save\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":170,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":171,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":172,"context_line":"        self._from_db_object(context, self, db_compute,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FroE%3D","line":169,"updated":"2014-01-03 15:47:42.000000000","message":"What about supported_instances?","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"8e52db8f9020aa88cb66db0c39fff6baf0cea836","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                          if attr in updates]"},{"line_number":167,"context_line":"        if \u0027pci_stats\u0027 in updates or \u0027metrics\u0027 in updates:"},{"line_number":168,"context_line":"            raise exception.ObjectActionError("},{"line_number":169,"context_line":"                action\u003d\u0027save\u0027, reason\u003d\u0027PCI stats or metrics were set\u0027)"},{"line_number":170,"context_line":"        db_compute \u003d db.compute_node_update(context, self.id, updates,"},{"line_number":171,"context_line":"                                            prune_stats\u003dprune_stats)"},{"line_number":172,"context_line":"        self._from_db_object(context, self, db_compute,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FIbg%3D","line":169,"in_reply_to":"AAAAT3%2F%2FroE%3D","updated":"2014-01-17 06:08:28.000000000","message":"Actually I don\u0027t want to add checks here. In the resource tracker, when creating a compute node in db, it is possible that the values of \u0027metrics\u0027 and \u0027stats\u0027 (\u0027supported_instance\u0027 is in \u0027stats\u0027) are set in theory. Ditto for save(), agree?","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            del primitive[\u0027pci_stats\u0027]"},{"line_number":195,"context_line":"            if \u0027metrics\u0027 in primitive:"},{"line_number":196,"context_line":"                metrics \u003d base.obj_to_primitive(primitive[\u0027metrics\u0027])"},{"line_number":197,"context_line":"                primitive[\u0027metrics\u0027] \u003d jsonutils.dumps(metrics)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"class ComputeNodeList(base.ObjectListBase, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2Frns%3D","line":197,"updated":"2014-01-03 15:47:42.000000000","message":"This is good, but what if someone sends a string-based set of metrics into a newer node with object-based metrics? It won\u0027t deserialize.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"}],"nova/objects/instance.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    child_versions \u003d {"},{"line_number":91,"context_line":"        \u00271.0\u0027: \u00271.0\u0027,"},{"line_number":92,"context_line":"        # NOTE(shane-wang): SupportedInstance was at 1.0 before we added this"},{"line_number":93,"context_line":"        }"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class Instance(base.NovaPersistentObject, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FrnE%3D","line":93,"updated":"2014-01-03 15:47:42.000000000","message":"I\u0027m not sure these really belong in instance.\n\nAlso note that you don\u0027t need the list-to-object version matching for any list that lacks query methods.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"8e52db8f9020aa88cb66db0c39fff6baf0cea836","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    child_versions \u003d {"},{"line_number":91,"context_line":"        \u00271.0\u0027: \u00271.0\u0027,"},{"line_number":92,"context_line":"        # NOTE(shane-wang): SupportedInstance was at 1.0 before we added this"},{"line_number":93,"context_line":"        }"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class Instance(base.NovaPersistentObject, base.NovaObject):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FIbQ%3D","line":93,"in_reply_to":"AAAAT3%2F%2FrnE%3D","updated":"2014-01-17 06:08:28.000000000","message":"I have to add otherwise I got\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nFAIL: nova.tests.objects.test_objects.TestObjectListBase.test_object_version_mappings\ntags: worker-1\n----------------------------------------------------------------------\nEmpty attachments:\n  pythonlogging:\u0027\u0027\n  stderr\n  stdout\n\nTraceback (most recent call last):\n  File \"nova/tests/objects/test_objects.py\", line 762, in test_object_version_mappings\n    self._test_object_list_version_mappings(obj_class)\n  File \"nova/tests/objects/test_objects.py\", line 754, in _test_object_list_version_mappings\n    list_obj_class.child_versions.values())\n  File \"/opt/stack/nova/.tox/py27/local/lib/python2.7/site-packages/testtools/testcase.py\", line 328, in assertIn\n    self.assertThat(haystack, Contains(needle))\n  File \"/opt/stack/nova/.tox/py27/local/lib/python2.7/site-packages/testtools/testcase.py\", line 412, in assertThat\n    raise MismatchError(matchee, matcher, mismatch, verbose)\nMismatchError: \u00271.0\u0027 not in []\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"}],"nova/objects/pci_device.py":[{"author":{"_account_id":7543,"name":"Yongli He","email":"yongli.he@intel.com","username":"yongli.he"},"change_message_id":"65828cd99a8d1e4665333e58f9607a123af12e1d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \u0027vendor_id\u0027: fields.IntegerField(),"},{"line_number":62,"context_line":"        \u0027product_id\u0027: fields.IntegerField(),"},{"line_number":63,"context_line":"        \u0027phys_function\u0027: fields.ListOfObjectsField(\u0027PciDevAddr\u0027),"},{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _from_db_object(context, pci_stat, db_pci_stat):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FwjI%3D","line":64,"updated":"2014-01-02 08:39:16.000000000","message":"i have some concern about this implement, the pci stat present the  group and how many device in this group to scheduler.  so:\n\n1. the  vendor_id and product_id is probably NULL\n\n2. the phys_function is also could be NULL\n\n3. which key is present here is configurable, the blueprint pci-extra-info is in reviewing now. even not be configurable, the group method will be change in icehouse3( we hope so).\n\n4.for vendor id,and product_id, it is not necessary to be a integer, cause we don\u0027t use it as integer, we don\u0027t care if it\u0027s bigger/smaller to a value, it seems meaningless.\n\n5. if it must be integer,  we should modify the autodidact module also to make it became integer at the first place.(fix me)","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"5aafac90e87266a4c74b14e3f6db4ab5a9e84216","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \u0027vendor_id\u0027: fields.IntegerField(),"},{"line_number":62,"context_line":"        \u0027product_id\u0027: fields.IntegerField(),"},{"line_number":63,"context_line":"        \u0027phys_function\u0027: fields.ListOfObjectsField(\u0027PciDevAddr\u0027),"},{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _from_db_object(context, pci_stat, db_pci_stat):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2Fs2c%3D","line":64,"in_reply_to":"AAAAT3%2F%2FwjI%3D","updated":"2014-01-03 08:16:18.000000000","message":"I agree with yongli, if change the string to interger,  should change the /pci models first . This will affect the API.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":7543,"name":"Yongli He","email":"yongli.he@intel.com","username":"yongli.he"},"change_message_id":"65828cd99a8d1e4665333e58f9607a123af12e1d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                        pci_addrs.append(obj_pci_addr)"},{"line_number":81,"context_line":"                pci_stat[key] \u003d pci_addrs"},{"line_number":82,"context_line":"            else:"},{"line_number":83,"context_line":"                pci_stat[key] \u003d db_pci_stat[key]"},{"line_number":84,"context_line":"        pci_stat._context \u003d context"},{"line_number":85,"context_line":"        pci_stat.obj_reset_changes()"},{"line_number":86,"context_line":"        return pci_stat"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2FwjA%3D","line":83,"updated":"2014-01-02 08:39:16.000000000","message":"vendor_id product might be NULL.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3445f53a9a28b38734f0d32bfc5686a601504f","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        }"},{"line_number":97,"context_line":"    child_versions \u003d {"},{"line_number":98,"context_line":"        \u00271.0\u0027: \u00271.0\u0027,"},{"line_number":99,"context_line":"        # NOTE(shane-wang): PciStat was at 1.0 before we added this"},{"line_number":100,"context_line":"        }"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAT3%2F%2Frm0%3D","line":99,"updated":"2014-01-03 15:47:42.000000000","message":"same comment here, about list-to-object version mappings.","commit_id":"68a5dfc76fa47baca1311ded2b075d1482d2c592"}]}
