)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"58c3b968d480c8d06f67fd24ea25de9f79cde61c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"Specific object changes are:"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"- Diagnostics: Not persisted, can be converted to ephemeral"},{"line_number":31,"context_line":"- InstanceNUMACell: Stored as a blob, can be converted to ephemeral."},{"line_number":32,"context_line":"                    Removes a test that asserted no dirty fields left"},{"line_number":33,"context_line":"                    after init, but for no reason and not compatible"},{"line_number":34,"context_line":"                    with the base class."},{"line_number":35,"context_line":"- PCIDevice: Persited row-based, so cannot be ephemeral. Converts it"},{"line_number":36,"context_line":"             to set default for the one field on lazy-load"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_632823ed","line":33,"range":{"start_line":31,"start_character":1,"end_line":33,"end_character":68},"updated":"2020-01-10 23:28:21.000000000","message":"this fields weird to mark as ephemeral since as you said it is stored in teh db in a json blob so it is persisted although only in serialised format.","commit_id":"d5c9ab878632aaf3daf1f40398774d1160e47088"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"09d57bee355804f1de2db4671254f6ba1e9d6013","unresolved":false,"context_lines":[{"line_number":28,"context_line":"Specific object changes are:"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"- Diagnostics: Not persisted, can be converted to ephemeral"},{"line_number":31,"context_line":"- InstanceNUMACell: Stored as a blob, can be converted to ephemeral."},{"line_number":32,"context_line":"                    Removes a test that asserted no dirty fields left"},{"line_number":33,"context_line":"                    after init, but for no reason and not compatible"},{"line_number":34,"context_line":"                    with the base class."},{"line_number":35,"context_line":"- PCIDevice: Persited row-based, so cannot be ephemeral. Converts it"},{"line_number":36,"context_line":"             to set default for the one field on lazy-load"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_63ed838c","line":33,"range":{"start_line":31,"start_character":1,"end_line":33,"end_character":68},"in_reply_to":"3fa7e38b_632823ed","updated":"2020-01-10 23:35:53.000000000","message":"So are you arguing that \"ephemeral\" is not the right word for the base class? If so, I\u0027m open to better word suggestions.","commit_id":"d5c9ab878632aaf3daf1f40398774d1160e47088"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"43148a548ab65219b3be89043c11d17ff5d97742","unresolved":false,"context_lines":[{"line_number":28,"context_line":"Specific object changes are:"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"- Diagnostics: Not persisted, can be converted to ephemeral"},{"line_number":31,"context_line":"- InstanceNUMACell: Stored as a blob, can be converted to ephemeral."},{"line_number":32,"context_line":"                    Removes a test that asserted no dirty fields left"},{"line_number":33,"context_line":"                    after init, but for no reason and not compatible"},{"line_number":34,"context_line":"                    with the base class."},{"line_number":35,"context_line":"- PCIDevice: Persited row-based, so cannot be ephemeral. Converts it"},{"line_number":36,"context_line":"             to set default for the one field on lazy-load"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_436967f4","line":33,"range":{"start_line":31,"start_character":1,"end_line":33,"end_character":68},"in_reply_to":"3fa7e38b_63ed838c","updated":"2020-01-10 23:58:43.000000000","message":"kind of but i get why you chose that name so even though i think i feel a little weird in this case it might be better to keep that name if its more intuitive in general.\n\nwe could go with something like initialised_object but i really need to sleep on it. may be transient_object or tempory_object but the are really not any better the ephemeral.\n\ni thinks more just a case of numa being awkward as usual :)","commit_id":"d5c9ab878632aaf3daf1f40398774d1160e47088"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":44,"context_line":"           to always overwrite what is in the database on save. This is"},{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_3d1eae75","line":47,"updated":"2020-01-14 09:42:57.000000000","message":"What about RequestLevelParams and SchedulerLimits? I think both can also be converted to Ephemeral","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":44,"context_line":"           to always overwrite what is in the database on save. This is"},{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_a8925749","line":47,"in_reply_to":"3fa7e38b_3d1eae75","updated":"2020-01-14 15:11:58.000000000","message":"RLP wasn\u0027t in tree when I started this, but it\u0027s the reason we\u0027re doing this. I\u0027ll have to go look at SchedulerLimits, but I\u0027m sure you\u0027re right. If you\u0027re okay with it, I\u0027ll do that in a follow-on. These conversions happened here because these objects *had* to change in order to turn on the policy-testing test. Anything else that doesn\u0027t can be fixed in a separate patch to avoid this getting too large and monolithic.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1b78096469ca3a855e1a58cb3f2dcb1a9a8c49c2","unresolved":false,"context_lines":[{"line_number":44,"context_line":"           to always overwrite what is in the database on save. This is"},{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_8bc67569","line":47,"in_reply_to":"3fa7e38b_a8925749","updated":"2020-01-14 15:48:03.000000000","message":"Sure, follow up works for me.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Change-Id: Ica9f217d0318fc7c2db4bcdea12d00aad749c30c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_c0cbf1a4","line":49,"range":{"start_line":48,"start_character":50,"end_line":49,"end_character":27},"updated":"2020-01-14 09:42:57.000000000","message":"I don\u0027t think it is true. The RequestGroup hash did not change even after the inheritance did. I guess that the hash change for object where the field definition is changed due to added defaulting.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Change-Id: Ica9f217d0318fc7c2db4bcdea12d00aad749c30c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_68d45fbd","line":49,"range":{"start_line":48,"start_character":50,"end_line":49,"end_character":27},"in_reply_to":"3fa7e38b_c0cbf1a4","updated":"2020-01-14 15:11:58.000000000","message":"I will tweak the wording to be more vague :)","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbbd5277fffd964cffc5760d892c63155b1cd9d1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Change-Id: Ica9f217d0318fc7c2db4bcdea12d00aad749c30c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_8b88bf1a","line":50,"range":{"start_line":48,"start_character":0,"end_line":50,"end_character":9},"updated":"2020-01-14 07:27:25.000000000","message":"just to expand on this we do change versions based on inheriace normally but only if a filed is added or remvoed from the base class which is not the case here so yes, no version bump is required.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":45,"context_line":"           part of how service version works to always know the version of"},{"line_number":46,"context_line":"           compute (et al) services once they start up."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"For the objects that were converted to Ephemeral, hashes changed but only"},{"line_number":49,"context_line":"because the inheritance did, so no need to bump the version, just update"},{"line_number":50,"context_line":"the hash."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Change-Id: Ica9f217d0318fc7c2db4bcdea12d00aad749c30c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_486e4365","line":50,"range":{"start_line":48,"start_character":0,"end_line":50,"end_character":9},"in_reply_to":"3fa7e38b_8b88bf1a","updated":"2020-01-14 15:11:58.000000000","message":"Right the version only needs to be bumped if it affects the RPC on one side. This does not.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b60579acc43fbc4628c05bd4fc757ed9f50c66be","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add NovaEphemeralObject class for non-persistent objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds a NovaEphemeralObject class, which inherits from NovaObject"},{"line_number":10,"context_line":"and also from EphemeralObject. The latter is proposed against o.vo,"},{"line_number":11,"context_line":"and is copied here for expediency."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"In the past, all of our objects were representations of rows of columns"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_8c0e6f8d","line":10,"range":{"start_line":10,"start_character":45,"end_line":10,"end_character":66},"updated":"2020-01-15 22:36:38.000000000","message":"Let\u0027s link in I4730dd45359db54318843d2790b74d43430368ee if you respin please.","commit_id":"c2ba0ef21e60474d48733b4869b54327bcb413e3"}],"nova/objects/instance_numa.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"58c3b968d480c8d06f67fd24ea25de9f79cde61c","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# TODO(berrange): Remove NovaObjectDictCompat"},{"line_number":28,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":29,"context_line":"class InstanceNUMACell(base.NovaEphemeralObject,"},{"line_number":30,"context_line":"                       base.NovaObjectDictCompat):"},{"line_number":31,"context_line":"    # Version 1.0: Initial version"},{"line_number":32,"context_line":"    # Version 1.1: Add pagesize field"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_c33c772e","line":29,"range":{"start_line":29,"start_character":24,"end_line":29,"end_character":47},"updated":"2020-01-10 23:28:21.000000000","message":"that said while i think it strange to mark this as Ephemeral\nwhen it will be stored in the db i like the clean up of the init method.","commit_id":"d5c9ab878632aaf3daf1f40398774d1160e47088"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbbd5277fffd964cffc5760d892c63155b1cd9d1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \u0027id\u0027: obj_fields.IntegerField(),"},{"line_number":51,"context_line":"        \u0027cpuset\u0027: obj_fields.SetOfIntegersField(),"},{"line_number":52,"context_line":"        \u0027memory\u0027: obj_fields.IntegerField(),"},{"line_number":53,"context_line":"        \u0027pagesize\u0027: obj_fields.IntegerField(nullable\u003dTrue,"},{"line_number":54,"context_line":"                                            default\u003dNone),"},{"line_number":55,"context_line":"        \u0027cpu_topology\u0027: obj_fields.ObjectField(\u0027VirtCPUTopology\u0027,"},{"line_number":56,"context_line":"                                               nullable\u003dTrue),"},{"line_number":57,"context_line":"        \u0027cpu_pinning_raw\u0027: obj_fields.DictOfIntegersField(nullable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_eba29397","line":54,"range":{"start_line":53,"start_character":43,"end_line":54,"end_character":56},"updated":"2020-01-14 07:27:25.000000000","message":"nit: if you are making it multi line i prefer if you also bring down nullable as it allow you to reduce the indent\n\npagesize\u0027: obj_fields.IntegerField(\n    nullable\u003dTrue, default\u003dNone),","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbbd5277fffd964cffc5760d892c63155b1cd9d1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                                          default\u003dNone),"},{"line_number":59,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue,"},{"line_number":60,"context_line":"                                                          default\u003dNone),"},{"line_number":61,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":62,"context_line":"            nullable\u003dTrue,"},{"line_number":63,"context_line":"            default\u003dNone),"},{"line_number":64,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":65,"context_line":"        \u0027cpuset_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue,"},{"line_number":66,"context_line":"                                                         default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_8bb19fe6","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":26},"updated":"2020-01-14 07:27:25.000000000","message":"like this although i would not put default on its own line. it can go on the same line as nullable.\n\nagain just a nit but i hate to was virtcal space like this when i dont need too.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0cecbcd0ec4688694279da30201ffc50359fb0af","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                                          default\u003dNone),"},{"line_number":59,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue,"},{"line_number":60,"context_line":"                                                          default\u003dNone),"},{"line_number":61,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":62,"context_line":"            nullable\u003dTrue,"},{"line_number":63,"context_line":"            default\u003dNone),"},{"line_number":64,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":65,"context_line":"        \u0027cpuset_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue,"},{"line_number":66,"context_line":"                                                         default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_2e8c2fd7","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":26},"in_reply_to":"3fa7e38b_0e8e1326","updated":"2020-01-14 16:23:14.000000000","message":"oh i hate to move to the next line if you can fit it on one line\n\ni assumed\n\n\u0027pagesize\u0027: obj_fields.IntegerField(nullable\u003dTrue,\n                                            default\u003dNone),\n\nwould not fit as \n\u0027pagesize\u0027: obj_fields.IntegerField(nullable\u003dTrue, default\u003dNone),\n\ni only use \n\u0027pagesize\u0027: obj_fields.IntegerField(\n    nullable\u003dTrue, default\u003dNone),\nif its absolutly required in preference to \n\n\u0027pagesize\u0027: obj_fields.IntegerField(nullable\u003dTrue,\n                                    default\u003dNone),","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1b78096469ca3a855e1a58cb3f2dcb1a9a8c49c2","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                                          default\u003dNone),"},{"line_number":59,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue,"},{"line_number":60,"context_line":"                                                          default\u003dNone),"},{"line_number":61,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":62,"context_line":"            nullable\u003dTrue,"},{"line_number":63,"context_line":"            default\u003dNone),"},{"line_number":64,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":65,"context_line":"        \u0027cpuset_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue,"},{"line_number":66,"context_line":"                                                         default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4b6e3d65","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":26},"in_reply_to":"3fa7e38b_28a667ae","updated":"2020-01-14 15:48:03.000000000","message":"We should just use \"black\". \n/me runs away and hides","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4f8f556f6d499733aa420e108a486a8642fc0f6b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                                          default\u003dNone),"},{"line_number":59,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue,"},{"line_number":60,"context_line":"                                                          default\u003dNone),"},{"line_number":61,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":62,"context_line":"            nullable\u003dTrue,"},{"line_number":63,"context_line":"            default\u003dNone),"},{"line_number":64,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":65,"context_line":"        \u0027cpuset_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue,"},{"line_number":66,"context_line":"                                                         default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_0e8e1326","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":26},"in_reply_to":"3fa7e38b_4b6e3d65","updated":"2020-01-14 16:10:48.000000000","message":"Heh.\n\nSo, re-reading this, I was actually reacting to sean\u0027s comment above, of moving to the next line when not necessary. For this one where we have to be on the next line, I can use one line instead of two (since we\u0027re already forced into ugly syntax).","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                                          default\u003dNone),"},{"line_number":59,"context_line":"        \u0027cpu_policy\u0027: obj_fields.CPUAllocationPolicyField(nullable\u003dTrue,"},{"line_number":60,"context_line":"                                                          default\u003dNone),"},{"line_number":61,"context_line":"        \u0027cpu_thread_policy\u0027: obj_fields.CPUThreadAllocationPolicyField("},{"line_number":62,"context_line":"            nullable\u003dTrue,"},{"line_number":63,"context_line":"            default\u003dNone),"},{"line_number":64,"context_line":"        # These physical CPUs are reserved for use by the hypervisor"},{"line_number":65,"context_line":"        \u0027cpuset_reserved\u0027: obj_fields.SetOfIntegersField(nullable\u003dTrue,"},{"line_number":66,"context_line":"                                                         default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_28a667ae","line":63,"range":{"start_line":61,"start_character":8,"end_line":63,"end_character":26},"in_reply_to":"3fa7e38b_8bb19fe6","updated":"2020-01-14 15:11:58.000000000","message":"Sorry, but I *hate* this style except when it\u0027s absolutely necessary.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"}],"nova/objects/pci_device.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"58c3b968d480c8d06f67fd24ea25de9f79cde61c","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":175,"context_line":"        super(PciDevice, self).__init__(*args, **kwargs)"},{"line_number":176,"context_line":"        self.obj_reset_changes()"},{"line_number":177,"context_line":"        self.extra_info \u003d {}"},{"line_number":178,"context_line":"        # NOTE(ndipanov): These are required to build an in-memory device tree"},{"line_number":179,"context_line":"        # but don\u0027t need to be proper fields (and can\u0027t easily be as they would"},{"line_number":180,"context_line":"        # hold circular references)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_03204ff7","side":"PARENT","line":177,"range":{"start_line":176,"start_character":8,"end_line":177,"end_character":28},"updated":"2020-01-10 23:28:21.000000000","message":"the order of this was orginally reversed\n\nhttps://github.com/openstack/nova/commit/2c0d66a6ec0ddafea89fe9abf810d4ea0789d31b#diff-e803c1c4f4b46780807206f41ff603cfR139-R140\n\nso that the dict would not be saved.\n\nbut https://github.com/openstack/nova/commit/0663778c531a69bf55ed8f88cd828febd69be44c\n\nchanged the order to fix https://bugs.launchpad.net/nova/+bug/1223559 however they should have just removed the self.obj_reset_changes() in that case not move the initalisattion of extra_info\n\nso im pretty sure you can just delelte the \n self.obj_reset_changes() call","commit_id":"b0cae0750c3d9f9ebac33ee38cc1762fdd7fc138"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"09d57bee355804f1de2db4671254f6ba1e9d6013","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":175,"context_line":"        super(PciDevice, self).__init__(*args, **kwargs)"},{"line_number":176,"context_line":"        self.obj_reset_changes()"},{"line_number":177,"context_line":"        self.extra_info \u003d {}"},{"line_number":178,"context_line":"        # NOTE(ndipanov): These are required to build an in-memory device tree"},{"line_number":179,"context_line":"        # but don\u0027t need to be proper fields (and can\u0027t easily be as they would"},{"line_number":180,"context_line":"        # hold circular references)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_a3ddbbde","side":"PARENT","line":177,"range":{"start_line":176,"start_character":8,"end_line":177,"end_character":28},"in_reply_to":"3fa7e38b_03204ff7","updated":"2020-01-10 23:35:53.000000000","message":"\u003e the order of this was orginally reversed\n \u003e \n \u003e https://github.com/openstack/nova/commit/2c0d66a6ec0ddafea89fe9abf810d4ea0789d31b#diff-e803c1c4f4b46780807206f41ff603cfR139-R140\n \u003e \n \u003e so that the dict would not be saved.\n \u003e \n \u003e but https://github.com/openstack/nova/commit/0663778c531a69bf55ed8f88cd828febd69be44c\n \u003e \n \u003e changed the order to fix https://bugs.launchpad.net/nova/+bug/1223559\n \u003e however they should have just removed the self.obj_reset_changes()\n \u003e in that case not move the initalisattion of extra_info\n \u003e \n \u003e so im pretty sure you can just delelte the\n \u003e self.obj_reset_changes() call\n\nAck. I added the obj_set_defaults() line in create() to handle the keep-it-dirty compatibility, and left the obj_reset_changes() because any that are passed in via init would have been reset before. However, I very much don\u0027t like to have one object changing the behavior like that so if you\u0027re sure that we can drop that entirely I\u0027m definitely happy with that.","commit_id":"b0cae0750c3d9f9ebac33ee38cc1762fdd7fc138"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":175,"context_line":"        super(PciDevice, self).__init__(*args, **kwargs)"},{"line_number":176,"context_line":"        self.obj_reset_changes()"},{"line_number":177,"context_line":"        self.extra_info \u003d {}"},{"line_number":178,"context_line":"        # NOTE(ndipanov): These are required to build an in-memory device tree"},{"line_number":179,"context_line":"        # but don\u0027t need to be proper fields (and can\u0027t easily be as they would"},{"line_number":180,"context_line":"        # hold circular references)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_60323df6","side":"PARENT","line":177,"updated":"2020-01-14 09:42:57.000000000","message":"Why can\u0027t we keep this as is? This change now makes the code more complicated to achieve the same behavior","commit_id":"b0cae0750c3d9f9ebac33ee38cc1762fdd7fc138"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":175,"context_line":"        super(PciDevice, self).__init__(*args, **kwargs)"},{"line_number":176,"context_line":"        self.obj_reset_changes()"},{"line_number":177,"context_line":"        self.extra_info \u003d {}"},{"line_number":178,"context_line":"        # NOTE(ndipanov): These are required to build an in-memory device tree"},{"line_number":179,"context_line":"        # but don\u0027t need to be proper fields (and can\u0027t easily be as they would"},{"line_number":180,"context_line":"        # hold circular references)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_68f3ffa1","side":"PARENT","line":177,"in_reply_to":"3fa7e38b_60323df6","updated":"2020-01-14 15:11:58.000000000","message":"The whole point of this change is to stop people from initializing fields during __init__ for objects that are not NovaEphemeralObject. So, we can\u0027t keep this behavior because it\u0027s the behavior we\u0027re trying to remove. PciDevice is very much a conventional row-based object, which means it needs to not inherit from ephemeral, and not default on init. I\u0027d rather the code not just assume extra_info is set blindly, but the obj_load_attr() change is smaller than hunting out all the possible places that it does, and is also the compromise we\u0027ve been steering people to for a couple years when they want this kind of behavior.","commit_id":"b0cae0750c3d9f9ebac33ee38cc1762fdd7fc138"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1b78096469ca3a855e1a58cb3f2dcb1a9a8c49c2","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":175,"context_line":"        super(PciDevice, self).__init__(*args, **kwargs)"},{"line_number":176,"context_line":"        self.obj_reset_changes()"},{"line_number":177,"context_line":"        self.extra_info \u003d {}"},{"line_number":178,"context_line":"        # NOTE(ndipanov): These are required to build an in-memory device tree"},{"line_number":179,"context_line":"        # but don\u0027t need to be proper fields (and can\u0027t easily be as they would"},{"line_number":180,"context_line":"        # hold circular references)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_6b4f79bf","side":"PARENT","line":177,"in_reply_to":"3fa7e38b_68f3ffa1","updated":"2020-01-14 15:48:03.000000000","message":"Thanks. I don\u0027t block on this.","commit_id":"b0cae0750c3d9f9ebac33ee38cc1762fdd7fc138"}],"nova/objects/quotas.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbbd5277fffd964cffc5760d892c63155b1cd9d1","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                      default\u003dNone),"},{"line_number":73,"context_line":"    }"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def obj_load_attr(self, attr):"},{"line_number":76,"context_line":"        self.obj_set_defaults(attr)"},{"line_number":77,"context_line":"        # NOTE(danms): This is strange because resetting these would cause"},{"line_number":78,"context_line":"        # them not to be saved to the database. I would imagine this is"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_ebbb73bb","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":21},"updated":"2020-01-14 07:27:25.000000000","message":"so is this for lazy loading.\ni.e. if the object does not have the field currentl set and we do obj.attr then it will default init attr and clear the dirty bit.\n\ni dont see a retrun so im not really sure how this gets invoked and how the sideffects are observed.\n\nthis is an ovo function definition right\n\nhttps://docs.openstack.org/oslo.versionedobjects/latest/reference/base.html#oslo_versionedobjects.base.VersionedObject.obj_load_attr","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                      default\u003dNone),"},{"line_number":73,"context_line":"    }"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def obj_load_attr(self, attr):"},{"line_number":76,"context_line":"        self.obj_set_defaults(attr)"},{"line_number":77,"context_line":"        # NOTE(danms): This is strange because resetting these would cause"},{"line_number":78,"context_line":"        # them not to be saved to the database. I would imagine this is"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_08892b24","line":75,"range":{"start_line":75,"start_character":8,"end_line":75,"end_character":21},"in_reply_to":"3fa7e38b_ebbb73bb","updated":"2020-01-14 15:11:58.000000000","message":"There is no return expected. The object system expects this method to either return with the attribute set, or raise. Because they all have default values, the next line will set the default for whatever hits this load, satisfying the requirement.\n\nFWIW, this is what we\u0027ve been steering people towards that want default-on-init behavior in place of doing it actually in init.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    \u0027PowerVMLiveMigrateData\u0027: \u00271.4-a745f4eda16b45e1bc5686a0c498f27e\u0027,"},{"line_number":1121,"context_line":"    \u0027Quotas\u0027: \u00271.3-3b2b91371f60e788035778fc5f87797d\u0027,"},{"line_number":1122,"context_line":"    \u0027QuotasNoOp\u0027: \u00271.3-d1593cf969c81846bc8192255ea95cce\u0027,"},{"line_number":1123,"context_line":"    \u0027RequestGroup\u0027: \u00271.3-0458d350a8ec9d0673f9be5640a990ce\u0027,"},{"line_number":1124,"context_line":"    \u0027RequestLevelParams\u0027: \u00271.0-1e5c8c18bd44cd233c8b32509c99d06f\u0027,"},{"line_number":1125,"context_line":"    \u0027RequestSpec\u0027: \u00271.13-e1aa38b2bf3f8547474ee9e4c0aa2745\u0027,"},{"line_number":1126,"context_line":"    \u0027Resource\u0027: \u00271.0-d8a2abbb380da583b995fd118f6a8953\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_e0e70d45","line":1123,"updated":"2020-01-14 09:42:57.000000000","message":"Why doesn\u0027t the hash changes here? See my related comment in the commit message too.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1b78096469ca3a855e1a58cb3f2dcb1a9a8c49c2","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    \u0027PowerVMLiveMigrateData\u0027: \u00271.4-a745f4eda16b45e1bc5686a0c498f27e\u0027,"},{"line_number":1121,"context_line":"    \u0027Quotas\u0027: \u00271.3-3b2b91371f60e788035778fc5f87797d\u0027,"},{"line_number":1122,"context_line":"    \u0027QuotasNoOp\u0027: \u00271.3-d1593cf969c81846bc8192255ea95cce\u0027,"},{"line_number":1123,"context_line":"    \u0027RequestGroup\u0027: \u00271.3-0458d350a8ec9d0673f9be5640a990ce\u0027,"},{"line_number":1124,"context_line":"    \u0027RequestLevelParams\u0027: \u00271.0-1e5c8c18bd44cd233c8b32509c99d06f\u0027,"},{"line_number":1125,"context_line":"    \u0027RequestSpec\u0027: \u00271.13-e1aa38b2bf3f8547474ee9e4c0aa2745\u0027,"},{"line_number":1126,"context_line":"    \u0027Resource\u0027: \u00271.0-d8a2abbb380da583b995fd118f6a8953\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_2bde61db","line":1123,"in_reply_to":"3fa7e38b_284987b7","updated":"2020-01-14 15:48:03.000000000","message":"Yeah that my guess too","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    \u0027PowerVMLiveMigrateData\u0027: \u00271.4-a745f4eda16b45e1bc5686a0c498f27e\u0027,"},{"line_number":1121,"context_line":"    \u0027Quotas\u0027: \u00271.3-3b2b91371f60e788035778fc5f87797d\u0027,"},{"line_number":1122,"context_line":"    \u0027QuotasNoOp\u0027: \u00271.3-d1593cf969c81846bc8192255ea95cce\u0027,"},{"line_number":1123,"context_line":"    \u0027RequestGroup\u0027: \u00271.3-0458d350a8ec9d0673f9be5640a990ce\u0027,"},{"line_number":1124,"context_line":"    \u0027RequestLevelParams\u0027: \u00271.0-1e5c8c18bd44cd233c8b32509c99d06f\u0027,"},{"line_number":1125,"context_line":"    \u0027RequestSpec\u0027: \u00271.13-e1aa38b2bf3f8547474ee9e4c0aa2745\u0027,"},{"line_number":1126,"context_line":"    \u0027Resource\u0027: \u00271.0-d8a2abbb380da583b995fd118f6a8953\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_284987b7","line":1123,"in_reply_to":"3fa7e38b_e0e70d45","updated":"2020-01-14 15:11:58.000000000","message":"Because inheritance changed, but no default\u003d was added probably.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"                  if (cls.OBJ_PROJECT_NAMESPACE \u003d\u003d"},{"line_number":1177,"context_line":"                      base.NovaObject.OBJ_PROJECT_NAMESPACE)]"},{"line_number":1178,"context_line":"        if our_ns:"},{"line_number":1179,"context_line":"            nova_classes[name] \u003d our_ns"},{"line_number":1180,"context_line":"    return nova_classes"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_c088d11b","line":1179,"updated":"2020-01-14 09:42:57.000000000","message":"While it seems like an improvement it feels unrelated.\n\n//later \n\nIf I remove this change the then the test_init_behavior_policy fails on os_vif Network object. Which is strange as such test seems like want to skip non nova owned object.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"                  if (cls.OBJ_PROJECT_NAMESPACE \u003d\u003d"},{"line_number":1177,"context_line":"                      base.NovaObject.OBJ_PROJECT_NAMESPACE)]"},{"line_number":1178,"context_line":"        if our_ns:"},{"line_number":1179,"context_line":"            nova_classes[name] \u003d our_ns"},{"line_number":1180,"context_line":"    return nova_classes"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_a807b770","line":1179,"in_reply_to":"3fa7e38b_c088d11b","updated":"2020-01-14 15:11:58.000000000","message":"Right, the problem is that the object registry is common, and once we import os_vif objects, we mix their objects into our registry. Since we have a Network object too, theirs gets added to the list. Since this was previously only checking the first implementation of each object schema name, it was returning the full list of Network objects and then we failed on the os_vif one.\n\nThis is actually an explosion waiting to happen and I haven\u0027t decided what the best course of action is. The namespace stuff was added hastily when we split out o.vo and clearly wasn\u0027t very well thought-out. So I need to revisit that and see what the path out is for now.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"        violations \u003d collections.defaultdict(list)"},{"line_number":1331,"context_line":""},{"line_number":1332,"context_line":"        from os_vif import objects as osv_objects"},{"line_number":1333,"context_line":"        osv_objects.register_all()"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"        # NOTE(danms): Do not add things to this list!"},{"line_number":1336,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_c0b1b1e5","line":1333,"range":{"start_line":1332,"start_character":0,"end_line":1333,"end_character":34},"updated":"2020-01-14 09:42:57.000000000","message":"I don\u0027t get this. os_vif ovos are never inherit from NovaObject and it seems to me that the test below wants to skip non NovaObjects. But then why we register them for this test.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"        violations \u003d collections.defaultdict(list)"},{"line_number":1331,"context_line":""},{"line_number":1332,"context_line":"        from os_vif import objects as osv_objects"},{"line_number":1333,"context_line":"        osv_objects.register_all()"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"        # NOTE(danms): Do not add things to this list!"},{"line_number":1336,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_486de32d","line":1333,"range":{"start_line":1332,"start_character":0,"end_line":1333,"end_character":34},"in_reply_to":"3fa7e38b_c0b1b1e5","updated":"2020-01-14 15:11:58.000000000","message":"Sorry, this was debug. The test was only failing when run as part of the whole group (where another test ended up registering the objects). I added this to make it run consistently in isolation while I figured out what was going on. I meant to remove this and forgot.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"680936948250a7ce22b20cb5de3f8d934a8e3349","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"                key \u003d \u0027%s-%s\u0027 % (name, objcls.VERSION)"},{"line_number":1352,"context_line":"                obj \u003d objcls()"},{"line_number":1353,"context_line":"                if not isinstance(obj, base.NovaObject):"},{"line_number":1354,"context_line":"                    # Exclude any objects that aren\u0027t owned by Nova"},{"line_number":1355,"context_line":"                    pass"},{"line_number":1356,"context_line":"                elif isinstance(obj, base.NovaEphemeralObject):"},{"line_number":1357,"context_line":"                    # Skip ephemeral objects, which are allowed to"},{"line_number":1358,"context_line":"                    # set fields at init time"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_e08dcd29","line":1355,"range":{"start_line":1354,"start_character":1,"end_line":1355,"end_character":24},"updated":"2020-01-14 09:42:57.000000000","message":"If we really want to skip non nova owned object the it should continue instead of skip.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"eb780e14221ee9fc926fd55becde62a5d136d8ba","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"                key \u003d \u0027%s-%s\u0027 % (name, objcls.VERSION)"},{"line_number":1352,"context_line":"                obj \u003d objcls()"},{"line_number":1353,"context_line":"                if not isinstance(obj, base.NovaObject):"},{"line_number":1354,"context_line":"                    # Exclude any objects that aren\u0027t owned by Nova"},{"line_number":1355,"context_line":"                    pass"},{"line_number":1356,"context_line":"                elif isinstance(obj, base.NovaEphemeralObject):"},{"line_number":1357,"context_line":"                    # Skip ephemeral objects, which are allowed to"},{"line_number":1358,"context_line":"                    # set fields at init time"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_684f7fbf","line":1355,"range":{"start_line":1354,"start_character":1,"end_line":1355,"end_character":24},"in_reply_to":"3fa7e38b_e08dcd29","updated":"2020-01-14 15:11:58.000000000","message":"This too can go, part of the above.","commit_id":"1261980d52b5d0bb1825d83accbcd5fa339ebd95"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b60579acc43fbc4628c05bd4fc757ed9f50c66be","unresolved":false,"context_lines":[{"line_number":1362,"context_line":""},{"line_number":1363,"context_line":"        self.assertEqual({}, violations,"},{"line_number":1364,"context_line":"                         \u0027Some non-ephemeral objects set fields during \u0027"},{"line_number":1365,"context_line":"                         \u0027initialization; This is not allowed.\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_af255daf","line":1365,"updated":"2020-01-15 22:36:38.000000000","message":"does this also print the actual/expected?","commit_id":"c2ba0ef21e60474d48733b4869b54327bcb413e3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"df40261ab1c9a56fd7d0b26289eccdc54cc1b353","unresolved":false,"context_lines":[{"line_number":1362,"context_line":""},{"line_number":1363,"context_line":"        self.assertEqual({}, violations,"},{"line_number":1364,"context_line":"                         \u0027Some non-ephemeral objects set fields during \u0027"},{"line_number":1365,"context_line":"                         \u0027initialization; This is not allowed.\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_8fe3c13a","line":1365,"in_reply_to":"3fa7e38b_af255daf","updated":"2020-01-15 22:47:55.000000000","message":"It does.","commit_id":"c2ba0ef21e60474d48733b4869b54327bcb413e3"}]}
