)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"2e22b9911723cb97f16d42a0b142103702a68c36","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Taketani Ryo \u003ctaketani.ryo@fujitsu.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-21 09:57:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: fix SEV-specific requirement checks for VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, correct"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"59e0e78f_cef86377","line":7,"range":{"start_line":7,"start_character":9,"end_line":7,"end_character":12},"updated":"2025-11-27 15:04:14.000000000","message":"(super nit) Be the way \"fix\" and \"correct\" indicate something is wrong while this is just a refactoring and sounds a bit odd in this context.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Taketani Ryo \u003ctaketani.ryo@fujitsu.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-21 09:57:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: fix SEV-specific requirement checks for VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, correct"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"97773788_c2cac147","line":7,"range":{"start_line":7,"start_character":9,"end_line":7,"end_character":12},"in_reply_to":"569c2bda_b358463f","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Taketani Ryo \u003ctaketani.ryo@fujitsu.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-11-21 09:57:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: fix SEV-specific requirement checks for VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, correct"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"569c2bda_b358463f","line":7,"range":{"start_line":7,"start_character":9,"end_line":7,"end_character":12},"in_reply_to":"59e0e78f_cef86377","updated":"2025-12-08 08:32:36.000000000","message":"I fixed a commit message","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: stop using _get_mem_encryption_config() for SEV checks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, reconsider"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"},{"line_number":11,"context_line":"sometimes used for checking if the VM is secured by SEV instead of getting"},{"line_number":12,"context_line":"the configuration of specific memory encryption technology."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"e369a487_88d54326","line":9,"updated":"2025-12-08 15:54:21.000000000","message":"Please wrap lines at 72 characters.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: stop using _get_mem_encryption_config() for SEV checks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, reconsider"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"},{"line_number":11,"context_line":"sometimes used for checking if the VM is secured by SEV instead of getting"},{"line_number":12,"context_line":"the configuration of specific memory encryption technology."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"94161354_46f5f19f","line":9,"in_reply_to":"49e12121_05102882","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"fb07dac7133199e9b3a91835cf7823f04b71f991","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: stop using _get_mem_encryption_config() for SEV checks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, reconsider"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"},{"line_number":11,"context_line":"sometimes used for checking if the VM is secured by SEV instead of getting"},{"line_number":12,"context_line":"the configuration of specific memory encryption technology."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"49e12121_05102882","line":9,"in_reply_to":"e369a487_88d54326","updated":"2025-12-12 09:42:51.000000000","message":"I\u0027ve checked and revised the commit messages across this series of commits.","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"fb07dac7133199e9b3a91835cf7823f04b71f991","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"mem-enc: stop using _get_mem_encryption_config() for SEV checks"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prior to adding support for other mem_encryption implementations, reconsider"},{"line_number":10,"context_line":"the usage of LibvirtDriver._get_mem_encryption_config(). The function is"},{"line_number":11,"context_line":"sometimes used for checking if the VM is secured by SEV instead of getting"},{"line_number":12,"context_line":"the configuration of specific memory encryption technology."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"10a4a69e_b7254018","line":9,"in_reply_to":"e369a487_88d54326","updated":"2025-12-12 09:42:51.000000000","message":"Updated commit messages","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"8a0fba26e63bfc10fdbbfbfc54d4c01e112f445c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"676b134f_8e01a261","updated":"2025-11-27 03:24:01.000000000","message":"recheck","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7cfa81dafe76b19277c24d672b9e107eaa341c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"697d09df_087ca5b9","updated":"2025-12-15 16:07:56.000000000","message":"Thanks for the updates. The change looks almost good to me but I have a few more suggestions I noticed late.","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"825286b01be07c0a0ef85dfa8205bb7d5c89253c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"22b65089_a3248dbf","updated":"2026-01-17 18:29:56.000000000","message":"Just a small typing nit but overall looks OK","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7c5f0a64e112910e933df59f9cbb96e57c220aaa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"290bd234_4c30219e","updated":"2026-01-13 10:50:53.000000000","message":"first look but I\u0027ll do a few more review cycles","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"639e0db51b91689bc48c19030fed1f39fff8667c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"1c390999_d511c53b","updated":"2026-01-22 09:26:36.000000000","message":"I noticed that a patch for [replacing objects from typing with literals](https://github.com/openstack/nova/commit/e785ab52dc77bae29e70be1b928483228af34ce9) has recently been merged.\n\nMy patch also contained parts that utilized typing.Union. So, I have updated my patch to align this patch.","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a97170bd5564d5ae675366cbc92286f66b583fdd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"da771ea6_1e7f8469","updated":"2026-02-03 17:20:00.000000000","message":"This patch looks good to me.\nI have just a super small nit.","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"9296494ae035489b54bf5c8056226760561cf937","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3e44c24e_3f4bd193","updated":"2026-01-30 01:47:14.000000000","message":"recheck bug #2121941","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"c4eb13a0_30184c00","updated":"2026-02-26 15:38:39.000000000","message":"I still have a bit of concerns but those can be addressed in later follow-ups.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"fda78f9a356b7cfac1b0e7912f6ad8f0b6fed74a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"80f97fcf_a22bf903","updated":"2026-02-19 15:44:46.000000000","message":"LGTM thx.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bd49fddf44a0e44cadc1caca1edaeadb5f58e2bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"4551e0ac_58fad8ec","updated":"2026-02-24 17:31:12.000000000","message":"Looks good to me. Thanks!","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"5a5244893a7ab2bbb7fd88e57960df97a91dc9d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"f68c6c81_5f3726ef","updated":"2026-02-20 00:58:37.000000000","message":"recheck grenade-skip-level-always failed due to missing pkg resource","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"86033790ca9814eec83f3994d6120b7973ed6fc1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"036ba9d2_ea50c456","updated":"2026-03-05 14:04:04.000000000","message":"-1 for consistency of appoarches","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a42cdc0fcbf7a2b68ec3f6e1a3304345e172f3c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d2d7c9d6_334c15cd","updated":"2026-03-31 16:33:09.000000000","message":"@anton.iacobaeus@canarybit.eu @masahito.muroi@linecorp.com Hi folks I know you are interested to work on features top of this refactor series (intel TDX, and SEV-SNP). Could you please take a look that this refactor series makes sense for your work?","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8342ed25d84214388ea1d991e3dd7a199e0affa4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"f4ba96b6_0690c78a","updated":"2026-04-02 15:39:36.000000000","message":"Looks good to me. All my remaining comments can be done in a follow up, they are not affecting the usage of the code in question.\n\nI\u0027m holding +W:\n* as I\u0027m reviewing the whole series\n* also to give chance to the devs working on SEV-SNP, and Intel TDX support to check out this refactor as they expected to build on top of it.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"88531e31a3b8c526b361526cb0994a46ae6a0874","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"15a3250b_5700a153","updated":"2026-03-19 17:53:37.000000000","message":"Still +1","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"33e31df47d5cad39c31379e650ac6d57034e67c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"6b324b07_d6ab8f95","updated":"2026-03-09 00:24:35.000000000","message":"recheck Zuul failed due to missing config format","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"46bd504d4ffaedc6a29490bce8207ea633572986","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"6ef4c5fa_bac11334","in_reply_to":"0811a7b8_56b95e36","updated":"2026-04-13 04:48:56.000000000","message":"Thank you for checking, all.\n\nRegarding [the latest patch](https://review.opendev.org/c/openstack/nova/+/971300/2/releasenotes/notes/mem-encryption-locked-memory-conflict-643b646a05e76589.yaml#7), I have entered it as [an discussion item at the next PTG](https://etherpad.opendev.org/p/nova-2026.2-ptg#L184), and I would like to resume it after the policy has been discussed there.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6265b3b6e4b0c1f836b4dc49c83432efe7baed2a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"805ebd31_dafcb73b","in_reply_to":"54779e3b_91025a95","updated":"2026-04-02 14:37:33.000000000","message":"cool. Thanks.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":8878,"name":"Masahito Muroi","email":"masahito.muroi@linecorp.com","username":"masa"},"change_message_id":"d7635d8b4c30c0eb6aa115a515a5d5e588b5a0fd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"822cacda_fdfd9ad6","in_reply_to":"805ebd31_dafcb73b","updated":"2026-04-06 05:41:13.000000000","message":"FYI: we\u0027re testing if the refactored code with our amd-snp extension works or not in our amd server. please wait the test result few days.\n\nFor the refactoring code patches, it looks fine from the python coding style perspective. But for the locked-memory we also have same concerns for the existing vm which launched before the change. The test includes the behavior check as well. https://review.opendev.org/c/openstack/nova/+/971300/12","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35587,"name":"Hiroki Narukawa","email":"hnarukaw@lycorp.co.jp","username":"nhirokinet"},"change_message_id":"9a34398eb16e999f4f1318681dde9fc712682933","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"f141e230_a2d7bd7c","in_reply_to":"822cacda_fdfd9ad6","updated":"2026-04-08 09:45:23.000000000","message":"Thank you for mention, we are preparing code for SEV-SNP, and I\u0027ve just tested including this patch as well as https://review.opendev.org/c/openstack/nova/+/971300 .\nAfter cherry-picking these 2 patches and resolving small conflict, our code still worked. This did not require flavor or image change to us as this code does not rise if locked_memory is not specified from image or flavor.\nThus this does not prevent our SEV-SNP code preparation. Thank you!","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":8878,"name":"Masahito Muroi","email":"masahito.muroi@linecorp.com","username":"masa"},"change_message_id":"4c06d8896da7dcb165c5ddeefffca9f31d48cb07","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"54779e3b_91025a95","in_reply_to":"86504a10_da59d62f","updated":"2026-04-01 06:34:09.000000000","message":"@gibizer@gmail.com thanks for letting know us. let us check the patch seriese. @hnarukaw@lycorp.co.jp is a member who works on the sev-snp itself, so he will reply this.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"15330f5bc55982f74271e7a0afaf85178e9af7e5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"6b669d0a_a6f1a4ff","in_reply_to":"bbcbe1e8_4eb6cb6e","updated":"2026-04-03 07:55:52.000000000","message":"Thank you for your reviewing. I addressed your remaining comments in [the new follow-up patch](https://review.opendev.org/c/openstack/nova/+/983278) in order not to prevent existing patches from merging.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c622395a4f038986dcc53d22dcd2d7c09e725c3b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"86504a10_da59d62f","in_reply_to":"d2d7c9d6_334c15cd","updated":"2026-03-31 16:34:51.000000000","message":"@markus.hentsch@cloudandheat.com as well based on the ML","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e159343e026084279b5860de5fcacd55849cec86","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0811a7b8_56b95e36","in_reply_to":"f141e230_a2d7bd7c","updated":"2026-04-10 07:51:49.000000000","message":"Thanks for checking it out.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db15d397f6ff3743ad6c4a1a2dec54310219b710","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bbcbe1e8_4eb6cb6e","in_reply_to":"f4ba96b6_0690c78a","updated":"2026-04-02 16:30:48.000000000","message":"I finished reviewing the refactoring series and all looks mergeable to me. The nits here and in later patches can be fixed in a follow up. I keep holding my +W for others to chime in.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"06fb406f56d5f0d8d9b8322abf6bf2ef3c2afe30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"2cb24940_d4d84ec2","updated":"2026-04-13 04:39:45.000000000","message":"recheck failed to connect mirrors\nhttps://zuul.opendev.org/t/openstack/build/e0d1548b8b7a4781b95715dc99390d6a","commit_id":"a04c92378d1749120fcd779ff87368922acff03f"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"86835320628cd87c2834ee64aa7b3647f3922041","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"27953b10_3a78d04f","updated":"2026-04-14 01:33:56.000000000","message":"recheck openstack-tox-cover ci timeout","commit_id":"a04c92378d1749120fcd779ff87368922acff03f"}],"nova/virt/hardware.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b62e38c6743a0b2ab37443c26a46f29f82b7f4b4","unresolved":true,"context_lines":[{"line_number":48,"context_line":"    model: str"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class MemEncryptionConfig(ty.NamedTuple):"},{"line_number":52,"context_line":"    model: ty.Optional[str] \u003d None"},{"line_number":53,"context_line":"    needs_iommu: bool \u003d True"},{"line_number":54,"context_line":"    needs_virtio_serial: bool \u003d True"}],"source_content_type":"text/x-python","patch_set":1,"id":"f4e7128c_f34af195","line":51,"range":{"start_line":51,"start_character":29,"end_line":51,"end_character":39},"updated":"2025-11-27 14:59:26.000000000","message":"If we aim to add further inheritance then IMO we should stop using NamedTuple and just use a class.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    model: str"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class MemEncryptionConfig(ty.NamedTuple):"},{"line_number":52,"context_line":"    model: ty.Optional[str] \u003d None"},{"line_number":53,"context_line":"    needs_iommu: bool \u003d True"},{"line_number":54,"context_line":"    needs_virtio_serial: bool \u003d True"}],"source_content_type":"text/x-python","patch_set":1,"id":"77e0ca33_a036c362","line":51,"range":{"start_line":51,"start_character":29,"end_line":51,"end_character":39},"in_reply_to":"1a1e5766_24bcdfcb","updated":"2025-12-08 15:54:21.000000000","message":"Done","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":48,"context_line":"    model: str"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class MemEncryptionConfig(ty.NamedTuple):"},{"line_number":52,"context_line":"    model: ty.Optional[str] \u003d None"},{"line_number":53,"context_line":"    needs_iommu: bool \u003d True"},{"line_number":54,"context_line":"    needs_virtio_serial: bool \u003d True"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a1e5766_24bcdfcb","line":51,"range":{"start_line":51,"start_character":29,"end_line":51,"end_character":39},"in_reply_to":"f4e7128c_f34af195","updated":"2025-12-08 08:32:36.000000000","message":"I\u0027ve updated the code to use a regular class instead of NamedTuple","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"25480d482aa0aefb8f62e2478dd23b9cb003c30e","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class MemEncryptionConfig(ty.NamedTuple):"},{"line_number":52,"context_line":"    model: ty.Optional[str] \u003d None"},{"line_number":53,"context_line":"    needs_iommu: bool \u003d True"},{"line_number":54,"context_line":"    needs_virtio_serial: bool \u003d True"},{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"b06b3b8e_c389131a","line":53,"range":{"start_line":53,"start_character":4,"end_line":53,"end_character":15},"updated":"2025-11-27 14:39:10.000000000","message":"Note that we can drop this once https://review.opendev.org/c/openstack/nova/+/909635 is merged and I prefer that direction instead of complicating the logic now.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class MemEncryptionConfig(ty.NamedTuple):"},{"line_number":52,"context_line":"    model: ty.Optional[str] \u003d None"},{"line_number":53,"context_line":"    needs_iommu: bool \u003d True"},{"line_number":54,"context_line":"    needs_virtio_serial: bool \u003d True"},{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c18b690b_24655dee","line":53,"range":{"start_line":53,"start_character":4,"end_line":53,"end_character":15},"in_reply_to":"4e0bbfb2_ab0a697f","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class MemEncryptionConfig(ty.NamedTuple):"},{"line_number":52,"context_line":"    model: ty.Optional[str] \u003d None"},{"line_number":53,"context_line":"    needs_iommu: bool \u003d True"},{"line_number":54,"context_line":"    needs_virtio_serial: bool \u003d True"},{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"4e0bbfb2_ab0a697f","line":53,"range":{"start_line":53,"start_character":4,"end_line":53,"end_character":15},"in_reply_to":"b06b3b8e_c389131a","updated":"2025-12-08 08:32:36.000000000","message":"To avoid complicating the logic and the upcoming merge of https://review.opendev.org/c/openstack/nova/+/909635, I\u0027ve backed out the part.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"25480d482aa0aefb8f62e2478dd23b9cb003c30e","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def create(cls, model: str):"},{"line_number":59,"context_line":"        if model \u003d\u003d fields.MemEncryptionModel.AMD_SEV:"},{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f7742d18_66b88c68","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":32},"updated":"2025-11-27 14:39:10.000000000","message":"This does not really have to be a class method. Can we create a dedicated method instead ? Also add return type.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b62e38c6743a0b2ab37443c26a46f29f82b7f4b4","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def create(cls, model: str):"},{"line_number":59,"context_line":"        if model \u003d\u003d fields.MemEncryptionModel.AMD_SEV:"},{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"de5163c6_1fd1464b","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":32},"in_reply_to":"3878c05d_519b9377","updated":"2025-11-27 14:59:26.000000000","message":"\u003e Also, if we do not leverage type then what\u0027s the point of creating subclasses. Can\u0027t we just use MemEncryptionConfig directly with model (and required_trait later) filled ?\n\nIgnore this. I see you aimed to add check methods in the later change.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def create(cls, model: str):"},{"line_number":59,"context_line":"        if model \u003d\u003d fields.MemEncryptionModel.AMD_SEV:"},{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"b76bb365_ad47657a","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":32},"in_reply_to":"7c8d67dc_302fb65f","updated":"2025-12-08 15:54:21.000000000","message":"Yeah this is what I expected.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def create(cls, model: str):"},{"line_number":59,"context_line":"        if model \u003d\u003d fields.MemEncryptionModel.AMD_SEV:"},{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7c8d67dc_302fb65f","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":32},"in_reply_to":"de5163c6_1fd1464b","updated":"2025-12-08 08:32:36.000000000","message":"\u003e This does not really have to be a class method. Can we create a dedicated method instead ? Also add return type.\n\nI\u0027ve refactored `hardware.MemEncryptionConfig.create()` into a dedicated method, `hardware.get_mem_encryption_config()`. (Please let me know if my understanding doesn\u0027t align with your intent)","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c38e78ae89ce955a5bc1bec217da162328b7219f","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def create(cls, model: str):"},{"line_number":59,"context_line":"        if model \u003d\u003d fields.MemEncryptionModel.AMD_SEV:"},{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3878c05d_519b9377","line":58,"range":{"start_line":58,"start_character":4,"end_line":58,"end_character":32},"in_reply_to":"f7742d18_66b88c68","updated":"2025-11-27 14:40:34.000000000","message":"Also, if we do not leverage type then what\u0027s the point of creating subclasses. Can\u0027t we just use MemEncryptionConfig directly with model (and required_trait later) filled ?","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"25480d482aa0aefb8f62e2478dd23b9cb003c30e","unresolved":true,"context_lines":[{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"},{"line_number":62,"context_line":"            return MemEncryptionConfigSevEs()"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            raise exception.Invalid("},{"line_number":65,"context_line":"                \"memory encryption model %s unknown.\" % model)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fc36b700_43cf67ef","line":65,"range":{"start_line":63,"start_character":13,"end_line":65,"end_character":62},"updated":"2025-11-27 14:39:10.000000000","message":"I\u0027m inclined to say that we don\u0027t need this last-fallback because we have no real case where model can be an unknown value but I have no strong opinion here.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"},{"line_number":62,"context_line":"            return MemEncryptionConfigSevEs()"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            raise exception.Invalid("},{"line_number":65,"context_line":"                \"memory encryption model %s unknown.\" % model)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0b80d119_0cced448","line":65,"range":{"start_line":63,"start_character":13,"end_line":65,"end_character":62},"in_reply_to":"0da78015_d07a37da","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"fb07dac7133199e9b3a91835cf7823f04b71f991","unresolved":true,"context_lines":[{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"},{"line_number":62,"context_line":"            return MemEncryptionConfigSevEs()"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            raise exception.Invalid("},{"line_number":65,"context_line":"                \"memory encryption model %s unknown.\" % model)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0da78015_d07a37da","line":65,"range":{"start_line":63,"start_character":13,"end_line":65,"end_character":62},"in_reply_to":"b2091e92_ffe9cd30","updated":"2025-12-12 09:42:51.000000000","message":"As you suggested, I\u0027ve moved the exception in https://review.opendev.org/c/openstack/nova/+/967970/2/nova/virt/hardware.py#1306 into the method `get_mem_encryption_config` to avoid duplicate checks.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":true,"context_lines":[{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"},{"line_number":62,"context_line":"            return MemEncryptionConfigSevEs()"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            raise exception.Invalid("},{"line_number":65,"context_line":"                \"memory encryption model %s unknown.\" % model)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b2091e92_ffe9cd30","line":65,"range":{"start_line":63,"start_character":13,"end_line":65,"end_character":62},"in_reply_to":"d6c59221_85a53770","updated":"2025-12-08 15:54:21.000000000","message":"We already check the same in https://review.opendev.org/c/openstack/nova/+/967970/2/nova/virt/hardware.py#1306 . Can we move that logic into this method so that we avoid duplicate check ? (and keep the same error message)","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":60,"context_line":"            return MemEncryptionConfigSev()"},{"line_number":61,"context_line":"        elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"},{"line_number":62,"context_line":"            return MemEncryptionConfigSevEs()"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            raise exception.Invalid("},{"line_number":65,"context_line":"                \"memory encryption model %s unknown.\" % model)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":1,"id":"d6c59221_85a53770","line":65,"range":{"start_line":63,"start_character":13,"end_line":65,"end_character":62},"in_reply_to":"fc36b700_43cf67ef","updated":"2025-12-08 08:32:36.000000000","message":"I keep this exception code to ensure consistency between updates to `MemEncryptionModel` and `MemEncryptionConfig`","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":true,"context_lines":[{"line_number":11,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from abc import ABC"},{"line_number":16,"context_line":"from abc import abstractmethod"},{"line_number":17,"context_line":"import collections"},{"line_number":18,"context_line":"import itertools"},{"line_number":19,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":2,"id":"74afd61f_eab7b32c","line":16,"range":{"start_line":14,"start_character":1,"end_line":16,"end_character":30},"updated":"2025-12-08 15:54:21.000000000","message":"Can we import abc instead, following the existing implementation ?","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"fb07dac7133199e9b3a91835cf7823f04b71f991","unresolved":true,"context_lines":[{"line_number":11,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from abc import ABC"},{"line_number":16,"context_line":"from abc import abstractmethod"},{"line_number":17,"context_line":"import collections"},{"line_number":18,"context_line":"import itertools"},{"line_number":19,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":2,"id":"dbd56ec4_5cfa0e82","line":16,"range":{"start_line":14,"start_character":1,"end_line":16,"end_character":30},"in_reply_to":"74afd61f_eab7b32c","updated":"2025-12-12 09:42:51.000000000","message":"Revised as suggested","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from abc import ABC"},{"line_number":16,"context_line":"from abc import abstractmethod"},{"line_number":17,"context_line":"import collections"},{"line_number":18,"context_line":"import itertools"},{"line_number":19,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":2,"id":"d7e9a2ae_c0ec2d07","line":16,"range":{"start_line":14,"start_character":1,"end_line":16,"end_character":30},"in_reply_to":"dbd56ec4_5cfa0e82","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":true,"context_lines":[{"line_number":50,"context_line":"    model: str"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class MemEncryptionConfig(ABC):"},{"line_number":54,"context_line":"    def __init__(self, model: ty.Optional[str] \u003d None):"},{"line_number":55,"context_line":"        self._model \u003d model"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"851b42b5_6ee50a0a","line":53,"updated":"2025-12-08 15:54:21.000000000","message":"```suggestion\nclass MemEncryptionConfig(metaclass\u003dabc.ABCMeta):\n```\n\nis preferred, AFAIK.","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    model: str"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class MemEncryptionConfig(ABC):"},{"line_number":54,"context_line":"    def __init__(self, model: ty.Optional[str] \u003d None):"},{"line_number":55,"context_line":"        self._model \u003d model"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa71d67_07d4cb1e","line":53,"in_reply_to":"54f54e53_d99f9edc","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"fb07dac7133199e9b3a91835cf7823f04b71f991","unresolved":true,"context_lines":[{"line_number":50,"context_line":"    model: str"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class MemEncryptionConfig(ABC):"},{"line_number":54,"context_line":"    def __init__(self, model: ty.Optional[str] \u003d None):"},{"line_number":55,"context_line":"        self._model \u003d model"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"54f54e53_d99f9edc","line":53,"in_reply_to":"851b42b5_6ee50a0a","updated":"2025-12-12 09:42:51.000000000","message":"Revised as suggested","commit_id":"003ba3e66b6dd3b065df8f54c8c50523ec71821c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7cfa81dafe76b19277c24d672b9e107eaa341c2","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class MemEncryptionConfig(metaclass\u003dabc.ABCMeta):"},{"line_number":53,"context_line":"    def __init__(self, model: ty.Optional[str] \u003d None):"},{"line_number":54,"context_line":"        self._model \u003d model"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"9addec88_ee03565b","line":53,"range":{"start_line":53,"start_character":23,"end_line":53,"end_character":53},"updated":"2025-12-15 16:07:56.000000000","message":"Re-reading the code accepting None does not look really required. Can we drop it (and also the default None) ?","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c9126bdd91b7a918ba272c8473ba015ee738bc6","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class MemEncryptionConfig(metaclass\u003dabc.ABCMeta):"},{"line_number":53,"context_line":"    def __init__(self, model: ty.Optional[str] \u003d None):"},{"line_number":54,"context_line":"        self._model \u003d model"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"4e8c737e_020aa642","line":53,"range":{"start_line":53,"start_character":23,"end_line":53,"end_character":53},"in_reply_to":"8a00bc10_95b04d02","updated":"2026-01-05 16:26:54.000000000","message":"Done","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"b752995bd0a43737b489059bc1e7df1a49c931a2","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class MemEncryptionConfig(metaclass\u003dabc.ABCMeta):"},{"line_number":53,"context_line":"    def __init__(self, model: ty.Optional[str] \u003d None):"},{"line_number":54,"context_line":"        self._model \u003d model"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"8a00bc10_95b04d02","line":53,"range":{"start_line":53,"start_character":23,"end_line":53,"end_character":53},"in_reply_to":"9addec88_ee03565b","updated":"2025-12-17 09:41:42.000000000","message":"Updated code to use `model: str` simply.","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"41d9ac3e2153148418bbd50743319fe298d66405","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(MemEncryptionConfigSev, self).__init__("},{"line_number":82,"context_line":"            model\u003dfields.MemEncryptionModel.AMD_SEV_ES)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"67d67e3f_93ab094e","line":81,"range":{"start_line":81,"start_character":14,"end_line":81,"end_character":36},"updated":"2025-12-15 16:13:02.000000000","message":"Should be MemEncryptionConfigSevEs . This indicates that you have to make the `__init__` method of MemEncryptioNConfigSev to accept model to override the value.","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"b752995bd0a43737b489059bc1e7df1a49c931a2","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(MemEncryptionConfigSev, self).__init__("},{"line_number":82,"context_line":"            model\u003dfields.MemEncryptionModel.AMD_SEV_ES)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"efd9d3eb_71c9de98","line":81,"range":{"start_line":81,"start_character":14,"end_line":81,"end_character":36},"in_reply_to":"67d67e3f_93ab094e","updated":"2025-12-17 09:41:42.000000000","message":"Updated code as suggested","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c9126bdd91b7a918ba272c8473ba015ee738bc6","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"},{"line_number":80,"context_line":"    def __init__(self):"},{"line_number":81,"context_line":"        super(MemEncryptionConfigSev, self).__init__("},{"line_number":82,"context_line":"            model\u003dfields.MemEncryptionModel.AMD_SEV_ES)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"86e3c4b5_7c134abc","line":81,"range":{"start_line":81,"start_character":14,"end_line":81,"end_character":36},"in_reply_to":"efd9d3eb_71c9de98","updated":"2026-01-05 16:26:54.000000000","message":"Done","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7cfa81dafe76b19277c24d672b9e107eaa341c2","unresolved":true,"context_lines":[{"line_number":1528,"context_line":"            mem_page_size_flavor or mem_page_size_image"},{"line_number":1529,"context_line":"    ):"},{"line_number":1530,"context_line":"        raise exception.LockMemoryForbidden()"},{"line_number":1531,"context_line":""},{"line_number":1532,"context_line":"    me_config \u003d get_mem_encryption_constraint(flavor, image_meta, mach_type)"},{"line_number":1533,"context_line":"    if me_config is not None:"},{"line_number":1534,"context_line":"        if locked_memory is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"0e5b4f5f_bdda5f87","line":1531,"updated":"2025-12-15 16:07:56.000000000","message":"(nit) Adding\n\n```\n    if locked_memory:\n        return True\n```\n\nhere may save the redundant memory encryption check below.","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"b752995bd0a43737b489059bc1e7df1a49c931a2","unresolved":true,"context_lines":[{"line_number":1528,"context_line":"            mem_page_size_flavor or mem_page_size_image"},{"line_number":1529,"context_line":"    ):"},{"line_number":1530,"context_line":"        raise exception.LockMemoryForbidden()"},{"line_number":1531,"context_line":""},{"line_number":1532,"context_line":"    me_config \u003d get_mem_encryption_constraint(flavor, image_meta, mach_type)"},{"line_number":1533,"context_line":"    if me_config is not None:"},{"line_number":1534,"context_line":"        if locked_memory is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"2b2e432a_8e7bc182","line":1531,"in_reply_to":"0e5b4f5f_bdda5f87","updated":"2025-12-17 09:41:42.000000000","message":"Updated","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c9126bdd91b7a918ba272c8473ba015ee738bc6","unresolved":false,"context_lines":[{"line_number":1528,"context_line":"            mem_page_size_flavor or mem_page_size_image"},{"line_number":1529,"context_line":"    ):"},{"line_number":1530,"context_line":"        raise exception.LockMemoryForbidden()"},{"line_number":1531,"context_line":""},{"line_number":1532,"context_line":"    me_config \u003d get_mem_encryption_constraint(flavor, image_meta, mach_type)"},{"line_number":1533,"context_line":"    if me_config is not None:"},{"line_number":1534,"context_line":"        if locked_memory is None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ab464fff_3aba6a2d","line":1531,"in_reply_to":"2b2e432a_8e7bc182","updated":"2026-01-05 16:26:54.000000000","message":"Done","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7cfa81dafe76b19277c24d672b9e107eaa341c2","unresolved":true,"context_lines":[{"line_number":1537,"context_line":"            if me_config.needs_locked_memory:"},{"line_number":1538,"context_line":"                locked_memory \u003d me_config.needs_locked_memory"},{"line_number":1539,"context_line":"        else:"},{"line_number":1540,"context_line":"            # If memory encryption requests locked memory,"},{"line_number":1541,"context_line":"            # check whether flavor and image accept it."},{"line_number":1542,"context_line":"            # Otherwise, adopt the locked_memory value of flavor/image."},{"line_number":1543,"context_line":"            if me_config.needs_locked_memory and not locked_memory:"},{"line_number":1544,"context_line":"                raise exception.FlavorImageLockedMemoryConflict("},{"line_number":1545,"context_line":"                    \"Memory encryption %(model)s requests locked memory \""},{"line_number":1546,"context_line":"                    \"but flavor or image denies locked memory. \""},{"line_number":1547,"context_line":"                    \"(flavor\u003d%(flavor_val)s image\u003d%(image_val)s\""},{"line_number":1548,"context_line":"                    % {\u0027model\u0027: me_config.model,"},{"line_number":1549,"context_line":"                       \u0027flavor_val\u0027: locked_memory_flavor,"},{"line_number":1550,"context_line":"                       \u0027image_val\u0027: locked_memory_image})"},{"line_number":1551,"context_line":""},{"line_number":1552,"context_line":"    return locked_memory"},{"line_number":1553,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bc97e5e3_32ae4649","line":1550,"range":{"start_line":1540,"start_character":0,"end_line":1550,"end_character":57},"updated":"2025-12-15 16:07:56.000000000","message":"I think this is correct, but this modifies the existing behavior that enables memory locking regardless of the image/flavor used. Can we split this part to a separate change with a release note ?","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c9126bdd91b7a918ba272c8473ba015ee738bc6","unresolved":false,"context_lines":[{"line_number":1537,"context_line":"            if me_config.needs_locked_memory:"},{"line_number":1538,"context_line":"                locked_memory \u003d me_config.needs_locked_memory"},{"line_number":1539,"context_line":"        else:"},{"line_number":1540,"context_line":"            # If memory encryption requests locked memory,"},{"line_number":1541,"context_line":"            # check whether flavor and image accept it."},{"line_number":1542,"context_line":"            # Otherwise, adopt the locked_memory value of flavor/image."},{"line_number":1543,"context_line":"            if me_config.needs_locked_memory and not locked_memory:"},{"line_number":1544,"context_line":"                raise exception.FlavorImageLockedMemoryConflict("},{"line_number":1545,"context_line":"                    \"Memory encryption %(model)s requests locked memory \""},{"line_number":1546,"context_line":"                    \"but flavor or image denies locked memory. \""},{"line_number":1547,"context_line":"                    \"(flavor\u003d%(flavor_val)s image\u003d%(image_val)s\""},{"line_number":1548,"context_line":"                    % {\u0027model\u0027: me_config.model,"},{"line_number":1549,"context_line":"                       \u0027flavor_val\u0027: locked_memory_flavor,"},{"line_number":1550,"context_line":"                       \u0027image_val\u0027: locked_memory_image})"},{"line_number":1551,"context_line":""},{"line_number":1552,"context_line":"    return locked_memory"},{"line_number":1553,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d25531c9_597826a6","line":1550,"range":{"start_line":1540,"start_character":0,"end_line":1550,"end_character":57},"in_reply_to":"9697752c_8c8a7707","updated":"2026-01-05 16:26:54.000000000","message":"Done","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"b752995bd0a43737b489059bc1e7df1a49c931a2","unresolved":true,"context_lines":[{"line_number":1537,"context_line":"            if me_config.needs_locked_memory:"},{"line_number":1538,"context_line":"                locked_memory \u003d me_config.needs_locked_memory"},{"line_number":1539,"context_line":"        else:"},{"line_number":1540,"context_line":"            # If memory encryption requests locked memory,"},{"line_number":1541,"context_line":"            # check whether flavor and image accept it."},{"line_number":1542,"context_line":"            # Otherwise, adopt the locked_memory value of flavor/image."},{"line_number":1543,"context_line":"            if me_config.needs_locked_memory and not locked_memory:"},{"line_number":1544,"context_line":"                raise exception.FlavorImageLockedMemoryConflict("},{"line_number":1545,"context_line":"                    \"Memory encryption %(model)s requests locked memory \""},{"line_number":1546,"context_line":"                    \"but flavor or image denies locked memory. \""},{"line_number":1547,"context_line":"                    \"(flavor\u003d%(flavor_val)s image\u003d%(image_val)s\""},{"line_number":1548,"context_line":"                    % {\u0027model\u0027: me_config.model,"},{"line_number":1549,"context_line":"                       \u0027flavor_val\u0027: locked_memory_flavor,"},{"line_number":1550,"context_line":"                       \u0027image_val\u0027: locked_memory_image})"},{"line_number":1551,"context_line":""},{"line_number":1552,"context_line":"    return locked_memory"},{"line_number":1553,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9697752c_8c8a7707","line":1550,"range":{"start_line":1540,"start_character":0,"end_line":1550,"end_character":57},"in_reply_to":"bc97e5e3_32ae4649","updated":"2025-12-17 09:41:42.000000000","message":"Done as suggested. I\u0027ve split this into a separate commit: https://review.opendev.org/c/openstack/nova/+/971300","commit_id":"feb9ae49a9e53ac23cd785cad48f834e859e220e"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"12a2c2d3f41c4567c99b6842a6885585cc450950","unresolved":true,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def model(self) -\u003e str:"},{"line_number":58,"context_line":"        return self._model"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fee6bd4_fd70582c","line":58,"range":{"start_line":58,"start_character":20,"end_line":58,"end_character":26},"updated":"2026-01-05 16:32:54.000000000","message":"I noticed that this is inconsistent with required_traits you implemented in https://review.opendev.org/c/openstack/nova/+/967971/5/nova/virt/hardware.py#83 .\nCan we just omit _model and override the model method ?\n\nI guess you can do direct override like\n```\nclass MemEncryptionConfig(metaclass\u003dabc.ABCMeta):\n    @property\n    @abc.abstractmethod\n    def model(self) -\u003e str:\n        pass\n\n\nclass MemEncryptionConfigSev(MemEncryptionConfig):\n    model \u003d fields.MemEncryptionModel.AMD_SEV\n\n\nclass MemEncryptionConfigSev(MemEncryptionConfigSev):\n    model \u003d fields.MemEncryptionModel.AMD_SEV_ES\n```","commit_id":"c3fe653e367dfd41ba6df7c3fac61b3212377c9b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7c5f0a64e112910e933df59f9cbb96e57c220aaa","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def model(self) -\u003e str:"},{"line_number":58,"context_line":"        return self._model"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"65b4fce3_680d3f65","line":58,"range":{"start_line":58,"start_character":20,"end_line":58,"end_character":26},"in_reply_to":"7fb79f1c_56b6a51a","updated":"2026-01-13 10:50:53.000000000","message":"Done","commit_id":"c3fe653e367dfd41ba6df7c3fac61b3212377c9b"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"a304260708a17eeefe5dd9ad7a52b61e541cbc46","unresolved":true,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @property"},{"line_number":57,"context_line":"    def model(self) -\u003e str:"},{"line_number":58,"context_line":"        return self._model"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @property"},{"line_number":61,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"7fb79f1c_56b6a51a","line":58,"range":{"start_line":58,"start_character":20,"end_line":58,"end_character":26},"in_reply_to":"9fee6bd4_fd70582c","updated":"2026-01-07 07:00:37.000000000","message":"Updated as suggested. With this change, `model` and `needs_locked_memory` in `MemEncryptionConfigSev` and `MemEncryptionConfigSevEs` override the abstract properties defined in `MemEncryptionConfig`. `required_trait` was also updated in [the next patch](https://review.opendev.org/c/openstack/nova/+/967971/6/nova/virt/hardware.py)","commit_id":"c3fe653e367dfd41ba6df7c3fac61b3212377c9b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7c5f0a64e112910e933df59f9cbb96e57c220aaa","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    model: str"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class MemEncryptionConfig(metaclass\u003dabc.ABCMeta):"},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9c9fab95_ed1d34a9","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":25},"updated":"2026-01-13 10:50:53.000000000","message":"since this is a interface breaking change, I hope (and suppose) all the callers are inside this module","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    model: str"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class MemEncryptionConfig(metaclass\u003dabc.ABCMeta):"},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"}],"source_content_type":"text/x-python","patch_set":5,"id":"f736366e_30a76f4f","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":25},"in_reply_to":"6bb6ecea_792de97e","updated":"2026-03-06 10:41:59.000000000","message":"Acknowledged","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"77b31060fe8ca8ad2621382c453b674692d6324c","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    model: str"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class MemEncryptionConfig(metaclass\u003dabc.ABCMeta):"},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"}],"source_content_type":"text/x-python","patch_set":5,"id":"6bb6ecea_792de97e","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":25},"in_reply_to":"9c9fab95_ed1d34a9","updated":"2026-01-15 01:37:05.000000000","message":"Thank you for reviewing.\nThe basic concept of [bp/generalize-sev-code series of patches](https://review.opendev.org/q/topic:%22bp/generalize-sev-code%22) is to introduce the common interfaces for MemEncryptionConfig that are independent of specific VM memory encryption mechanisms and localize codes that depends on specific mechanisms as possible.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7c5f0a64e112910e933df59f9cbb96e57c220aaa","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"},{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"4b51345e_ab8debe1","line":56,"updated":"2026-01-13 10:50:53.000000000","message":"why it can\u0027t just be a class attribute ?","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"77b31060fe8ca8ad2621382c453b674692d6324c","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"},{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"87aefc71_95d976ee","line":56,"in_reply_to":"4b51345e_ab8debe1","updated":"2026-01-15 01:37:05.000000000","message":"Is my understanding correct that you are asking why it cannot be defined as a simple class attribute, like this, instead of an abstractmethod?\n\n```\nclass MemEncryptionConfig(metaclass\u003dabc.ABCMeta):\n    model: str \n```\n\nMy reason for making it an abstractmethod was to enforce model attribute definition in child classes (`MemEncryptionConfigSEV/CCA`...) inheriting from the abstract class `MemEncryptionConfig`. A simple class attribute cannot enforce.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a97170bd5564d5ae675366cbc92286f66b583fdd","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"},{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"db564bfc_ae9bef6e","line":56,"in_reply_to":"87aefc71_95d976ee","updated":"2026-02-03 17:20:00.000000000","message":"I agree and prefer this approach, it forces to respect the contract and define model and needs_locked_memory.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"},{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"ee2ca615_2c4f8321","line":56,"in_reply_to":"db564bfc_ae9bef6e","updated":"2026-02-26 15:38:39.000000000","message":"OK, I better understand your reasoning.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"},{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"3bca08c1_e90a4e91","line":56,"in_reply_to":"ee2ca615_2c4f8321","updated":"2026-03-06 10:41:59.000000000","message":"Acknowledged","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    @abc.abstractmethod"},{"line_number":55,"context_line":"    def model(self) -\u003e str:"},{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"e8f0cbcd_eca576f8","line":56,"in_reply_to":"ee2ca615_2c4f8321","updated":"2026-03-06 10:41:59.000000000","message":"Acknowledged","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7c5f0a64e112910e933df59f9cbb96e57c220aaa","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"},{"line_number":60,"context_line":"    def needs_locked_memory(self) -\u003e bool:"},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c0f7da3d_c7f614dd","line":59,"updated":"2026-01-13 10:50:53.000000000","message":"that one will require all the classes to define, which is not the case of MemEncryptionConfigSevEs\n\nI\u0027d suggest you to use another class attribute.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"77b31060fe8ca8ad2621382c453b674692d6324c","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"},{"line_number":60,"context_line":"    def needs_locked_memory(self) -\u003e bool:"},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df1dbec0_de1edaa1","line":59,"in_reply_to":"c0f7da3d_c7f614dd","updated":"2026-01-15 01:37:05.000000000","message":"I understand that `MemEncryptionConfigSevEs` doesn\u0027t need to explicitly define `needs_locked_memory` because it inherits the model\u0027s value from `MemEncryptionConfigSev`, and `MemEncryptionConfigSev` defines `needs_locked_memory` .\n\nFor Arm CCA, `needs_locked_memory` will be False because libvirt does not require Nova to insert the memBacking.locked element in the domain XML. By introducing\n`MemEncryptionConfig.needs_locked_memory` as an abstractmethod, we enforce its definitions in inherited classes.\nTherefore, we do not need to check which memory encryption mechanism requires memBacking.locked for generating the domain XML.\n\nPlease let me know if I misunderstand your comment.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        pass"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @property"},{"line_number":59,"context_line":"    @abc.abstractmethod"},{"line_number":60,"context_line":"    def needs_locked_memory(self) -\u003e bool:"},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"77bd3b6a_ed8bc54d","line":59,"in_reply_to":"df1dbec0_de1edaa1","updated":"2026-02-26 15:38:39.000000000","message":"Acknowledged","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"825286b01be07c0a0ef85dfa8205bb7d5c89253c","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) \\"},{"line_number":77,"context_line":"        -\u003e MemEncryptionConfigSev | MemEncryptionConfigSevEs:"},{"line_number":78,"context_line":"    \"\"\"Get MemEncryptionConfig instance by MemEncryptionModel."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :returns: MemEncryptionConfig subclass instance corresponding to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"c30fd12a_37d483d7","line":77,"range":{"start_line":76,"start_character":0,"end_line":77,"end_character":61},"updated":"2026-01-17 18:29:56.000000000","message":"nit: I think we tend not to use backslashes for formatting. Could this be\n```\ndef get_mem_encryption_config(\n    model: str\n) -\u003e MemEncryptionConfigSev | MemEncryptionConfigSevEs:\n```\n\nMoreover we have a common base for the return type now, isn\u0027t it? So\n```\ndef get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig\n```\nis even more correct","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"a7163a6fe2ff2d12219e6f5cd933d1c1aca1f1a3","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) \\"},{"line_number":77,"context_line":"        -\u003e MemEncryptionConfigSev | MemEncryptionConfigSevEs:"},{"line_number":78,"context_line":"    \"\"\"Get MemEncryptionConfig instance by MemEncryptionModel."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :returns: MemEncryptionConfig subclass instance corresponding to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"66ac1020_1e13ee03","line":77,"range":{"start_line":76,"start_character":0,"end_line":77,"end_character":61},"in_reply_to":"33b52532_268415b9","updated":"2026-02-20 01:07:02.000000000","message":"Done","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"55ef50519eed442554ac535d0983b23b372e80ea","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) \\"},{"line_number":77,"context_line":"        -\u003e MemEncryptionConfigSev | MemEncryptionConfigSevEs:"},{"line_number":78,"context_line":"    \"\"\"Get MemEncryptionConfig instance by MemEncryptionModel."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    :returns: MemEncryptionConfig subclass instance corresponding to the"}],"source_content_type":"text/x-python","patch_set":5,"id":"33b52532_268415b9","line":77,"range":{"start_line":76,"start_character":0,"end_line":77,"end_character":61},"in_reply_to":"c30fd12a_37d483d7","updated":"2026-01-20 09:29:20.000000000","message":"Thank you for your review.\nUpdated as your suggestion.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"825286b01be07c0a0ef85dfa8205bb7d5c89253c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        model parameter."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    if model \u003d\u003d fields.MemEncryptionModel.AMD_SEV:"},{"line_number":85,"context_line":"        return MemEncryptionConfigSev()"},{"line_number":86,"context_line":"    elif model \u003d\u003d fields.MemEncryptionModel.AMD_SEV_ES:"},{"line_number":87,"context_line":"        return MemEncryptionConfigSevEs()"},{"line_number":88,"context_line":"    else:"},{"line_number":89,"context_line":"        raise exception.Invalid("},{"line_number":90,"context_line":"            (\"Invalid memory encryption model %(model)r. \""},{"line_number":91,"context_line":"             \"Allowed values: %(valid)s.\") %"}],"source_content_type":"text/x-python","patch_set":5,"id":"f874695e_fb9c6167","line":88,"range":{"start_line":84,"start_character":0,"end_line":88,"end_character":9},"updated":"2026-01-17 18:29:56.000000000","message":"When we extend this with more branches I would suggest to have a table (dict) that maps the model name to the type to instantiate. That will result in cleaner code in my eyes. For 3 branches this is probably does not matter.","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"825286b01be07c0a0ef85dfa8205bb7d5c89253c","unresolved":false,"context_lines":[{"line_number":1529,"context_line":"    if me_config is not None and me_config.needs_locked_memory:"},{"line_number":1530,"context_line":"        # If flavor or image denies locked_memory but memory encryption"},{"line_number":1531,"context_line":"        # requests locked memory, FlavorImageLockedMemoryConflict exception"},{"line_number":1532,"context_line":"        # should be raised here, but keep the existing behavior for now."},{"line_number":1533,"context_line":"        return True"},{"line_number":1534,"context_line":""},{"line_number":1535,"context_line":"    return locked_memory"}],"source_content_type":"text/x-python","patch_set":5,"id":"c6c3facb_2b377417","line":1532,"updated":"2026-01-17 18:29:56.000000000","message":"++","commit_id":"fc51333309ae729b27ac3de1263fded99594e210"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a97170bd5564d5ae675366cbc92286f66b583fdd","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"},{"line_number":73,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"10da2776_6ea53de1","line":72,"range":{"start_line":72,"start_character":31,"end_line":72,"end_character":53},"updated":"2026-02-03 17:20:00.000000000","message":"Note for myself: inherited from MemEncryptionConfigSev so it overloads.","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a97170bd5564d5ae675366cbc92286f66b583fdd","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":77,"context_line":"    \"\"\"Get MemEncryptionConfig instance by MemEncryptionModel."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    :returns: MemEncryptionConfig subclass instance corresponding to the"},{"line_number":80,"context_line":"        model parameter."}],"source_content_type":"text/x-python","patch_set":7,"id":"07e201e5_b8124f0b","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":62},"updated":"2026-02-03 17:20:00.000000000","message":"Nit: I would use:\n\"\"\"Factory returning a MemEncryptionConfig for the given MemEncryptionModel.\"\"\"\n\n\nJust to highlight that the factory pattern is used here.","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"37bdfb81a508f4a782f44b9082f66fe68e09302f","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":77,"context_line":"    \"\"\"Get MemEncryptionConfig instance by MemEncryptionModel."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    :returns: MemEncryptionConfig subclass instance corresponding to the"},{"line_number":80,"context_line":"        model parameter."}],"source_content_type":"text/x-python","patch_set":7,"id":"57c86765_df82d72b","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":62},"in_reply_to":"07e201e5_b8124f0b","updated":"2026-02-06 00:31:51.000000000","message":"Thank you for reviewing.\n\nUpdated as suggested. I made a minor change to the sentence to fit the line character limit.","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"a7163a6fe2ff2d12219e6f5cd933d1c1aca1f1a3","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":77,"context_line":"    \"\"\"Get MemEncryptionConfig instance by MemEncryptionModel."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    :returns: MemEncryptionConfig subclass instance corresponding to the"},{"line_number":80,"context_line":"        model parameter."}],"source_content_type":"text/x-python","patch_set":7,"id":"cf028f64_81917a0a","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":62},"in_reply_to":"57c86765_df82d72b","updated":"2026-02-20 01:07:02.000000000","message":"Done","commit_id":"deae29cd24dca638b8362cc95a903f3108d8824e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":64,"context_line":"        return self.model \u003d\u003d other.model"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":9,"id":"e46dea5a_4dd116c8","line":64,"updated":"2026-02-26 15:38:39.000000000","message":"this can return an AttributeError if we compare that object with something which is not inherited from MemEncryptionConfig\n\nThat leaves the callers responsible for ensuring we don\u0027t blindly check about anything but that kind of object.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"6b85955c1364622d023bc59cef1db87000a133cd","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":64,"context_line":"        return self.model \u003d\u003d other.model"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fb66cc42_4140009b","line":64,"in_reply_to":"e46dea5a_4dd116c8","updated":"2026-02-27 00:59:39.000000000","message":"I\u0027ve updated the code to return `NotImplemented` if other is not an instance of `MemEncryptionConfig`.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":64,"context_line":"        return self.model \u003d\u003d other.model"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"}],"source_content_type":"text/x-python","patch_set":9,"id":"14614174_47ba0439","line":64,"in_reply_to":"fb66cc42_4140009b","updated":"2026-03-06 10:41:59.000000000","message":"Done","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":true,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"},{"line_number":68,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV"},{"line_number":69,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"}],"source_content_type":"text/x-python","patch_set":9,"id":"0d005fbe_3be64cdc","line":69,"updated":"2026-02-26 15:38:39.000000000","message":"I\u0027m a bit relunctant to override the needs_locked_memory function that was defined as a property in the abstract class and just return a boolean, that looks to me errorprone for future usage (shall we use that name as a class variable or as an helper method that introspect internal object values ?)","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"6b85955c1364622d023bc59cef1db87000a133cd","unresolved":true,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"},{"line_number":68,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV"},{"line_number":69,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"}],"source_content_type":"text/x-python","patch_set":9,"id":"27b239b3_b9543fea","line":69,"in_reply_to":"0d005fbe_3be64cdc","updated":"2026-02-27 00:59:39.000000000","message":"As suggested, I have changed the implementation to define it as a class variable.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"86033790ca9814eec83f3994d6120b7973ed6fc1","unresolved":true,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"},{"line_number":68,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV"},{"line_number":69,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ee450838_cb126a32","line":69,"in_reply_to":"27b239b3_b9543fea","updated":"2026-03-05 14:04:04.000000000","message":"hm. We had two properties that was overwritten here as two class variables. Then there was discussion about class variables vs properties vs how to override them in child class. No we have a mixed case one class variable (needs_locked_memory) and the other is an abstract property (model). \n\nWe should handle the two pieces of data the same way. \n\nI personally prefer the abstract property in the base + concrete property in the child approach.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"78befcb6688c75fe110b6eb4a05214ed3c2c0af8","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"},{"line_number":68,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV"},{"line_number":69,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"}],"source_content_type":"text/x-python","patch_set":9,"id":"f0878184_093f0000","line":69,"in_reply_to":"4dd6fe36_e4f3107d","updated":"2026-04-03 07:59:20.000000000","message":"Done.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":true,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class MemEncryptionConfigSev(MemEncryptionConfig):"},{"line_number":68,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV"},{"line_number":69,"context_line":"    needs_locked_memory: bool \u003d True"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class MemEncryptionConfigSevEs(MemEncryptionConfigSev):"}],"source_content_type":"text/x-python","patch_set":9,"id":"4dd6fe36_e4f3107d","line":69,"in_reply_to":"ee450838_cb126a32","updated":"2026-03-06 10:41:59.000000000","message":"\u003e I personally prefer the abstract property in the base + concrete property in the child approach.\n\nUpdated as the above suggestion.","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":77,"context_line":"    \"\"\"Factory returning a MemEnryptionConfig from the MemEncryptionModel.\"\"\""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    model2cls \u003d {"},{"line_number":80,"context_line":"        fields.MemEncryptionModel.AMD_SEV: MemEncryptionConfigSev,"}],"source_content_type":"text/x-python","patch_set":9,"id":"fb8ffcaa_41106194","line":77,"range":{"start_line":77,"start_character":27,"end_line":77,"end_character":45},"updated":"2026-02-26 15:38:39.000000000","message":"nit: MemEncryptionConfig","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"6b85955c1364622d023bc59cef1db87000a133cd","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":77,"context_line":"    \"\"\"Factory returning a MemEnryptionConfig from the MemEncryptionModel.\"\"\""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    model2cls \u003d {"},{"line_number":80,"context_line":"        fields.MemEncryptionModel.AMD_SEV: MemEncryptionConfigSev,"}],"source_content_type":"text/x-python","patch_set":9,"id":"c1cb00e8_14e6e03d","line":77,"range":{"start_line":77,"start_character":27,"end_line":77,"end_character":45},"in_reply_to":"fb8ffcaa_41106194","updated":"2026-02-27 00:59:39.000000000","message":"Done","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4a9c489a23818c19c1ffa95080d39d5190bddd3e","unresolved":false,"context_lines":[{"line_number":1472,"context_line":"def get_locked_memory_constraint("},{"line_number":1473,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1474,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1475,"context_line":"    mach_type: str | None \u003d None"},{"line_number":1476,"context_line":") -\u003e bool | None:"},{"line_number":1477,"context_line":"    \"\"\"Validate and return the requested locked memory."},{"line_number":1478,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"60cc7373_89a63e42","line":1475,"range":{"start_line":1475,"start_character":28,"end_line":1475,"end_character":32},"updated":"2026-02-26 15:38:39.000000000","message":"good for backwards compatibility","commit_id":"1cbe2384771671cebd18713450efefe634c2f338"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"86033790ca9814eec83f3994d6120b7973ed6fc1","unresolved":true,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":69,"context_line":"        if not isinstance(other, MemEncryptionConfig):"},{"line_number":70,"context_line":"            return NotImplemented"},{"line_number":71,"context_line":"        return self.model \u003d\u003d other.model"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"e3d11042_c9f4048d","line":70,"updated":"2026-03-05 14:04:04.000000000","message":"If the other is not MemEncryptionConfig then we are pretty sure it cannot be equal to self which is a MemEncryptionConfig. So it is enough to return False here","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"78befcb6688c75fe110b6eb4a05214ed3c2c0af8","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":69,"context_line":"        if not isinstance(other, MemEncryptionConfig):"},{"line_number":70,"context_line":"            return NotImplemented"},{"line_number":71,"context_line":"        return self.model \u003d\u003d other.model"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1bccffc7_623e803e","line":70,"in_reply_to":"c351f846_f7c3cd73","updated":"2026-04-03 07:59:20.000000000","message":"Done.","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":true,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":69,"context_line":"        if not isinstance(other, MemEncryptionConfig):"},{"line_number":70,"context_line":"            return NotImplemented"},{"line_number":71,"context_line":"        return self.model \u003d\u003d other.model"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"c351f846_f7c3cd73","line":70,"in_reply_to":"e3d11042_c9f4048d","updated":"2026-03-06 10:41:59.000000000","message":"Updated as your suggestion.","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"86033790ca9814eec83f3994d6120b7973ed6fc1","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":84,"context_line":"    \"\"\"Factory returning a MemEncryptionConfig from the MemEncryptionModel.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    model2cls \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"b46c0bc1_09e0131b","line":83,"updated":"2026-03-05 14:04:04.000000000","message":"this can be a factory method on MemEncryptionConfig class.","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"78befcb6688c75fe110b6eb4a05214ed3c2c0af8","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":84,"context_line":"    \"\"\"Factory returning a MemEncryptionConfig from the MemEncryptionModel.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    model2cls \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"668ff3d2_2ea9e89f","line":83,"in_reply_to":"4c9701a9_309fb099","updated":"2026-04-03 07:59:20.000000000","message":"Done.","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"e311b98c57ca77d73d109ae265cf37156fa57fd8","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    model \u003d fields.MemEncryptionModel.AMD_SEV_ES"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def get_mem_encryption_config(model: str) -\u003e MemEncryptionConfig:"},{"line_number":84,"context_line":"    \"\"\"Factory returning a MemEncryptionConfig from the MemEncryptionModel.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    model2cls \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"4c9701a9_309fb099","line":83,"in_reply_to":"b46c0bc1_09e0131b","updated":"2026-03-06 10:41:59.000000000","message":"Updated as your suggestion. I defined this as a class method.","commit_id":"e8de0448dc91d160cf137b85c72c432c638c3efc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8342ed25d84214388ea1d991e3dd7a199e0affa4","unresolved":true,"context_lines":[{"line_number":60,"context_line":"    def needs_locked_memory(self) -\u003e bool:"},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":64,"context_line":"        if not isinstance(other, MemEncryptionConfig):"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":"        return self.model \u003d\u003d other.model"}],"source_content_type":"text/x-python","patch_set":11,"id":"86b2eb6d_307d1561","line":63,"updated":"2026-04-02 15:39:36.000000000","message":"(nit, fix in a follow up): as we override `__eq__` we probably want a matching `__hash__` defined as well. The rule is\n\n\u003e The only required property is that objects which compare equal have the same hash value;\n\nso I think\n```\ndef __hash__(self):\n    return hash(self.model)\n```\nwould work","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"15330f5bc55982f74271e7a0afaf85178e9af7e5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def needs_locked_memory(self) -\u003e bool:"},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __eq__(self, other) -\u003e bool:"},{"line_number":64,"context_line":"        if not isinstance(other, MemEncryptionConfig):"},{"line_number":65,"context_line":"            return False"},{"line_number":66,"context_line":"        return self.model \u003d\u003d other.model"}],"source_content_type":"text/x-python","patch_set":11,"id":"bc754de4_a95fe269","line":63,"in_reply_to":"86b2eb6d_307d1561","updated":"2026-04-03 07:55:52.000000000","message":"I addressed this in [the new patch](https://review.opendev.org/c/openstack/nova/+/983278/comment/588d4aa6_586c8fc1/). So, I resolved this comment.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8342ed25d84214388ea1d991e3dd7a199e0affa4","unresolved":true,"context_lines":[{"line_number":1240,"context_line":"    :param machine_type: a string representing the machine type (optional)"},{"line_number":1241,"context_line":"    :raises: nova.exception.FlavorImageConflict"},{"line_number":1242,"context_line":"    :raises: nova.exception.InvalidMachineType"},{"line_number":1243,"context_line":"    :returns: A named tuple containing the memory encryption model, else None."},{"line_number":1244,"context_line":"    \"\"\""},{"line_number":1245,"context_line":""},{"line_number":1246,"context_line":"    flavor_mem_enc_str, image_mem_enc \u003d _get_flavor_image_meta("}],"source_content_type":"text/x-python","patch_set":11,"id":"a9f0c729_ea3e8f40","line":1243,"updated":"2026-04-02 15:39:36.000000000","message":"(nit, fix in a followup): Not directly related to the current change but related to the refactor. This function returns an MemEncryptionConfig instance not a named tuple.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"15330f5bc55982f74271e7a0afaf85178e9af7e5","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"    :param machine_type: a string representing the machine type (optional)"},{"line_number":1241,"context_line":"    :raises: nova.exception.FlavorImageConflict"},{"line_number":1242,"context_line":"    :raises: nova.exception.InvalidMachineType"},{"line_number":1243,"context_line":"    :returns: A named tuple containing the memory encryption model, else None."},{"line_number":1244,"context_line":"    \"\"\""},{"line_number":1245,"context_line":""},{"line_number":1246,"context_line":"    flavor_mem_enc_str, image_mem_enc \u003d _get_flavor_image_meta("}],"source_content_type":"text/x-python","patch_set":11,"id":"5cc8c54b_130f5a0f","line":1243,"in_reply_to":"a9f0c729_ea3e8f40","updated":"2026-04-03 07:55:52.000000000","message":"I addressed this in [the new patch](https://review.opendev.org/c/openstack/nova/+/983278/comment/054ecaa1_b1c63ac9/). So, I resolved this comment.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8342ed25d84214388ea1d991e3dd7a199e0affa4","unresolved":true,"context_lines":[{"line_number":1493,"context_line":"    :raises: exception.LockMemoryForbidden if mem_page_size is not set"},{"line_number":1494,"context_line":"        while provide locked_memory value in image or flavor."},{"line_number":1495,"context_line":"    :raises: exception.FlavorImageLockedMemoryConflict if memory locking"},{"line_number":1496,"context_line":"        constraints  between flavor and image conflicts"},{"line_number":1497,"context_line":"    :raises: exception.FlavorImageConflict if memory encryption constraints"},{"line_number":1498,"context_line":"        between flavor and image conflicts"},{"line_number":1499,"context_line":"    :raises: exception.InvalidMachineType if the machine type does not"}],"source_content_type":"text/x-python","patch_set":11,"id":"46f548b2_3dd25297","line":1496,"range":{"start_line":1496,"start_character":7,"end_line":1496,"end_character":28},"updated":"2026-04-02 15:39:36.000000000","message":"super nit: double space","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"15330f5bc55982f74271e7a0afaf85178e9af7e5","unresolved":false,"context_lines":[{"line_number":1493,"context_line":"    :raises: exception.LockMemoryForbidden if mem_page_size is not set"},{"line_number":1494,"context_line":"        while provide locked_memory value in image or flavor."},{"line_number":1495,"context_line":"    :raises: exception.FlavorImageLockedMemoryConflict if memory locking"},{"line_number":1496,"context_line":"        constraints  between flavor and image conflicts"},{"line_number":1497,"context_line":"    :raises: exception.FlavorImageConflict if memory encryption constraints"},{"line_number":1498,"context_line":"        between flavor and image conflicts"},{"line_number":1499,"context_line":"    :raises: exception.InvalidMachineType if the machine type does not"}],"source_content_type":"text/x-python","patch_set":11,"id":"0552fccb_729ad3b6","line":1496,"range":{"start_line":1496,"start_character":7,"end_line":1496,"end_character":28},"in_reply_to":"46f548b2_3dd25297","updated":"2026-04-03 07:55:52.000000000","message":"I addressed this in [the new patch](https://review.opendev.org/c/openstack/nova/+/983278/comment/3a19aa32_e07a6c5d/). So, I resolved this comment.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"29620b51d5e9a85158f12601ced77b035a2c6592","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"    if locked_memory:"},{"line_number":1533,"context_line":"        return True"},{"line_number":1534,"context_line":""},{"line_number":1535,"context_line":"    me_config \u003d get_mem_encryption_constraint(flavor, image_meta, mach_type)"},{"line_number":1536,"context_line":"    if me_config is not None and me_config.needs_locked_memory:"},{"line_number":1537,"context_line":"        # If flavor or image denies locked_memory but memory encryption"},{"line_number":1538,"context_line":"        # requests locked memory, FlavorImageLockedMemoryConflict exception"}],"source_content_type":"text/x-python","patch_set":11,"id":"a2fc86e3_472535a9","line":1535,"updated":"2026-03-30 16:07:04.000000000","message":"The silent override when locked_memory\u003dFalse but mem encryption needs it is fair enough — it\u0027s well-commented and preserves existing behavior.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8342ed25d84214388ea1d991e3dd7a199e0affa4","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"    if locked_memory:"},{"line_number":1533,"context_line":"        return True"},{"line_number":1534,"context_line":""},{"line_number":1535,"context_line":"    me_config \u003d get_mem_encryption_constraint(flavor, image_meta, mach_type)"},{"line_number":1536,"context_line":"    if me_config is not None and me_config.needs_locked_memory:"},{"line_number":1537,"context_line":"        # If flavor or image denies locked_memory but memory encryption"},{"line_number":1538,"context_line":"        # requests locked memory, FlavorImageLockedMemoryConflict exception"}],"source_content_type":"text/x-python","patch_set":11,"id":"e2af888e_5b6db944","line":1535,"in_reply_to":"a2fc86e3_472535a9","updated":"2026-04-02 15:39:36.000000000","message":"Yep this is being improved later in the series.","commit_id":"cfb4ec314c372e3e8533023ae6ace13595f53ba1"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"1651da14aa1ca25175acd4bacff14b46c50af998","unresolved":true,"context_lines":[{"line_number":6902,"context_line":"            # of AMD SEV, any virtio device should use iommu driver, and"},{"line_number":6903,"context_line":"            # libvirt does not know about it. That is why the controller"},{"line_number":6904,"context_line":"            # should be created manually."},{"line_number":6905,"context_line":"            if self._mem_encryption_needs_virtio_serial(flavor, image_meta):"},{"line_number":6906,"context_line":"                self._add_virtio_serial_controller(guest, instance)"},{"line_number":6907,"context_line":""},{"line_number":6908,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""}],"source_content_type":"text/x-python","patch_set":1,"id":"7529ab3f_b7bdd017","line":6905,"range":{"start_line":6905,"start_character":20,"end_line":6905,"end_character":55},"updated":"2025-11-27 14:34:07.000000000","message":"We don\u0027t need this dedicated flag because this logic is here to enable iommu for virtio-serial driver. What we need to check is _mem_encryption_needs_iommu .","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":6902,"context_line":"            # of AMD SEV, any virtio device should use iommu driver, and"},{"line_number":6903,"context_line":"            # libvirt does not know about it. That is why the controller"},{"line_number":6904,"context_line":"            # should be created manually."},{"line_number":6905,"context_line":"            if self._mem_encryption_needs_virtio_serial(flavor, image_meta):"},{"line_number":6906,"context_line":"                self._add_virtio_serial_controller(guest, instance)"},{"line_number":6907,"context_line":""},{"line_number":6908,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a083d94_78c09935","line":6905,"range":{"start_line":6905,"start_character":20,"end_line":6905,"end_character":55},"in_reply_to":"7529ab3f_b7bdd017","updated":"2025-12-08 08:32:36.000000000","message":"Just like `needs_iommu`, I\u0027ve also backed out this part.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":6902,"context_line":"            # of AMD SEV, any virtio device should use iommu driver, and"},{"line_number":6903,"context_line":"            # libvirt does not know about it. That is why the controller"},{"line_number":6904,"context_line":"            # should be created manually."},{"line_number":6905,"context_line":"            if self._mem_encryption_needs_virtio_serial(flavor, image_meta):"},{"line_number":6906,"context_line":"                self._add_virtio_serial_controller(guest, instance)"},{"line_number":6907,"context_line":""},{"line_number":6908,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""}],"source_content_type":"text/x-python","patch_set":1,"id":"57606281_938592cd","line":6905,"range":{"start_line":6905,"start_character":20,"end_line":6905,"end_character":55},"in_reply_to":"7a083d94_78c09935","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"1651da14aa1ca25175acd4bacff14b46c50af998","unresolved":true,"context_lines":[{"line_number":7708,"context_line":"        return hardware.get_mem_encryption_constraint(flavor, image_meta,"},{"line_number":7709,"context_line":"                                                      mach_type)"},{"line_number":7710,"context_line":""},{"line_number":7711,"context_line":"    def _mem_encryption_needs_iommu(self, flavor, image_meta):"},{"line_number":7712,"context_line":"        mem_enc_config \u003d self._get_mem_encryption_config(flavor, image_meta)"},{"line_number":7713,"context_line":"        return mem_enc_config is not None and mem_enc_config.needs_iommu"},{"line_number":7714,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"59cd95a2_9fdb1ffd","line":7711,"range":{"start_line":7711,"start_character":8,"end_line":7711,"end_character":35},"updated":"2025-11-27 14:34:07.000000000","message":"This just cause duplicated code between host.py and driver.py. Can\u0027t we avoid these ?","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c49159b1ed8dd576eaee078df683833329f49d3","unresolved":false,"context_lines":[{"line_number":7708,"context_line":"        return hardware.get_mem_encryption_constraint(flavor, image_meta,"},{"line_number":7709,"context_line":"                                                      mach_type)"},{"line_number":7710,"context_line":""},{"line_number":7711,"context_line":"    def _mem_encryption_needs_iommu(self, flavor, image_meta):"},{"line_number":7712,"context_line":"        mem_enc_config \u003d self._get_mem_encryption_config(flavor, image_meta)"},{"line_number":7713,"context_line":"        return mem_enc_config is not None and mem_enc_config.needs_iommu"},{"line_number":7714,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"74e719f0_cd8495d7","line":7711,"range":{"start_line":7711,"start_character":8,"end_line":7711,"end_character":35},"in_reply_to":"57b44b41_e48e9b60","updated":"2025-12-15 15:48:31.000000000","message":"Done","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"f18f25ded7d251642936a39753b05b27eea12dd8","unresolved":true,"context_lines":[{"line_number":7708,"context_line":"        return hardware.get_mem_encryption_constraint(flavor, image_meta,"},{"line_number":7709,"context_line":"                                                      mach_type)"},{"line_number":7710,"context_line":""},{"line_number":7711,"context_line":"    def _mem_encryption_needs_iommu(self, flavor, image_meta):"},{"line_number":7712,"context_line":"        mem_enc_config \u003d self._get_mem_encryption_config(flavor, image_meta)"},{"line_number":7713,"context_line":"        return mem_enc_config is not None and mem_enc_config.needs_iommu"},{"line_number":7714,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"6133d89c_0724e12e","line":7711,"range":{"start_line":7711,"start_character":8,"end_line":7711,"end_character":35},"in_reply_to":"59cd95a2_9fdb1ffd","updated":"2025-12-08 08:32:36.000000000","message":"I couldn\u0027t locate the specific code in `host.py` that you are referring to as duplicated with `driver.py`.\nAre you perhaps referring to a duplication with a class method in `hardware.py`?","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"85b493f4d3ecfe57a3c0516d8717b497325c5e50","unresolved":true,"context_lines":[{"line_number":7708,"context_line":"        return hardware.get_mem_encryption_constraint(flavor, image_meta,"},{"line_number":7709,"context_line":"                                                      mach_type)"},{"line_number":7710,"context_line":""},{"line_number":7711,"context_line":"    def _mem_encryption_needs_iommu(self, flavor, image_meta):"},{"line_number":7712,"context_line":"        mem_enc_config \u003d self._get_mem_encryption_config(flavor, image_meta)"},{"line_number":7713,"context_line":"        return mem_enc_config is not None and mem_enc_config.needs_iommu"},{"line_number":7714,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c539cd94_7f432350","line":7711,"range":{"start_line":7711,"start_character":8,"end_line":7711,"end_character":35},"in_reply_to":"6133d89c_0724e12e","updated":"2025-12-08 15:54:21.000000000","message":"Yes. You are correct. I meant hardware.py","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"},{"author":{"_account_id":35307,"name":"Taketani Ryo","email":"taketani.ryo@fujitsu.com","username":"r-taketn0517"},"change_message_id":"fb07dac7133199e9b3a91835cf7823f04b71f991","unresolved":true,"context_lines":[{"line_number":7708,"context_line":"        return hardware.get_mem_encryption_constraint(flavor, image_meta,"},{"line_number":7709,"context_line":"                                                      mach_type)"},{"line_number":7710,"context_line":""},{"line_number":7711,"context_line":"    def _mem_encryption_needs_iommu(self, flavor, image_meta):"},{"line_number":7712,"context_line":"        mem_enc_config \u003d self._get_mem_encryption_config(flavor, image_meta)"},{"line_number":7713,"context_line":"        return mem_enc_config is not None and mem_enc_config.needs_iommu"},{"line_number":7714,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"57b44b41_e48e9b60","line":7711,"range":{"start_line":7711,"start_character":8,"end_line":7711,"end_character":35},"in_reply_to":"c539cd94_7f432350","updated":"2025-12-12 09:42:51.000000000","message":"My understanding of is that you are suggesting we should avoid creating the additional `_mem_encryption_needs_locked_memory/iommu/virtio_serial` function within driver.py (which currently calls `needs_locked_memory` from class `MemEncryptionConfig(SEV)` if possible.\n\nFollowing the resolution of the comments \n(https://review.opendev.org/c/openstack/nova/+/967970/comment/b06b3b8e_c389131a/\nand\nhttps://review.opendev.org/c/openstack/nova/+/967970/comment/7529ab3f_b7bdd017/ ), \n`_mem_encryption_needs_locked_memory` was the sole remaining function in driver.py. Therefore, I have integrated the logic previously performed by `_mem_encryption_needs_locked_memory` into the existing method `get_locked_memory_constraint` in `hardware.py`.\n\nPlease let me know if this changes are not what you intended.","commit_id":"77fe4de9902ee0a8448e4b9f2e41b286bd7cd1f5"}]}
