)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ae28d7e65ef599ce8fe65690dd4a5565f3fab177","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"94427d0a_9e7ed8ab","updated":"2024-06-06 19:58:56.000000000","message":"We also recently had a situation where we needed the common pattern of \"backport the object but not the rest\". I know this isn\u0027t making DB changes (yet) but I think it\u0027d be good if we follow the usual pattern of putting the object itself in its own patch and then the code to use the new thing after it.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6358ab5e84b6537b42d646074443209a8e2b32f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"46d69b71_4d3603ed","in_reply_to":"94427d0a_9e7ed8ab","updated":"2024-06-06 20:43:35.000000000","message":"OK, that makes sense.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cdeacb4969e8ecca333b1ad1a2fe3b6090305357","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7115286b_7afc4cb2","updated":"2024-06-10 16:45:34.000000000","message":"recheck guest kernel panic\n```\n[    0.000000] APIC: Switch to symmetric I/O mode setup\n[    0.000000] ..TIMER: vector\u003d0x30 apic1\u003d0 pin1\u003d2 apic2\u003d-1 pin2\u003d-1\n[    0.000000] ..MP-BIOS bug: 8254 timer not connected to IO-APIC\n[    0.000000] ...trying to set up timer (IRQ0) through the 8259A ...\n[    0.000000] ..... (found apic 0 pin 2) ...\n[    0.000000] ....... failed.\n[    0.000000] ...trying to set up timer as Virtual Wire IRQ...\n[    0.000000] ..... failed.\n[    0.000000] ...trying to set up timer as ExtINT IRQ...\n[    0.000000] ..... failed :(.\n[    0.000000] Kernel panic - not syncing: IO-APIC + timer doesn\u0027t work!  Boot with apic\u003ddebug and send a report.  Then try booting with the \u0027noapic\u0027 option.\n```","commit_id":"f1775f000b3c18ebead0dff7b7313bd2481f0c8d"}],"nova/objects/block_device.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ae28d7e65ef599ce8fe65690dd4a5565f3fab177","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        \u0027encryption_secret_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":101,"context_line":"        \u0027encryption_format\u0027: fields.BlockDeviceEncryptionFormatTypeField("},{"line_number":102,"context_line":"            nullable\u003dTrue),"},{"line_number":103,"context_line":"        \u0027encryption_options\u0027: fields.ObjectField(\u0027EncryptOptions\u0027,"},{"line_number":104,"context_line":"                                                 nullable\u003dTrue),"},{"line_number":105,"context_line":"    }"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"0717c6cb_d429207e","line":103,"updated":"2024-06-06 19:58:56.000000000","message":"You can\u0027t do this, especially not without an object version bump. Two nodes with different versions of the code will think the object is the same and one will have a serialized object where the other could have anything. If you send this from an old node to a new one, it\u0027ll choke trying to deserialize this field as an object primitive.\n\nNot having a version bump also means that we won\u0027t get an opportunity to change the contents if we\u0027re asked to backport on sending to an old node.\n\nEven with a version bump, it\u0027s a bad idea, IMHO. I think we should add a new field for the object, which is what we normally do (and is additively-compatible). If we need to backport (and can) we can populate the old field and we can handle reading the old field when populating the new one or whatever.\n\nI assume that the previous format in the database was some subset of the things you need to populate the new object such that you can mostly convert the old things? That\u0027s okay for a new node, but what about an older node doing something like booting an evacuated node? If it doesn\u0027t know about the object being stuffed into this field, it\u0027s not going to go well.\n\nAlso, the options field you\u0027re using is only 4096 bytes and not a TEXT which is what we usually use for this. Seems like with long keys and all the overhead of the object encoding we could blow that pretty easily, no? Maybe the safest thing would be to just add the new TEXT field for the object and keep the old and new things in sync?","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6358ab5e84b6537b42d646074443209a8e2b32f5","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        \u0027encryption_secret_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":101,"context_line":"        \u0027encryption_format\u0027: fields.BlockDeviceEncryptionFormatTypeField("},{"line_number":102,"context_line":"            nullable\u003dTrue),"},{"line_number":103,"context_line":"        \u0027encryption_options\u0027: fields.ObjectField(\u0027EncryptOptions\u0027,"},{"line_number":104,"context_line":"                                                 nullable\u003dTrue),"},{"line_number":105,"context_line":"    }"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"731e7b86_d0e1bac8","line":103,"in_reply_to":"0717c6cb_d429207e","updated":"2024-06-06 20:43:35.000000000","message":"Ah, OK. I thought there was a fair chance it\u0027s not OK to do but the field has never been populated and I got confused about whether or not it would break something.\n\nThe previous format was intended to be a json.dumps() of a dict with arbitrary stuff in it.\n\nI didn\u0027t realize it wasn\u0027t the usual TEXT data type either, so I agree it\u0027s not suitable for using with the serialized object.\n\nI\u0027ll work on adding a new column to the database. Have to figure out what to name it 😩","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a25df5407d198dc1dfea76032b7e0dc2cdca344","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        \u0027encryption_secret_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":101,"context_line":"        \u0027encryption_format\u0027: fields.BlockDeviceEncryptionFormatTypeField("},{"line_number":102,"context_line":"            nullable\u003dTrue),"},{"line_number":103,"context_line":"        \u0027encryption_options\u0027: fields.ObjectField(\u0027EncryptOptions\u0027,"},{"line_number":104,"context_line":"                                                 nullable\u003dTrue),"},{"line_number":105,"context_line":"    }"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"408e9019_74386a59","line":103,"in_reply_to":"5f7bfa4d_fcd7fafc","updated":"2024-06-06 21:12:27.000000000","message":"OK, I\u0027ll give that a try.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e7f60db32a4b178bdbdcc950ab170ba0c8fb74d8","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        \u0027encryption_secret_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":101,"context_line":"        \u0027encryption_format\u0027: fields.BlockDeviceEncryptionFormatTypeField("},{"line_number":102,"context_line":"            nullable\u003dTrue),"},{"line_number":103,"context_line":"        \u0027encryption_options\u0027: fields.ObjectField(\u0027EncryptOptions\u0027,"},{"line_number":104,"context_line":"                                                 nullable\u003dTrue),"},{"line_number":105,"context_line":"    }"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7bfa4d_fcd7fafc","line":103,"in_reply_to":"731e7b86_d0e1bac8","updated":"2024-06-06 20:55:06.000000000","message":"If there\u0027s nothing set in this field in the database you might be able to get away with just changing it in place. I\u0027m not sure what the impact of that is, as opposed to adding a new column. If \"someone\" says it\u0027s roughly the same, then you could just do that.\n\nIf it\u0027s really never been set in the DB or the object, then there\u0027s probably no need to go too over the top with honoring/syncing/converting the old format, just raise an exception if you ever see the old thing set or something to avoid it going unnoticed (and/or manifesting as a much more obscure deserialization failure).","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"}],"nova/objects/encrypt_options.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ae28d7e65ef599ce8fe65690dd4a5565f3fab177","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"be0755fd_c5c64b4e","line":40,"updated":"2024-06-06 19:58:56.000000000","message":"O.vo has a `obj_set_defaults()` pattern, maybe we can just use that instead of this new thing?","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"15ee283236e91285d9728735eecff403e495de0b","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"f650a954_d8fbd67d","line":40,"in_reply_to":"555f2014_5f8d33a7","updated":"2024-06-06 21:17:19.000000000","message":"I mean, unless you\u0027re going to add more to this later (like take a version arg or something) I don\u0027t see how this is any different. Also not sure that\u0027s really something we\u0027d need to do, but I must be missing something. Feel free to explain more, or we can just deal with it later :)","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"143a53d5b981d2a1a7356c2d3593dd4b7902ddfd","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"8f0e99cb_b6e869a5","line":40,"in_reply_to":"6af471e8_a6291722","updated":"2024-06-06 22:19:19.000000000","message":"Ah, okay, you\u0027d need to register all those subclasses though to make them go over the wire. Funny story that was sort of one of the original proposed ways I was thinking of doing o.vo when it was just on a napkin...a subclass for each iteration. Turned out too complicated especially for what we needed.\n\nAnyway, yeah I say punt on that for the moment and cross that bridge when we come to it.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7a25df5407d198dc1dfea76032b7e0dc2cdca344","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"555f2014_5f8d33a7","line":40,"in_reply_to":"ad5d0879_0be7d7a5","updated":"2024-06-06 21:12:27.000000000","message":"Hm, OK. I think I was mostly thinking that it would not be allowed to change a default on the object/field in the future. If it is allowed, then that was the main thing.\n\nAs for tracking the defaults I meant like a history, like at version N the defaults were $defaults. Maybe there won\u0027t be a need to be able to create an object with older defaults set? I guess if we needed to it could be added later anyway.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6358ab5e84b6537b42d646074443209a8e2b32f5","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"c5ad27d7_bf9d3931","line":40,"in_reply_to":"be0755fd_c5c64b4e","updated":"2024-06-06 20:43:35.000000000","message":"Oh, I didn\u0027t see that method. But ignoring that, I did this because I wanted:\n\n1. A way to get a new object instance with the defaults set\n\n2. A way to keep track of potential changes in the defaults over time\n\nThe use case for adding this object to codify the defaults is to be able to keep track of old defaults for potential conversions from N \u003d\u003e N+1 we may want to do in an upgrade scenario. I was imagining if the defaults changed in some version of QEMU, then we would maybe rename this to for example `get_default_qemu_6_2_0()` and then add `get_default()` with the new defaults.\n\nIf I use `obj_set_defaults()` and set default values in the field list above, what is the proper way for handling things like tracking changes in defaults over time?","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e7f60db32a4b178bdbdcc950ab170ba0c8fb74d8","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"ad5d0879_0be7d7a5","line":40,"in_reply_to":"c5ad27d7_bf9d3931","updated":"2024-06-06 20:55:06.000000000","message":"Well, I don\u0027t see how what you have here helps with versioning (or tracking) changes in defaults. Either way, the defaults set on the fields themselves aren\u0027t part of what goes over the wire, so they will be applied by whoever runs `obj_set_defaults()`. Meaning, you can change them on the object/field later without penalty.\n\nMaybe explain more about what tracking you\u0027re actually wanting to do and I\u0027ll understand better.\n\nEither way, the desire to have a \"get me one of these with defaults set\" is fine, I just think the defaults might as well be in the fields.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f0169991dc5ea8ffa5b50575fc2d5620987f330a","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def get_default(cls):"},{"line_number":41,"context_line":"        # Supported luks options:"},{"line_number":42,"context_line":"        #"},{"line_number":43,"context_line":"        #  cipher-alg\u003d\u003cstr\u003e       - Name of cipher algorithm and key length"}],"source_content_type":"text/x-python","patch_set":1,"id":"6af471e8_a6291722","line":40,"in_reply_to":"f650a954_d8fbd67d","updated":"2024-06-06 21:38:14.000000000","message":"I wasn\u0027t thinking about there being only one method that takes a version, I was thinking similar to how the microversions are done, when there is a new one, a new class or method is added. And you call the one for the version you want.\n\nI\u0027m trying to think if there is some way we would need to do that. I guess it would be if it were possible for Nova version N to be running with different versions of QEMU on different compute hosts. Like if QEMU version X had different default values than QEMU verison Y and we had:\n\n```\n@classmethod\ndef get_default(cls):\n    return QEMU Y defaults\n    \n@classmethod\ndef get_default_qemu_x(cls):\n    return QEMU X defaults\n```\n\nand if we are a libvirt driver running on a host with QEMU version X then we would call `get_default_qemu_x()` and if we are a libvirt driver running on a host with QEMU version Y we would call `get_default()`.\n\nI don\u0027t know if we will ever need to do something like that but if we do, it sounds like it\u0027s something we could deal with later so I will ignore it for now.","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ae28d7e65ef599ce8fe65690dd4a5565f3fab177","unresolved":true,"context_lines":[{"line_number":1073,"context_line":"        self.assertEqual(MyObj, mock_objects.MyObj)"},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"# NOTE(danms): The hashes in this list should only be changed if"},{"line_number":1077,"context_line":"# they come with a corresponding version bump in the affected"},{"line_number":1078,"context_line":"# objects"},{"line_number":1079,"context_line":"object_data \u003d {"},{"line_number":1080,"context_line":"    \u0027Aggregate\u0027: \u00271.3-f315cb68906307ca2d1cca84d4753585\u0027,"},{"line_number":1081,"context_line":"    \u0027AggregateList\u0027: \u00271.3-3ea55a050354e72ef3306adefa553957\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"0d8fabf2_cde34a61","line":1078,"range":{"start_line":1076,"start_character":15,"end_line":1078,"end_character":9},"updated":"2024-06-06 19:58:56.000000000","message":"this :)","commit_id":"3f15a3977ffebab52d14cf61508112fedadd52fc"}]}
