)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"5d18ed87b0cf9ba691af36d1248d7d8c31e6e5dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9a650577_d11e9eaa","updated":"2023-06-28 12:58:43.000000000","message":"Sounds good to me except the question I have.","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7d7faaaae490ba167f8742f823e3d9ee607a215b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b4dc9f0b_730ce29f","updated":"2023-06-28 20:50:31.000000000","message":"Thanks for taking a look!","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"99ed30c1cd16a7fc45eef595255056cda3c2d4d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a7cc5679_9d110697","updated":"2023-08-08 20:46:15.000000000","message":"I haven\u0027t looked at enough of this series to really vote on these things yet, but I think uggla\u0027s question begs some sort of change to make it clearer for the next person.","commit_id":"d77f3674fee91419f59391bfc730a373e604f0d0"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"68ed938970a70eab1c0ee1a3e5d9bb15b2d4c763","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"00463d20_22e86ea0","updated":"2023-08-25 01:35:33.000000000","message":"Func tests are failing ... need to rework this.","commit_id":"270aa2313ccc7ddc061b8dbb5129dda172aa851c"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"19ff4ab0c981696c750176b91ccdc833fc419e01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"dc0ed51f_8ce0ad49","updated":"2023-08-25 09:50:31.000000000","message":"recheck \ngrenade /opt/stack/new/grenade/localrc not found\nhttps://zuul.opendev.org/t/openstack/build/6d94dac33ff64df0bf502117962b0d0c/log/job-output.txt?severity\u003d0#31850","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"6987fd539e9cd0cb71d8260dae6d29af4962ecc9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"82ed9182_e656930d","updated":"2023-08-25 06:49:21.000000000","message":"recheck mostly timeout while wait_for_ssh","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"a5918ac13e5078371b3707e0e2e29c5fbb1ef7c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8e6f41ff_cc15b5ca","updated":"2023-08-26 05:50:07.000000000","message":"recheck  SSH timed out wait_for_ssh_or_ping","commit_id":"c57a10f8366c3e57e0c67e732a61f940953e44fa"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"8dd442edab304ea51f7bc282e0a0305d860885f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3c8c1567_0f3c0431","updated":"2024-01-19 09:51:49.000000000","message":"lgtm","commit_id":"1d96b308f7f53d48ecaa1308b2186c07be8a6bbc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2b37a0b60872c21d3f1dd3ae7fe84bd15b3c06a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"2d439f94_d4d471a9","updated":"2024-01-25 10:08:18.000000000","message":"It was ok for me before, still ok.","commit_id":"94c9c187f7b998d87b2fa3f58b7977398f7e6f23"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5b510a1d767ec257bbe58552110cf455c04a0e6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"c800b5df_4bc2a1bb","updated":"2024-02-23 10:31:22.000000000","message":"Honestly, I\u0027m not sure I can review this series but it looks good to me.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bfd18c6c4a6ba6e37edd00ea0c8f05b7203bddb2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"3ef46f3b_4202490f","updated":"2024-02-26 16:53:18.000000000","message":"I haven\u0027t gone super deep on this because I think time is probably better spent on the patches above it since this is mostly mechanical. The linkage between all these layers makes it a bit of a mess to fully chase this through so I\u0027m going to assume that this is okay enough for the stuff above.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b09d18861f7b49f95d8fdfaec7962dca2f270f78","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"dfe488a8_ddc32793","updated":"2024-02-19 01:56:24.000000000","message":"recheck","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9555ab10751a639305c3969ca495d79a607f20f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"e91f2390_c3cd4cbd","updated":"2024-02-23 19:56:19.000000000","message":"recheck 2024-02-23 14:01:40,194 98779 INFO     [paramiko.transport] Connected (version 2.0, client dropbear_2020.81)\n2024-02-23 14:01:40,291 98779 INFO     [paramiko.transport] Authentication (publickey) failed.\n2024-02-23 14:01:40,292 98779 ERROR    [tempest.lib.common.ssh] Failed to establish authenticated ssh connection to cirros@172.24.5.119 after 17 attempts. Proxy client: no proxy client","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8867553f369dfc61a3a3ba73d03e67fe7675b60d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"a1d2f08c_0ad20981","updated":"2024-02-23 12:23:03.000000000","message":"recheck timeout","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3ba9301fb71f257e94de3112ce116aba34e69ffe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"2147828a_0aeeb1aa","updated":"2024-02-27 16:13:45.000000000","message":"recheck timeout in the scenario phase very unlikely it\u0027s related to this","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5b510a1d767ec257bbe58552110cf455c04a0e6b","unresolved":true,"context_lines":[{"line_number":3494,"context_line":"                    \u0027encrypted\u0027: False,"},{"line_number":3495,"context_line":"                    \u0027encryption_secret_uuid\u0027: None,"},{"line_number":3496,"context_line":"                    \u0027encryption_format\u0027: None,"},{"line_number":3497,"context_line":"                    \u0027encryption_options\u0027: None,"},{"line_number":3498,"context_line":"                },"},{"line_number":3499,"context_line":"                \u0027ephemerals\u0027: ["},{"line_number":3500,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":12,"id":"d12eb72c_397afc81","line":3497,"updated":"2024-02-23 10:31:22.000000000","message":"ok, this shows that now the virt driver returns the encrypted swap info","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"09fe7e3980fc01d0fb7c1b4f61bf48bc12e8a093","unresolved":true,"context_lines":[{"line_number":3494,"context_line":"                    \u0027encrypted\u0027: False,"},{"line_number":3495,"context_line":"                    \u0027encryption_secret_uuid\u0027: None,"},{"line_number":3496,"context_line":"                    \u0027encryption_format\u0027: None,"},{"line_number":3497,"context_line":"                    \u0027encryption_options\u0027: None,"},{"line_number":3498,"context_line":"                },"},{"line_number":3499,"context_line":"                \u0027ephemerals\u0027: ["},{"line_number":3500,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":12,"id":"aa3b1882_c4282702","line":3497,"in_reply_to":"d12eb72c_397afc81","updated":"2024-02-26 17:15:11.000000000","message":"Right, asserts that the encryption related attributes are included for swap when ComputeManager._get_instance_block_device_info() is called on L3528. Methods like _get_instance_block_device_info() convert objects.BlockDeviceMapping \u003d\u003e DriverBlockDevice.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"}],"nova/tests/unit/virt/test_block_device.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"6987fd539e9cd0cb71d8260dae6d29af4962ecc9","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        db_bdm \u003d getattr(self, \"%s_bdm\" % name)"},{"line_number":329,"context_line":"        test_bdm \u003d self.driver_classes[name](db_bdm)"},{"line_number":330,"context_line":"        expected \u003d getattr(self, \"%s_driver_bdm\" % name)"},{"line_number":331,"context_line":"        self.assertThat(expected, matchers.DictMatches(test_bdm))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        for k, v in db_bdm.items():"},{"line_number":334,"context_line":"            field_val \u003d getattr(test_bdm._bdm_obj, k)"}],"source_content_type":"text/x-python","patch_set":6,"id":"25967799_6fd3afec","line":331,"updated":"2023-08-25 06:49:21.000000000","message":"here verify, new encryption fields are added in DriverSwapBlockDevice object","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"6987fd539e9cd0cb71d8260dae6d29af4962ecc9","unresolved":false,"context_lines":[{"line_number":1353,"context_line":"        for bdm in (test_swap, test_ephemeral):"},{"line_number":1354,"context_line":"            self.assertFalse(driver_block_device.is_block_device_mapping("},{"line_number":1355,"context_line":"                bdm._bdm_obj))"},{"line_number":1356,"context_line":""},{"line_number":1357,"context_line":"    def test_get_volume_create_az_cinder_cross_az_attach_true(self):"},{"line_number":1358,"context_line":"        # Tests  that we get None back if cinder.cross_az_attach\u003dTrue even if"},{"line_number":1359,"context_line":"        # the instance has an AZ assigned. Note that since cross_az_attach"}],"source_content_type":"text/x-python","patch_set":6,"id":"c1e93998_45978753","line":1356,"updated":"2023-08-25 06:49:21.000000000","message":"test_convert_volume\ntest_is_implemented\ntest_is_block_device_mapping\n\nabove uses swap_bdm_dict, but do not test swap.encrypted or any other added field","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"09fe7e3980fc01d0fb7c1b4f61bf48bc12e8a093","unresolved":true,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"            for fld, alias in test_bdm._update_on_save.items():"},{"line_number":406,"context_line":"                self.assertEqual(test_bdm[alias or fld],"},{"line_number":407,"context_line":"                                 getattr(test_bdm._bdm_obj, fld))"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"            # Then test read-only fields."},{"line_number":410,"context_line":"            for field in test_bdm._readonly_fields:"}],"source_content_type":"text/x-python","patch_set":12,"id":"002a844b_8d82a10b","line":407,"updated":"2024-02-26 17:15:11.000000000","message":"This is iterating through all fields except Enum and setting \u0027fake_changed_value\u0027 and then asserting that the \u0027fake_changed_value\u0027 has been saved to the objects.BlockDeviceMapping attribute _bdm_obj in DriverBlockDevice.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"09fe7e3980fc01d0fb7c1b4f61bf48bc12e8a093","unresolved":true,"context_lines":[{"line_number":416,"context_line":"                # Reset to original value so this already tested field won\u0027t"},{"line_number":417,"context_line":"                # be considered during the next save()."},{"line_number":418,"context_line":"                test_bdm[field] \u003d value"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"            save_mock.assert_called_once_with()"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        def check_save():"}],"source_content_type":"text/x-python","patch_set":12,"id":"ddb799e5_13314844","line":419,"updated":"2024-02-26 17:15:11.000000000","message":"And this is asserting that _readonly_fields raise AttributeError when you try to save() them.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"}],"nova/tests/unit/virt/test_virt.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"09fe7e3980fc01d0fb7c1b4f61bf48bc12e8a093","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        self.assertFalse(traits[os_traits.COMPUTE_IMAGE_TYPE_RAW])"},{"line_number":103,"context_line":"        self.assertFalse(traits[os_traits.COMPUTE_IMAGE_TYPE_VHD])"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def test_block_device_info_get_encrypted_disks(self):"},{"line_number":106,"context_line":"        block_device_info \u003d {"},{"line_number":107,"context_line":"            \u0027swap\u0027: {\u0027device_name\u0027: \u0027/dev/sdb\u0027, \u0027swap_size\u0027: 1},"},{"line_number":108,"context_line":"            \u0027image\u0027: ["}],"source_content_type":"text/x-python","patch_set":12,"id":"bc09e229_29b7985f","line":105,"updated":"2024-02-26 17:15:11.000000000","message":"I missed adding swap coverage to this test, that might be the main confusion for understanding this :(","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"}],"nova/virt/block_device.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"5d18ed87b0cf9ba691af36d1248d7d8c31e6e5dc","unresolved":true,"context_lines":[{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027])"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":225,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":226,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":227,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"419d6984_0ee1fb88","line":224,"updated":"2023-06-28 12:58:43.000000000","message":"Does \u0027encrypted\u0027: None should not be part of the _update_on_save dict too ?","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"99ed30c1cd16a7fc45eef595255056cda3c2d4d0","unresolved":true,"context_lines":[{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027])"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":225,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":226,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":227,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"b58b20cf_c093c694","line":224,"in_reply_to":"2151f209_7e5cd1e3","updated":"2023-08-08 20:46:15.000000000","message":"It would probably be clearer to make that more explicit instead of just silently not apply to the DB object. I was going to say making it readonly might work, because it looks like on L209 we only apply the changes if the value is different. Thus if the object had that field as readonly, then we\u0027d get an error if it was ever changed.\n\nRegardless, it might be worth a comment here so we don\u0027t end up with someone looking at a customer bug and saying \"huh, it\u0027s missing from the list ... well I can fix that!\"","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7d7faaaae490ba167f8742f823e3d9ee607a215b","unresolved":true,"context_lines":[{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027])"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":225,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":226,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":227,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"2151f209_7e5cd1e3","line":224,"in_reply_to":"419d6984_0ee1fb88","updated":"2023-06-28 20:50:31.000000000","message":"I followed the pattern of the previous encrypted DriverBlockDevice\u0027s which were added by someone (lyarwood) much more knowledgable than me before I picked up the work 😊 (I note them inline)\n\nBut as for why, my guess is it\u0027s not included because you can\u0027t (or don\u0027t want to allow) a change from encrypted\u003dTrue to encrypted\u003dFalse, for example, whereas you can change the other encryption related fields. So \u0027encrypted\u0027 is not in the list of fields that will get saved when save() is called.","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"67c5f9cfa1c529974c9c507c28e47fd055008fad","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027])"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":225,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":226,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":227,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"208b2d92_d284a926","line":224,"in_reply_to":"931425e8_13cca264","updated":"2023-08-25 01:09:33.000000000","message":"Done","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"40c8fb64d5f2967d6c72e10634f5965b75c6d22d","unresolved":true,"context_lines":[{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027])"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":225,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":226,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":227,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"931425e8_13cca264","line":224,"in_reply_to":"b58b20cf_c093c694","updated":"2023-08-09 03:24:26.000000000","message":"TBH I don\u0027t know for sure why Lee didn\u0027t include it but I can add a code comment with my guess. I think there\u0027s a fair chance I\u0027m right given that if someone changed it from encrypted\u003dTrue \u003d\u003e encrypted\u003dFalse, we\u0027re not going to decrypt the currently encrypted disk on the fly and similarly if encrypted\u003dFalse \u003d\u003e encrypted\u003dTrue, we\u0027re not going to encrypt the previously unencrypted disk on the fly.\n\nMaking the field read-only is a good idea I think. I\u0027ll add those when I respin soon.","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7d7faaaae490ba167f8742f823e3d9ee607a215b","unresolved":true,"context_lines":[{"line_number":262,"context_line":"    _update_on_save \u003d {"},{"line_number":263,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":264,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":265,"context_line":"        \u0027device_type\u0027: None,"},{"line_number":266,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":267,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":268,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9399ad8c_a80779d5","line":265,"updated":"2023-06-28 20:50:31.000000000","message":"Also not saving \u0027encrypted\u0027 here.","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"67c5f9cfa1c529974c9c507c28e47fd055008fad","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    _update_on_save \u003d {"},{"line_number":263,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":264,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":265,"context_line":"        \u0027device_type\u0027: None,"},{"line_number":266,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":267,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":268,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ae3b49f_b525058d","line":265,"in_reply_to":"9399ad8c_a80779d5","updated":"2023-08-25 01:09:33.000000000","message":"Done","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7d7faaaae490ba167f8742f823e3d9ee607a215b","unresolved":true,"context_lines":[{"line_number":300,"context_line":"    _update_on_save \u003d {"},{"line_number":301,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":302,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":303,"context_line":"        \u0027device_type\u0027: None,"},{"line_number":304,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":305,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":306,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da30700f_2a63f57f","line":303,"updated":"2023-06-28 20:50:31.000000000","message":"Also not saving \u0027encrypted\u0027 here.","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"67c5f9cfa1c529974c9c507c28e47fd055008fad","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    _update_on_save \u003d {"},{"line_number":301,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":302,"context_line":"        \u0027device_name\u0027: None,"},{"line_number":303,"context_line":"        \u0027device_type\u0027: None,"},{"line_number":304,"context_line":"        \u0027encryption_secret_uuid\u0027: None,"},{"line_number":305,"context_line":"        \u0027encryption_format\u0027: None,"},{"line_number":306,"context_line":"        \u0027encryption_options\u0027: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"20ec5763_0fa1cae3","line":303,"in_reply_to":"da30700f_2a63f57f","updated":"2023-08-25 01:09:33.000000000","message":"Done","commit_id":"a03db3bb1be9c105d5b33300c880b205a77efbc8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"6987fd539e9cd0cb71d8260dae6d29af4962ecc9","unresolved":true,"context_lines":[{"line_number":218,"context_line":"        \u0027encryption_format\u0027,"},{"line_number":219,"context_line":"        \u0027encryption_options\u0027"},{"line_number":220,"context_line":"    ])"},{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027]) | _new_only_fields"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"}],"source_content_type":"text/x-python","patch_set":6,"id":"84890562_2f282526","line":221,"updated":"2023-08-25 06:49:21.000000000","message":"can you please tell, why to have _new_only_fields,\nhow its different from having directly\n`\n  _fields \u003d {\u0027device_name\u0027,\n   \u0027disk_bus\u0027,\n   \u0027encrypted\u0027,\n   \u0027encryption_format\u0027,\n   \u0027encryption_options\u0027,\n   \u0027encryption_secret_uuid\u0027,\n   \u0027swap_size\u0027}`","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"17ebe55fac96b6b8843ec5b9c5d5b3193dbd1224","unresolved":true,"context_lines":[{"line_number":218,"context_line":"        \u0027encryption_format\u0027,"},{"line_number":219,"context_line":"        \u0027encryption_options\u0027"},{"line_number":220,"context_line":"    ])"},{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027]) | _new_only_fields"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"}],"source_content_type":"text/x-python","patch_set":6,"id":"aab0ff90_2c4d73f0","line":221,"in_reply_to":"84890562_2f282526","updated":"2023-08-26 01:27:45.000000000","message":"I dug through the git blame a bit and I _think_ _new_only_fields is no longer of use.\n\nBefore change I3895b61b436b9bb882477d2d1b3f4907f03b3b1c, we used to have to support an older version (v1) of the block device mapping format alongside the new format v2, and \"new only\" meant fields only available in v2 and not v1. That way we could convert v2 BDMs into v1 when necessary.\n\nBecause we no longer have to support BDM v1, I think we don\u0027t need to use the _new_only_fields concept anymore. I\u0027ll move these into _fields when I respin.","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"a5918ac13e5078371b3707e0e2e29c5fbb1ef7c7","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        \u0027encryption_format\u0027,"},{"line_number":219,"context_line":"        \u0027encryption_options\u0027"},{"line_number":220,"context_line":"    ])"},{"line_number":221,"context_line":"    _fields \u003d set([\u0027device_name\u0027, \u0027swap_size\u0027, \u0027disk_bus\u0027]) | _new_only_fields"},{"line_number":222,"context_line":"    _update_on_save \u003d {"},{"line_number":223,"context_line":"        \u0027disk_bus\u0027: None,"},{"line_number":224,"context_line":"        \u0027device_name\u0027: None,"}],"source_content_type":"text/x-python","patch_set":6,"id":"28bbdf26_3defbc82","line":221,"in_reply_to":"aab0ff90_2c4d73f0","updated":"2023-08-26 05:50:07.000000000","message":"Ack, thanks","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"6987fd539e9cd0cb71d8260dae6d29af4962ecc9","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            \u0027encryption_options\u0027: self._bdm_obj.encryption_options"},{"line_number":244,"context_line":"        })"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def save(self):"},{"line_number":247,"context_line":"        if (\u0027encrypted\u0027 in self and"},{"line_number":248,"context_line":"                self[\u0027encrypted\u0027] !\u003d getattr(self._bdm_obj, \u0027encrypted\u0027)):"},{"line_number":249,"context_line":"            raise AttributeError(\"can\u0027t set read-only attribute: \u0027encrypted\u0027\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"b1326b39_2fd8a2a6","line":246,"updated":"2023-08-25 06:49:21.000000000","message":"reason of adding this save is earlier (now as well) DriverSwapBlockDevice inherting save of  DriverBlockDevice. and it was saving all attributes of bdm.\nhere check is if old_encrypted !\u003d self.new_encrypted, then do not save.","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"a5918ac13e5078371b3707e0e2e29c5fbb1ef7c7","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            if self[attr_name] !\u003d getattr(self._bdm_obj, attr_name):"},{"line_number":210,"context_line":"                raise AttributeError("},{"line_number":211,"context_line":"                    f\"can\u0027t set read-only attribute: \u0027{attr_name}\u0027\")"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        for attr_name, key_name in self._update_on_save.items():"},{"line_number":214,"context_line":"            lookup_name \u003d key_name or attr_name"},{"line_number":215,"context_line":"            if self[lookup_name] !\u003d getattr(self._bdm_obj, attr_name):"}],"source_content_type":"text/x-python","patch_set":7,"id":"96828f67_4485f507","line":212,"updated":"2023-08-26 05:50:07.000000000","message":"+1","commit_id":"c57a10f8366c3e57e0c67e732a61f940953e44fa"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bfd18c6c4a6ba6e37edd00ea0c8f05b7203bddb2","unresolved":true,"context_lines":[{"line_number":207,"context_line":"    def save(self):"},{"line_number":208,"context_line":"        for attr_name in self._readonly_fields:"},{"line_number":209,"context_line":"            if self[attr_name] !\u003d getattr(self._bdm_obj, attr_name):"},{"line_number":210,"context_line":"                raise AttributeError("},{"line_number":211,"context_line":"                    f\"can\u0027t set read-only attribute: \u0027{attr_name}\u0027\")"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        for attr_name, key_name in self._update_on_save.items():"}],"source_content_type":"text/x-python","patch_set":12,"id":"ce93a4c5_7ff03e75","line":210,"range":{"start_line":210,"start_character":22,"end_line":210,"end_character":36},"updated":"2024-02-26 16:53:18.000000000","message":"This kinda feels like the wrong exception to raise. I know it kinda makes sense if you look at the implementation here because save() is copying attributes to another object and we\u0027re calling those readonly. However I think people generally don\u0027t expect an AttributeError when calling a method, unless that method doesn\u0027t exist (and thus the AttributeError is for the missing method attribute itself).","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80218ad59c4770533229a0098d3b22a37ba1e9ed","unresolved":true,"context_lines":[{"line_number":207,"context_line":"    def save(self):"},{"line_number":208,"context_line":"        for attr_name in self._readonly_fields:"},{"line_number":209,"context_line":"            if self[attr_name] !\u003d getattr(self._bdm_obj, attr_name):"},{"line_number":210,"context_line":"                raise AttributeError("},{"line_number":211,"context_line":"                    f\"can\u0027t set read-only attribute: \u0027{attr_name}\u0027\")"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        for attr_name, key_name in self._update_on_save.items():"}],"source_content_type":"text/x-python","patch_set":12,"id":"195ebaa2_0623049a","line":210,"range":{"start_line":210,"start_character":22,"end_line":210,"end_character":36},"in_reply_to":"43b1949f_6b0f2878","updated":"2024-02-26 17:30:13.000000000","message":"ValueError doesn\u0027t really feel right to me either, although it\u0027s better than AttributeError. I think something custom, or re-using one of the existing BDMish exceptions seems better to me.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"09fe7e3980fc01d0fb7c1b4f61bf48bc12e8a093","unresolved":true,"context_lines":[{"line_number":207,"context_line":"    def save(self):"},{"line_number":208,"context_line":"        for attr_name in self._readonly_fields:"},{"line_number":209,"context_line":"            if self[attr_name] !\u003d getattr(self._bdm_obj, attr_name):"},{"line_number":210,"context_line":"                raise AttributeError("},{"line_number":211,"context_line":"                    f\"can\u0027t set read-only attribute: \u0027{attr_name}\u0027\")"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        for attr_name, key_name in self._update_on_save.items():"}],"source_content_type":"text/x-python","patch_set":12,"id":"43b1949f_6b0f2878","line":210,"range":{"start_line":210,"start_character":22,"end_line":210,"end_character":36},"in_reply_to":"ce93a4c5_7ff03e75","updated":"2024-02-26 17:15:11.000000000","message":"Hm, yeah. I see your point. Maybe ValueError? Or create a new exception entirely..","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"}],"nova/virt/driver.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5b510a1d767ec257bbe58552110cf455c04a0e6b","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        driver_bdm for driver_bdm in itertools.chain("},{"line_number":119,"context_line":"            block_device_info.get(\u0027image\u0027, []),"},{"line_number":120,"context_line":"            block_device_info.get(\u0027ephemerals\u0027, []),"},{"line_number":121,"context_line":"            swap,"},{"line_number":122,"context_line":"        )"},{"line_number":123,"context_line":"        if driver_bdm.get(\u0027encrypted\u0027)"},{"line_number":124,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":12,"id":"c9fe2f42_a4543469","line":121,"updated":"2024-02-23 10:31:22.000000000","message":"This whole thing, IIUC, is returning another object with a swap, so we test it.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"09fe7e3980fc01d0fb7c1b4f61bf48bc12e8a093","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        driver_bdm for driver_bdm in itertools.chain("},{"line_number":119,"context_line":"            block_device_info.get(\u0027image\u0027, []),"},{"line_number":120,"context_line":"            block_device_info.get(\u0027ephemerals\u0027, []),"},{"line_number":121,"context_line":"            swap,"},{"line_number":122,"context_line":"        )"},{"line_number":123,"context_line":"        if driver_bdm.get(\u0027encrypted\u0027)"},{"line_number":124,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":12,"id":"21979994_a61ffff7","line":121,"in_reply_to":"c9fe2f42_a4543469","updated":"2024-02-26 17:15:11.000000000","message":"Yeah, given a list of BDMs this will filter out any that are encrypted (encrypted\u003dTrue) and previous to this patch, it was only considering types DriverImageBlockDevice and DriverEphemeralBlockDevice. With this patch, we will also include DriverSwapBlockDevice as a possibility for encrypted disk.","commit_id":"eb4e0faf2de11c5cfa9f8a1f435aff041f5f2324"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"6987fd539e9cd0cb71d8260dae6d29af4962ecc9","unresolved":true,"context_lines":[{"line_number":4841,"context_line":"        if swap_mb \u003e 0:"},{"line_number":4842,"context_line":"            size \u003d swap_mb * units.Mi"},{"line_number":4843,"context_line":"            disk_info_mapping \u003d disk_mapping[\u0027disk.swap\u0027]"},{"line_number":4844,"context_line":"            swap \u003d image(\u0027disk.swap\u0027, disk_info_mapping\u003ddisk_info_mapping)"},{"line_number":4845,"context_line":"            # Short circuit the exists() tests if we already created a disk"},{"line_number":4846,"context_line":"            created_disks \u003d created_disks or not swap.exists()"},{"line_number":4847,"context_line":"            swap.cache(fetch_func\u003dself._create_swap, context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f16d350_1fe3a578","line":4844,"updated":"2023-08-25 06:49:21.000000000","message":"can you please tell, how this helps?","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0ae0cd527918d471326c00b21e9dc8909412c9c7","unresolved":true,"context_lines":[{"line_number":4841,"context_line":"        if swap_mb \u003e 0:"},{"line_number":4842,"context_line":"            size \u003d swap_mb * units.Mi"},{"line_number":4843,"context_line":"            disk_info_mapping \u003d disk_mapping[\u0027disk.swap\u0027]"},{"line_number":4844,"context_line":"            swap \u003d image(\u0027disk.swap\u0027, disk_info_mapping\u003ddisk_info_mapping)"},{"line_number":4845,"context_line":"            # Short circuit the exists() tests if we already created a disk"},{"line_number":4846,"context_line":"            created_disks \u003d created_disks or not swap.exists()"},{"line_number":4847,"context_line":"            swap.cache(fetch_func\u003dself._create_swap, context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"609c2cc1_74aa52bd","line":4844,"in_reply_to":"3f16d350_1fe3a578","updated":"2023-09-22 23:26:56.000000000","message":"Sorry, I must have missed this comment last time. What do you mean, like why there\u0027s an intermediate variable? No particular reason.. the code would span two lines either way but I could have written instead:\n```\nswap \u003d image(\n    \u0027disk.swap\u0027, disk_info_mapping\u003ddisk_mapping[\u0027disk.swap\u0027])\n```\nIf you are asking why to pass `disk_info_mapping`, it\u0027s because that\u0027s where encryption attributes such as the format and secret are kept at the driver level. The `Image` object will need it in order to encrypt/decrypt the disk.","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"2efcd59560b474799540525562b8c4c3bbad7398","unresolved":false,"context_lines":[{"line_number":4841,"context_line":"        if swap_mb \u003e 0:"},{"line_number":4842,"context_line":"            size \u003d swap_mb * units.Mi"},{"line_number":4843,"context_line":"            disk_info_mapping \u003d disk_mapping[\u0027disk.swap\u0027]"},{"line_number":4844,"context_line":"            swap \u003d image(\u0027disk.swap\u0027, disk_info_mapping\u003ddisk_info_mapping)"},{"line_number":4845,"context_line":"            # Short circuit the exists() tests if we already created a disk"},{"line_number":4846,"context_line":"            created_disks \u003d created_disks or not swap.exists()"},{"line_number":4847,"context_line":"            swap.cache(fetch_func\u003dself._create_swap, context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"8889d459_b23e1e6f","line":4844,"in_reply_to":"609c2cc1_74aa52bd","updated":"2023-09-26 14:32:17.000000000","message":"yes second one, why to send it to Image w.r.t encryption\nI believe in imagebackend, it will go Flat.Image()\nhttps://review.opendev.org/c/openstack/nova/+/884312/6/nova/virt/libvirt/imagebackend.py#118, but still, could not figure out how its helpful for encryption.\n\nbut now I think its more about knowing/understanding imagebackend w.r.t to any disk, which might be more detailed answer for here.\nthanks for reply.","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"e6728d5fc32863b6cd1536d42b8805e3d4f591b0","unresolved":false,"context_lines":[{"line_number":4841,"context_line":"        if swap_mb \u003e 0:"},{"line_number":4842,"context_line":"            size \u003d swap_mb * units.Mi"},{"line_number":4843,"context_line":"            disk_info_mapping \u003d disk_mapping[\u0027disk.swap\u0027]"},{"line_number":4844,"context_line":"            swap \u003d image(\u0027disk.swap\u0027, disk_info_mapping\u003ddisk_info_mapping)"},{"line_number":4845,"context_line":"            # Short circuit the exists() tests if we already created a disk"},{"line_number":4846,"context_line":"            created_disks \u003d created_disks or not swap.exists()"},{"line_number":4847,"context_line":"            swap.cache(fetch_func\u003dself._create_swap, context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1eed4bb5_9f1096a9","line":4844,"in_reply_to":"8889d459_b23e1e6f","updated":"2023-09-27 16:47:47.000000000","message":"Where it goes depends on the setting for `CONF.libvirt.images_type` [1]. It will go to `Flat.Image` if `CONF.libvirt.images_type \u003d raw` and it will go to `Qcow2.Image` if `CONF.libvirt.images_type \u003d qcow2`, for example.\n\nI also realized the reason it\u0027s unclear in this patch is because this is a \"setup\" patch to lay the groundwork for the rest of the series, similar to [2] for the other disk types. So what\u0027s added here isn\u0027t actually used until the next patches:\n\n* https://review.opendev.org/c/openstack/nova/+/826754/20/nova/virt/libvirt/driver.py#4383\n* https://review.opendev.org/c/openstack/nova/+/870932/13/nova/virt/libvirt/imagebackend.py#545\n\nThe encryption format and secret/passphrase will be added to the driver BDMS, which are contained in the `disk_info_mapping` and the `disk_info_mapping` is stored in `Image` for retrieval of the encryption attributes. And because `Image` is the abstraction over the disks, it can directly pass the encryption attributes to lower level functions like `qemu-image convert` etc.\n\nHope this helps to make it more clear.\n\n[1] https://github.com/openstack/nova/blob/87d4807/nova/virt/libvirt/imagebackend.py#L1342\n[2] https://review.opendev.org/c/openstack/nova/+/826528","commit_id":"fd1340ef96916c6535879c52002878aa3b5a13b8"}]}
