)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c36e7433476d580eccfb82baeebe8a478d6a2cba","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The new InstanceDevicesMetadata will keep a list"},{"line_number":10,"context_line":"of all the devices metadata, such as NICs and disks"},{"line_number":11,"context_line":"assossiated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partially implements blueprint virt-device-role-tagging"},{"line_number":14,"context_line":"Co-authored-by: Artom Lifshitz \u003califshit@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7aa08908_1a6e9eff","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":11},"updated":"2016-06-14 19:24:59.000000000","message":"\"associated\"","commit_id":"5e0d5464818d23b4adcf7f727bba9933a1a47daf"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"75bb320f8599681a2602af425d37b93af24d127c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The new InstanceDevicesMetadata will keep a list"},{"line_number":10,"context_line":"of all the devices metadata, such as NICs and disks"},{"line_number":11,"context_line":"assossiated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partially implements blueprint virt-device-role-tagging"},{"line_number":14,"context_line":"Co-authored-by: Artom Lifshitz \u003califshit@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7aa08908_ae9d8567","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":11},"in_reply_to":"7aa08908_1a6e9eff","updated":"2016-06-14 21:59:04.000000000","message":"Done","commit_id":"5e0d5464818d23b4adcf7f727bba9933a1a47daf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7571f96241d809a1f7dbf34db994b8df417e1309","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of all the devices metadata, such as NICs and disks"},{"line_number":11,"context_line":"associated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Chaning the address fields of the DeviceBus objects"},{"line_number":14,"context_line":"to be nullable. Chaning the hash of the these objects"},{"line_number":15,"context_line":"without a version bump, as there were never used, yet."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7aa08908_2d44d019","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":7},"updated":"2016-06-15 16:03:00.000000000","message":"\"Changing\" :)","commit_id":"4c041cc89957da3d76e555a70569124d54be2b64"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"03f43b7527f78360a6a03df1a012835ed93bb8df","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of all the devices metadata, such as NICs and disks"},{"line_number":11,"context_line":"associated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Chaning the address fields of the DeviceBus objects"},{"line_number":14,"context_line":"to be nullable. Chaning the hash of the these objects"},{"line_number":15,"context_line":"without a version bump, as there were never used, yet."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7aa08908_6cfd3308","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":7},"in_reply_to":"7aa08908_2d44d019","updated":"2016-06-15 18:42:01.000000000","message":"Done","commit_id":"4c041cc89957da3d76e555a70569124d54be2b64"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7571f96241d809a1f7dbf34db994b8df417e1309","unresolved":false,"context_lines":[{"line_number":11,"context_line":"associated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Chaning the address fields of the DeviceBus objects"},{"line_number":14,"context_line":"to be nullable. Chaning the hash of the these objects"},{"line_number":15,"context_line":"without a version bump, as there were never used, yet."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements blueprint virt-device-role-tagging"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7aa08908_4d567ccf","line":14,"range":{"start_line":14,"start_character":16,"end_line":14,"end_character":23},"updated":"2016-06-15 16:03:00.000000000","message":"Also \"changing\" :)","commit_id":"4c041cc89957da3d76e555a70569124d54be2b64"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"03f43b7527f78360a6a03df1a012835ed93bb8df","unresolved":false,"context_lines":[{"line_number":11,"context_line":"associated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Chaning the address fields of the DeviceBus objects"},{"line_number":14,"context_line":"to be nullable. Chaning the hash of the these objects"},{"line_number":15,"context_line":"without a version bump, as there were never used, yet."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements blueprint virt-device-role-tagging"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7aa08908_4c02f70a","line":14,"range":{"start_line":14,"start_character":16,"end_line":14,"end_character":23},"in_reply_to":"7aa08908_4d567ccf","updated":"2016-06-15 18:42:01.000000000","message":"Done","commit_id":"4c041cc89957da3d76e555a70569124d54be2b64"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"87a5855091ae012a441c57b680145908417a9179","unresolved":false,"context_lines":[{"line_number":11,"context_line":"associated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Changing the address fields of the DeviceBus objects"},{"line_number":14,"context_line":"to be nullable. Changing the hash of the these objects"},{"line_number":15,"context_line":"without a version bump, as there were never used, yet."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements blueprint virt-device-role-tagging"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"7aa08908_0c8f36cd","line":14,"range":{"start_line":14,"start_character":15,"end_line":14,"end_character":16},"updated":"2016-06-16 08:48:32.000000000","message":"This is just saying what you\u0027ve done - which is pretty obvious from the code. The commit message should be saying *why* you have done this. If this is needed, then I think it should be a separate change with justification - I don\u0027t see a reason to do it in the same commit that you introduce InstanceDevicesMetadata","commit_id":"329c7c278f42b1c8f0b966997d6b4c1e011507ac"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"5f1724b15b228c0b887ea9c70e59afcbb3b974ff","unresolved":false,"context_lines":[{"line_number":11,"context_line":"associated to an instance."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Changing the address fields of the DeviceBus objects"},{"line_number":14,"context_line":"to be nullable. Changing the hash of the these objects"},{"line_number":15,"context_line":"without a version bump, as there were never used, yet."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements blueprint virt-device-role-tagging"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"5a9d85d2_0bba796e","line":14,"range":{"start_line":14,"start_character":15,"end_line":14,"end_character":16},"in_reply_to":"7aa08908_0c8f36cd","updated":"2016-06-21 03:32:36.000000000","message":"Done","commit_id":"329c7c278f42b1c8f0b966997d6b4c1e011507ac"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6eadeee7ba422832f9740576a2082bbb2813b566","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The DeviceMetadataList will keep a list"},{"line_number":10,"context_line":"of all the devices metadata, such as NICs and disks"},{"line_number":11,"context_line":"associated to an instance. Eventually, it will be"},{"line_number":12,"context_line":"stored in the instance_extra table."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially implements blueprint virt-device-role-tagging"},{"line_number":15,"context_line":"Co-authored-by: Artom Lifshitz \u003califshit@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3aaa91ec_a3334961","line":12,"updated":"2016-06-23 16:15:28.000000000","message":"Like I said on PS5, please put a comment in here about why we\u0027re not bumping the version on the object (because they\u0027ve never been sent over RPC or stored in the DB yet).","commit_id":"1c9f3d76a81f79d78087c1bfa39ccf7762e496ea"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"c8dba3747325be8a5e7e39dd12d6185588cdf72c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The DeviceMetadataList will keep a list"},{"line_number":10,"context_line":"of all the devices metadata, such as NICs and disks"},{"line_number":11,"context_line":"associated to an instance. Eventually, it will be"},{"line_number":12,"context_line":"stored in the instance_extra table."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially implements blueprint virt-device-role-tagging"},{"line_number":15,"context_line":"Co-authored-by: Artom Lifshitz \u003califshit@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3aaa91ec_9c6caad1","line":12,"in_reply_to":"3aaa91ec_a3334961","updated":"2016-06-23 18:24:48.000000000","message":"Done","commit_id":"1c9f3d76a81f79d78087c1bfa39ccf7762e496ea"}],"nova/objects/virt_device_metadata.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"46dbc6dc1e392a376cf4a68e17059e44da47f373","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":91,"context_line":"class InstanceDevicesMetadata(base.NovaObject, base.NovaObjectDictCompat):"},{"line_number":92,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":93,"context_line":"    fields \u003d {"},{"line_number":94,"context_line":"        \u0027instance_uuid\u0027: obj_fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_a3f874c4","line":91,"updated":"2016-05-19 23:12:25.000000000","message":"Not sure this name needs to change, just FYI. Also, surprised to see the  dictcompat on such a new object... :/","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"2fe55284874b6a7a8494c620e0bb8a5832b88572","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":91,"context_line":"class InstanceDevicesMetadata(base.NovaObject, base.NovaObjectDictCompat):"},{"line_number":92,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":93,"context_line":"    fields \u003d {"},{"line_number":94,"context_line":"        \u0027instance_uuid\u0027: obj_fields.UUIDField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_6f2e58a6","line":91,"in_reply_to":"bab6814e_a3f874c4","updated":"2016-05-20 11:48:51.000000000","message":"Thanks. I\u0027ll take it away. This was just an attempt to build a structure of how things will look like..\nFollowed the familiar InstanceNumaTopology, hence the mess.","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"46dbc6dc1e392a376cf4a68e17059e44da47f373","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":93,"context_line":"    fields \u003d {"},{"line_number":94,"context_line":"        \u0027instance_uuid\u0027: obj_fields.UUIDField(),"},{"line_number":95,"context_line":"        \u0027devices_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":96,"context_line":"                                             subclasses\u003dTrue),"},{"line_number":97,"context_line":"    }"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_432ee843","line":95,"updated":"2016-05-19 23:12:25.000000000","message":"I assume we\u0027ve never used this object before and thus no version bump, yes?","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"2fe55284874b6a7a8494c620e0bb8a5832b88572","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":93,"context_line":"    fields \u003d {"},{"line_number":94,"context_line":"        \u0027instance_uuid\u0027: obj_fields.UUIDField(),"},{"line_number":95,"context_line":"        \u0027devices_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":96,"context_line":"                                             subclasses\u003dTrue),"},{"line_number":97,"context_line":"    }"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_6f05b812","line":95,"in_reply_to":"bab6814e_432ee843","updated":"2016-05-20 11:48:51.000000000","message":"Yes, new object, never has been used.","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"46dbc6dc1e392a376cf4a68e17059e44da47f373","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.obj_reset_changes()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @base.remotable_classmethod"},{"line_number":107,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"},{"line_number":108,"context_line":"        db_extra \u003d db.instance_extra_get_by_instance_uuid("},{"line_number":109,"context_line":"                context, instance_uuid, columns\u003d[\u0027devices_metadata\u0027])"},{"line_number":110,"context_line":"        if not db_extra:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_63e04cfb","line":107,"updated":"2016-05-19 23:12:25.000000000","message":"Ideally we\u0027d never need to query for this directly, since it probably means we had the instance object and then loaded this later, when when we could have queried them together. But, that\u0027s okay.","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"2fe55284874b6a7a8494c620e0bb8a5832b88572","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.obj_reset_changes()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @base.remotable_classmethod"},{"line_number":107,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"},{"line_number":108,"context_line":"        db_extra \u003d db.instance_extra_get_by_instance_uuid("},{"line_number":109,"context_line":"                context, instance_uuid, columns\u003d[\u0027devices_metadata\u0027])"},{"line_number":110,"context_line":"        if not db_extra:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_b22ee340","line":107,"in_reply_to":"bab6814e_63e04cfb","updated":"2016-05-20 11:48:51.000000000","message":"The idea was to avoid loading this object into the instance, so we won\u0027t carry it everywhere, but just query it once from the metadata object.. from the _get_devices_metadata in the last patch[1]. (no idea why it\u0027s not in that code, I remember writing it.. ) What do you think?\n\n[1] https://review.openstack.org/#/c/304511/24/nova/api/metadata/base.py","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d8796d8fd577ddb7462f0261b763826bf2d95cb9","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.obj_reset_changes()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @base.remotable_classmethod"},{"line_number":107,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"},{"line_number":108,"context_line":"        db_extra \u003d db.instance_extra_get_by_instance_uuid("},{"line_number":109,"context_line":"                context, instance_uuid, columns\u003d[\u0027devices_metadata\u0027])"},{"line_number":110,"context_line":"        if not db_extra:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_3f011739","line":107,"in_reply_to":"bab6814e_b22ee340","updated":"2016-05-20 13:52:26.000000000","message":"No, we should not do that. If we make it joined loaded from the instance then we make *one* call from metadata instead of *two*. We have demonstrated already that more calls out of metadata hurt kittens :)","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"46dbc6dc1e392a376cf4a68e17059e44da47f373","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        db_extra \u003d db.instance_extra_get_by_instance_uuid("},{"line_number":109,"context_line":"                context, instance_uuid, columns\u003d[\u0027devices_metadata\u0027])"},{"line_number":110,"context_line":"        if not db_extra:"},{"line_number":111,"context_line":"            return None"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        return cls.obj_from_db_obj(instance_uuid, db_extra[\u0027devices_metadata\u0027])"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_6385ec05","line":111,"updated":"2016-05-19 23:12:25.000000000","message":"What about if this is an old instance and the field is None? L113 will explode right?","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"46dbc6dc1e392a376cf4a68e17059e44da47f373","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return jsonutils.dumps(self.obj_to_primitive())"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @classmethod"},{"line_number":119,"context_line":"    def obj_from_primitive(cls, primitive, context\u003dNone):"},{"line_number":120,"context_line":"        obj_topology \u003d super(InstanceDevicesMetadata, cls).obj_from_primitive("},{"line_number":121,"context_line":"            primitive, context\u003dNone)"},{"line_number":122,"context_line":"        return obj_topology"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_23a8048d","line":119,"updated":"2016-05-19 23:12:25.000000000","message":"Why? You should not be overriding this method unless you have a really good reason and I don\u0027t see it here.\n\nSince topology is in here, I wonder if this is copy/paste material? :)","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"46dbc6dc1e392a376cf4a68e17059e44da47f373","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        return obj_topology"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @classmethod"},{"line_number":125,"context_line":"    def obj_from_db_obj(cls, instance_uuid, db_obj):"},{"line_number":126,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":127,"context_line":"        obj_topology \u003d cls.obj_from_primitive(primitive)"},{"line_number":128,"context_line":"        return obj_topology"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_e371dc45","line":125,"updated":"2016-05-19 23:12:25.000000000","message":"Since this is used in one place and we never want people using it externally, I would just fold this in above.","commit_id":"db7831b25d8bd4d14df0d070f1343de479ee1cf6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c36e7433476d580eccfb82baeebe8a478d6a2cba","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        values \u003d {\u0027devices_metadata\u0027: self._to_json()}"},{"line_number":103,"context_line":"        db.instance_extra_update_by_uuid(self._context, self.instance_uuid,"},{"line_number":104,"context_line":"                                         values)"},{"line_number":105,"context_line":"        self.obj_reset_changes()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @classmethod"},{"line_number":108,"context_line":"    def obj_from_db(cls, context, db_requests):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_f551230f","line":105,"updated":"2016-06-14 19:24:59.000000000","message":"This should probably go away now that Hans made the instance object do all the extra updates at once.","commit_id":"5e0d5464818d23b4adcf7f727bba9933a1a47daf"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"75bb320f8599681a2602af425d37b93af24d127c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        values \u003d {\u0027devices_metadata\u0027: self._to_json()}"},{"line_number":103,"context_line":"        db.instance_extra_update_by_uuid(self._context, self.instance_uuid,"},{"line_number":104,"context_line":"                                         values)"},{"line_number":105,"context_line":"        self.obj_reset_changes()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @classmethod"},{"line_number":108,"context_line":"    def obj_from_db(cls, context, db_requests):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_eb7adfef","line":105,"in_reply_to":"7aa08908_f551230f","updated":"2016-06-14 21:59:04.000000000","message":"Done","commit_id":"5e0d5464818d23b4adcf7f727bba9933a1a47daf"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"87a5855091ae012a441c57b680145908417a9179","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.objects import fields"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":23,"context_line":"class DeviceBus(base.NovaObject):"},{"line_number":24,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_ec758acc","line":22,"updated":"2016-06-16 08:48:32.000000000","message":"What\u0027s the reason for this","commit_id":"329c7c278f42b1c8f0b966997d6b4c1e011507ac"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"5f1724b15b228c0b887ea9c70e59afcbb3b974ff","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.objects import fields"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":23,"context_line":"class DeviceBus(base.NovaObject):"},{"line_number":24,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a9d85d2_4b85a1ab","line":22,"in_reply_to":"7aa08908_ec758acc","updated":"2016-06-21 03:32:36.000000000","message":"If this object is not registered, all instance remote tests are failing, as InstanceDevicesMetadata will become a field in the Instance object.\nhttps://review.openstack.org/#/c/327920","commit_id":"329c7c278f42b1c8f0b966997d6b4c1e011507ac"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"87a5855091ae012a441c57b680145908417a9179","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    fields \u003d {"},{"line_number":41,"context_line":"        \u0027address\u0027: fields.USBAddressField(nullable\u003dTrue),"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_6c619a11","line":41,"updated":"2016-06-16 08:48:32.000000000","message":"Why are you doing this ?","commit_id":"329c7c278f42b1c8f0b966997d6b4c1e011507ac"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"5f1724b15b228c0b887ea9c70e59afcbb3b974ff","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    fields \u003d {"},{"line_number":41,"context_line":"        \u0027address\u0027: fields.USBAddressField(nullable\u003dTrue),"},{"line_number":42,"context_line":"    }"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a9d85d2_2b8495d2","line":41,"in_reply_to":"7aa08908_6c619a11","updated":"2016-06-21 03:32:36.000000000","message":"This has been done due to an earlier confusion, where I miss understood the idea nullable fields. Will remove that.","commit_id":"329c7c278f42b1c8f0b966997d6b4c1e011507ac"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d44aa7b9fc94d4ad72d975d98cc8aa6a2473688c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":97,"context_line":"        \u0027devices_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":98,"context_line":"                                             subclasses\u003dTrue),"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_825fa30d","line":97,"updated":"2016-06-21 19:42:24.000000000","message":"I see zero reason to make this change to the field structure or class name of this class. We don\u0027t need an \"instance_uuid\" field in the object. It only ever is looked up via instance UUID and JSON-serialized into the instance_extra table, which has of course as a primary key the instance\u0027s UUID.","commit_id":"8313242d17c77e88302681d33f23947d7ee405c0"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"1723183fc8490e0a233c6b4a86d4dc77d6eafddf","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027instance_uuid\u0027: fields.UUIDField(),"},{"line_number":97,"context_line":"        \u0027devices_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":98,"context_line":"                                             subclasses\u003dTrue),"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_d4273e10","line":97,"in_reply_to":"3aaa91ec_825fa30d","updated":"2016-06-23 12:30:42.000000000","message":"Done","commit_id":"8313242d17c77e88302681d33f23947d7ee405c0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d44aa7b9fc94d4ad72d975d98cc8aa6a2473688c","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return device_metadata"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _to_json(self):"},{"line_number":119,"context_line":"        return jsonutils.dumps(self.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_e29ae7c4","line":119,"updated":"2016-06-21 19:42:24.000000000","message":"Why are we serializing the primitive output instead of just serializing the DeviceMetadataList object itself (via the o.vo serialization framework)?","commit_id":"8313242d17c77e88302681d33f23947d7ee405c0"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"1723183fc8490e0a233c6b4a86d4dc77d6eafddf","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return device_metadata"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _to_json(self):"},{"line_number":119,"context_line":"        return jsonutils.dumps(self.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_34cb2220","line":119,"in_reply_to":"3aaa91ec_e29ae7c4","updated":"2016-06-23 12:30:42.000000000","message":"Dan Smith has responded to this in the following patch:\nhttps://review.openstack.org/#/c/327920/9/nova/objects/instance.py@474","commit_id":"8313242d17c77e88302681d33f23947d7ee405c0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6eadeee7ba422832f9740576a2082bbb2813b566","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027device_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":97,"context_line":"                                             subclasses\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"3aaa91ec_6384c15d","line":97,"range":{"start_line":97,"start_character":45,"end_line":97,"end_character":62},"updated":"2016-06-23 16:15:28.000000000","message":"This is now misaligned.","commit_id":"1c9f3d76a81f79d78087c1bfa39ccf7762e496ea"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"c8dba3747325be8a5e7e39dd12d6185588cdf72c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027device_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":97,"context_line":"                                             subclasses\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"3aaa91ec_4819dcd6","line":97,"range":{"start_line":97,"start_character":45,"end_line":97,"end_character":62},"in_reply_to":"3aaa91ec_6384c15d","updated":"2016-06-23 18:24:48.000000000","message":"Done","commit_id":"1c9f3d76a81f79d78087c1bfa39ccf7762e496ea"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bbaa1cf498cc8d3bcf92cfce779184dcf9436712","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    fields \u003d {"},{"line_number":68,"context_line":"        \u0027bus\u0027: fields.ObjectField(\"DeviceBus\", subclasses\u003dTrue),"},{"line_number":69,"context_line":"        \u0027tags\u0027: fields.ListOfStringsField(),"},{"line_number":70,"context_line":"    }"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_91600ca7","line":70,"updated":"2016-06-23 19:00:28.000000000","message":"This class should have a _from_db_obj() staticmethod so that DeviceMetadataList can call base.obj_make_list(). See an example of _from_db_obj() here:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/block_device.py#L95","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bbaa1cf498cc8d3bcf92cfce779184dcf9436712","unresolved":false,"context_lines":[{"line_number":93,"context_line":"class DeviceMetadataList(base.NovaObject):"},{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027device_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":97,"context_line":"                                                     subclasses\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_7165a0b3","line":96,"updated":"2016-06-23 19:00:28.000000000","message":"I still don\u0027t see a need to change the name of this field. All \"XXXList\" nova objects (other than InstancePCIRequests, but that\u0027s an abherration) uses the name \"objects\" for the internal objects field. I see no reason to deviate from that practice here.","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5a5465d71413ab707238f8d746e19f671e8f630c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"class DeviceMetadataList(base.NovaObject):"},{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027device_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":97,"context_line":"                                                     subclasses\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_c355a6fa","line":96,"updated":"2016-06-23 20:56:31.000000000","message":"OK, dokey... :) Dan and I just got done with a hangout where he explained the thinking here a bit more. Sorry for being a pain in everyone\u0027s ass about this!\n\nBasically, I am +2 on this patch if you can make the following changes:\n\n1) Rename this class to InstanceDeviceMetadata (yes, I know that may have been what it was originally!).\n\n2) Change the name of the \"device_metadata\" field to \"devices\"\n\nAfter those two changes, I\u0027ll +W this puppy.","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be56da3450168998e5691d3b067694ad71e6c172","unresolved":false,"context_lines":[{"line_number":93,"context_line":"class DeviceMetadataList(base.NovaObject):"},{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027device_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":97,"context_line":"                                                     subclasses\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_11b37c99","line":96,"in_reply_to":"3aaa91ec_7165a0b3","updated":"2016-06-23 19:20:22.000000000","message":"Right, but this isn\u0027t an ObjListBase object anymore.\n\nThis is a whole container for this metadata stuff, which they are serializing into the database as a unit (see the comment below).\n\nThis is \"the metadata for an instance\" and could have other fields on it that aren\u0027t lists of things, like say a platform identifier of \u0027ppc64\u0027 or something later. Maybe that means it shouldn\u0027t end in -List to reduce confusion, which makes sense.\n\nThat it was a -List object before with an objects field before is a sign that that bit was merged too early, i.e. before we had any idea how it was going to be used.","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"b0b89c60b48ecd80163017a97e99798201fcd126","unresolved":false,"context_lines":[{"line_number":93,"context_line":"class DeviceMetadataList(base.NovaObject):"},{"line_number":94,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":95,"context_line":"    fields \u003d {"},{"line_number":96,"context_line":"        \u0027device_metadata\u0027: fields.ListOfObjectsField(\u0027DeviceMetadata\u0027,"},{"line_number":97,"context_line":"                                                     subclasses\u003dTrue),"},{"line_number":98,"context_line":"    }"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_63daf24d","line":96,"in_reply_to":"3aaa91ec_c355a6fa","updated":"2016-06-23 23:37:44.000000000","message":"Done","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7d080ea2bc64e68214f8e56647c1189338d8e431","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    def obj_from_db(cls, context, db_requests):"},{"line_number":102,"context_line":"        primitive \u003d jsonutils.loads(db_requests)"},{"line_number":103,"context_line":"        device_metadata \u003d cls.obj_from_primitive(primitive)"},{"line_number":104,"context_line":"        return device_metadata"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @base.remotable_classmethod"},{"line_number":107,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_711920d7","line":104,"updated":"2016-06-23 19:07:20.000000000","message":"Update: I see in the next patch where you are using this method, OK. You will still want to change this method, however, to call base.obj_make_list() in the same way as demonstrated in my comment above. That way you will be consistent with other objects and you won\u0027t need to remember to do things like obj_reset_changes() (which you forgot to do in the above implementation ;) )","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bbaa1cf498cc8d3bcf92cfce779184dcf9436712","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    def obj_from_db(cls, context, db_requests):"},{"line_number":102,"context_line":"        primitive \u003d jsonutils.loads(db_requests)"},{"line_number":103,"context_line":"        device_metadata \u003d cls.obj_from_primitive(primitive)"},{"line_number":104,"context_line":"        return device_metadata"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @base.remotable_classmethod"},{"line_number":107,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_d15614cd","line":104,"updated":"2016-06-23 19:00:28.000000000","message":"You don\u0027t need this method (see below). The DeviceMetadata._from_db_obj() method should be used from base.obj_make_list()","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be56da3450168998e5691d3b067694ad71e6c172","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    def obj_from_db(cls, context, db_requests):"},{"line_number":102,"context_line":"        primitive \u003d jsonutils.loads(db_requests)"},{"line_number":103,"context_line":"        device_metadata \u003d cls.obj_from_primitive(primitive)"},{"line_number":104,"context_line":"        return device_metadata"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @base.remotable_classmethod"},{"line_number":107,"context_line":"    def get_by_instance_uuid(cls, context, instance_uuid):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_3102f80b","line":104,"in_reply_to":"3aaa91ec_711920d7","updated":"2016-06-23 19:20:22.000000000","message":"I too don\u0027t like this method, FWIW, but it\u0027s not remotable so it\u0027s not part of the api and we can easily change it later. It does mirror some of the other objects like NUMA stuff (which I also dislike).","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bbaa1cf498cc8d3bcf92cfce779184dcf9436712","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        primitive \u003d jsonutils.loads(db_extra[\u0027device_metadata\u0027])"},{"line_number":114,"context_line":"        device_metadata \u003d cls.obj_from_primitive(primitive)"},{"line_number":115,"context_line":"        return device_metadata"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _to_json(self):"},{"line_number":118,"context_line":"        return jsonutils.dumps(self.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_b15b88f5","line":115,"updated":"2016-06-23 19:00:28.000000000","message":"For XXXList nova objects, the typical practice is to use obj_base.obj_make_list(). In other words, do the following:\n\n @base.remotable_classmethod\n def get_by_instance_uuid(cls, context, instance_uuid):\n     db_extra \u003d db.instance_extra_get_by_instance_uuid(\n             context, instance_uuid, columns\u003d[\u0027device_metadata\u0027])\n     if not db_extra or db_extra[\u0027device_metadata\u0027] is None:\n         return cls(objects\u003d[])\n\n     primitive \u003d jsonutils.loads(db_extra[\u0027device_metadata\u0027])\n     return base.obj_make_list(context, cls(), DeviceMetadata, primitive)\n\nExample here:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/block_device.py#L341","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be56da3450168998e5691d3b067694ad71e6c172","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        primitive \u003d jsonutils.loads(db_extra[\u0027device_metadata\u0027])"},{"line_number":114,"context_line":"        device_metadata \u003d cls.obj_from_primitive(primitive)"},{"line_number":115,"context_line":"        return device_metadata"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _to_json(self):"},{"line_number":118,"context_line":"        return jsonutils.dumps(self.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_713800f0","line":115,"in_reply_to":"3aaa91ec_b15b88f5","updated":"2016-06-23 19:20:22.000000000","message":"obj_make_list() is for if you have a list of db primitives. They\u0027ve deserialized the whole DeviceMetadataList object out of the database, which means they don\u0027t need to (nor should) use obj_make_list(). Serializing the whole thing like this is the right thing to do, IMHO.\n\nAn example from the tree is:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/instance_numa_topology.py#L196\n\nWhile the indirection there is kinda weird, it is doing the same thing of yanking the primitive of a parent object out and deserializing it directly. That object contains a bunch of cells (kinda like a list) but also has some top-level properties, as this could later (per above comment).","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bbaa1cf498cc8d3bcf92cfce779184dcf9436712","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return device_metadata"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _to_json(self):"},{"line_number":118,"context_line":"        return jsonutils.dumps(self.obj_to_primitive())"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_11753c63","line":118,"updated":"2016-06-23 19:00:28.000000000","message":"dansmith mentioned he would fix this stuff in a future patch series, so I\u0027m OK with this.","commit_id":"2105e2b1ffb13feb43022e8a3f917004e5e9dbed"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c36e7433476d580eccfb82baeebe8a478d6a2cba","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"    \u0027HostMapping\u0027: \u00271.0-1a3390a696792a552ab7bd31a77ba9ac\u0027,"},{"line_number":1131,"context_line":"    \u0027HyperVLiveMigrateData\u0027: \u00271.0-0b868dd6228a09c3f3e47016dddf6a1c\u0027,"},{"line_number":1132,"context_line":"    \u0027HVSpec\u0027: \u00271.2-db672e73304da86139086d003f3977e7\u0027,"},{"line_number":1133,"context_line":"    \u0027IDEDeviceBus\u0027: \u00271.0-be4f7ee14a6d95f0ae2d2744be8b5583\u0027,"},{"line_number":1134,"context_line":"    \u0027ImageMeta\u0027: \u00271.8-642d1b2eb3e880a367f37d72dd76162d\u0027,"},{"line_number":1135,"context_line":"    \u0027ImageMetaProps\u0027: \u00271.13-8bc4e3cac2a941991e9adbc54e915698\u0027,"},{"line_number":1136,"context_line":"    \u0027Instance\u0027: \u00272.2-ab450ec9c1f4d429755c48d492b823f0\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_f5864363","line":1133,"updated":"2016-06-14 19:24:59.000000000","message":"We\u0027re doing this optimization because these have never (yet) been sent over RPC right? Please put a comment in the commit message explaining that for history.","commit_id":"5e0d5464818d23b4adcf7f727bba9933a1a47daf"},{"author":{"_account_id":8802,"name":"Vladik Romanovsky","email":"vromanso@redhat.com","username":"vladikr"},"change_message_id":"75bb320f8599681a2602af425d37b93af24d127c","unresolved":false,"context_lines":[{"line_number":1130,"context_line":"    \u0027HostMapping\u0027: \u00271.0-1a3390a696792a552ab7bd31a77ba9ac\u0027,"},{"line_number":1131,"context_line":"    \u0027HyperVLiveMigrateData\u0027: \u00271.0-0b868dd6228a09c3f3e47016dddf6a1c\u0027,"},{"line_number":1132,"context_line":"    \u0027HVSpec\u0027: \u00271.2-db672e73304da86139086d003f3977e7\u0027,"},{"line_number":1133,"context_line":"    \u0027IDEDeviceBus\u0027: \u00271.0-be4f7ee14a6d95f0ae2d2744be8b5583\u0027,"},{"line_number":1134,"context_line":"    \u0027ImageMeta\u0027: \u00271.8-642d1b2eb3e880a367f37d72dd76162d\u0027,"},{"line_number":1135,"context_line":"    \u0027ImageMetaProps\u0027: \u00271.13-8bc4e3cac2a941991e9adbc54e915698\u0027,"},{"line_number":1136,"context_line":"    \u0027Instance\u0027: \u00272.2-ab450ec9c1f4d429755c48d492b823f0\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_6e971d48","line":1133,"in_reply_to":"7aa08908_f5864363","updated":"2016-06-14 21:59:04.000000000","message":"Done","commit_id":"5e0d5464818d23b4adcf7f727bba9933a1a47daf"}]}
