)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds support for emulated virtual TPM."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The approved specification can be found at:"},{"line_number":12,"context_line":"https://specs.openstack.org/openstack/nova-specs/specs/stein/approved/add-emulated-virtual-tpm.html"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This version is curently for code review only."},{"line_number":15,"context_line":"The code is only partially tested because we do not yet"},{"line_number":16,"context_line":"have a stable platform that meets the requirements."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9fdfeff1_f2238604","line":13,"range":{"start_line":11,"start_character":0,"end_line":13,"end_character":0},"updated":"2019-01-18 19:06:39.000000000","message":"These two lines can be removed, then down at the bottom please add:\n\nblueprint: add-emulated-virtual-tpm\n\nThis allows the various tooling to track which blueprint the commit is associated with.  The blueprint in turn has a link to the spec.","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":27,"context_line":"traits:COMPUTE_SECURITY_TPM_2_0 \u003d required will enable vTPM 2.0 support"},{"line_number":28,"context_line":"traits:COMPUTE_SECURITY_TPM_1_2 \u003d required will enable vTPM 1.2 support"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"For vTPM 2.0, there are two device models available for the TPM device,"},{"line_number":31,"context_line":"TIS and CRB."},{"line_number":32,"context_line":"The model can also be selected using flavor extra-specs:"},{"line_number":33,"context_line":"hw:tpm_model\u003dTIS"},{"line_number":34,"context_line":"hw:tpm_model\u003dCRB"},{"line_number":35,"context_line":"the system will default to TIS."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9fdfeff1_52c61219","line":32,"range":{"start_line":30,"start_character":0,"end_line":32,"end_character":56},"updated":"2019-01-18 19:06:39.000000000","message":"I\u0027d merge these into one paragraph, and add the bit from line 35 about the default value.","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fe2e01b98fdefb927489a7492978481725c7da36","unresolved":false,"context_lines":[{"line_number":28,"context_line":"If the image properties and flavor extra-specs specify mutually-"},{"line_number":29,"context_line":"incompatible settings, an exception will be raised in nova-compute."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"blueprint: add-emulated-virtual-tpm"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Change-Id: I1ff51f608b85dbb621814e70079ecfdd3d1a1d22"},{"line_number":34,"context_line":"Signed-off-by: Paul-Emile Element \u003cPaul-Emile.Element@windriver.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"dfbec78f_f7ada3ea","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":35},"updated":"2019-05-03 14:11:01.000000000","message":"nit:\n\nImplements: blueprint add-emulated-virtual-tpm","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":9,"context_line":"WIP: Tests."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This code enables adding emulated TPM support to a guest instance"},{"line_number":12,"context_line":"as described in the spec [1]. Support for cold migration and resize is"},{"line_number":13,"context_line":"added in a follow-on patch."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The feature can be requested by specifying the desired TPM version"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3fa7e38b_6bdde7db","line":12,"range":{"start_line":12,"start_character":25,"end_line":12,"end_character":28},"updated":"2019-11-14 19:25:25.000000000","message":"d\u0027oh","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":9,"context_line":"WIP: Tests."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This code enables adding emulated TPM support to a guest instance"},{"line_number":12,"context_line":"as described in the spec [1]. Support for cold migration and resize is"},{"line_number":13,"context_line":"added in a follow-on patch."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The feature can be requested by specifying the desired TPM version"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3fa7e38b_518bf8be","line":12,"range":{"start_line":12,"start_character":25,"end_line":12,"end_character":28},"in_reply_to":"3fa7e38b_6bdde7db","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If the image properties and flavor extra-specs specify mutually-"},{"line_number":31,"context_line":"incompatible settings, an exception will be raised in nova-api."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"blueprint: add-emulated-virtual-tpm"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: I1ff51f608b85dbb621814e70079ecfdd3d1a1d22"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3fa7e38b_4be26ba2","line":32,"updated":"2019-11-14 19:25:25.000000000","message":"wouldn\u0027t hurt to mention encryption and the keymgr requirement","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"If the image properties and flavor extra-specs specify mutually-"},{"line_number":31,"context_line":"incompatible settings, an exception will be raised in nova-api."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"blueprint: add-emulated-virtual-tpm"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: I1ff51f608b85dbb621814e70079ecfdd3d1a1d22"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"3fa7e38b_f1bb0472","line":32,"in_reply_to":"3fa7e38b_4be26ba2","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"}],"doc/source/admin/emulated-tpm.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":75,"context_line":"* Only server operations performed by the server owner are supported, as the"},{"line_number":76,"context_line":"  user\u0027s credentials are required to unlock the virtual device files on the"},{"line_number":77,"context_line":"  host. Thus the admin may need to decide whether to grant the user additional"},{"line_number":78,"context_line":"  policy roles or effectively disable those operations."},{"line_number":79,"context_line":"* Live migration of servers with vTPMs is not currently supported."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Security"}],"source_content_type":"text/x-rst","patch_set":31,"id":"3fa7e38b_0b931302","line":78,"range":{"start_line":78,"start_character":15,"end_line":78,"end_character":54},"updated":"2019-11-14 19:25:25.000000000","message":"...without which those operations will be effectively disabled? or something.","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":75,"context_line":"* Only server operations performed by the server owner are supported, as the"},{"line_number":76,"context_line":"  user\u0027s credentials are required to unlock the virtual device files on the"},{"line_number":77,"context_line":"  host. Thus the admin may need to decide whether to grant the user additional"},{"line_number":78,"context_line":"  policy roles or effectively disable those operations."},{"line_number":79,"context_line":"* Live migration of servers with vTPMs is not currently supported."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Security"}],"source_content_type":"text/x-rst","patch_set":31,"id":"3fa7e38b_d1b84876","line":78,"range":{"start_line":78,"start_character":15,"end_line":78,"end_character":54},"in_reply_to":"3fa7e38b_0b931302","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":92,"context_line":"(can\u0027t be displayed via the libvirt API or ``virsh``) and ``ephemeral`` (exists"},{"line_number":93,"context_line":"only in memory, never on disk), it is theoretically possible for a sufficiently"},{"line_number":94,"context_line":"privileged user to retrieve the secret and/or vTPM data from memory."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"A full analysis and discussion of security issues related to emulated TPM is"},{"line_number":97,"context_line":"beyond the scope of this document."}],"source_content_type":"text/x-rst","patch_set":31,"id":"3fa7e38b_4b902bee","line":95,"updated":"2019-11-14 19:25:25.000000000","message":"Feel like I want to add more links throughout, but hesitant to provide too many, since underlying support seems to be so nascent and they\u0027re likely to be a moving target (never mind being sparse to the point of near uselessness currently).","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":92,"context_line":"(can\u0027t be displayed via the libvirt API or ``virsh``) and ``ephemeral`` (exists"},{"line_number":93,"context_line":"only in memory, never on disk), it is theoretically possible for a sufficiently"},{"line_number":94,"context_line":"privileged user to retrieve the secret and/or vTPM data from memory."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"A full analysis and discussion of security issues related to emulated TPM is"},{"line_number":97,"context_line":"beyond the scope of this document."}],"source_content_type":"text/x-rst","patch_set":31,"id":"3fa7e38b_31051c15","line":95,"in_reply_to":"3fa7e38b_4b902bee","updated":"2019-11-14 21:27:20.000000000","message":"Done, FWIW.","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"}],"doc/source/user/flavors.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"69f1899baee6d5db5bfd9388ded7323360d568be","unresolved":false,"context_lines":[{"line_number":789,"context_line":"    See `Granular Resource Request Syntax`_ for more details."},{"line_number":790,"context_line":""},{"line_number":791,"context_line":".. _Granular Resource Request Syntax: https://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/granular-resource-requests.html"},{"line_number":792,"context_line":""},{"line_number":793,"context_line":"Emulated Virtual TPM"},{"line_number":794,"context_line":"  If the Compute host supports virtual tpm, you can add emulated virtual TPM support"},{"line_number":795,"context_line":"  to the guest OS."}],"source_content_type":"text/x-rst","patch_set":23,"id":"9fb8cfa7_85425067","line":792,"updated":"2019-06-26 22:07:24.000000000","message":"just noticed this: shouldn\u0027t this go in the admin docs, since flavor setup is done by admins?","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bae0e1c0f20fd0473e3022e6087fc0706f485cb0","unresolved":false,"context_lines":[{"line_number":808,"context_line":"  Valid ``MODEL`` values are:"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"  - ``TIS``: Selects TIS device model. This is the default value."},{"line_number":811,"context_line":"  - ``CRB``: Selects CRB device model. Only valid for TPM version 2.0."}],"source_content_type":"text/x-rst","patch_set":23,"id":"dfbec78f_2fcf5280","line":811,"updated":"2019-05-04 15:00:52.000000000","message":"Apologies for not noting this during the spec process:\n\nIs it possible that I want TIS, but don\u0027t care which TPM version makes it happen? If so, as currently designed, I would have to express that to placement via\n\n required\u003din:COMPUTE_SECURITY_TPM_1_2,COMPUTE_SECURITY_TPM_2_0\n\n...but I don\u0027t think we have any way to express `in:` via extra_specs/image_meta.\n\nSo either we have to make that ^ happen, or we have to swizzle the design in some way.\n\nThe easiest thing would be to:\n- Make the trait optional in extra_specs/image_meta;\n- Make hw:tpm_model required if you want TPM\n- Add a request filter such that, if hw:tpm_model is specified but a version trait is not, we add the appropriate `required`: for TIS, required\u003din:...1_2,...2_0; for CRB, required\u003d...2_0\n\nThis also takes us further away from requiring operators to speak placement-ese in flavors, which is a good thing IMO.","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ca0d8fb633179d8cc8496d73ede15c42c5f24fdb","unresolved":false,"context_lines":[{"line_number":808,"context_line":"  Valid ``MODEL`` values are:"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"  - ``TIS``: Selects TIS device model. This is the default value."},{"line_number":811,"context_line":"  - ``CRB``: Selects CRB device model. Only valid for TPM version 2.0."}],"source_content_type":"text/x-rst","patch_set":23,"id":"dfbec78f_3ce9bb19","line":811,"in_reply_to":"dfbec78f_2fcf5280","updated":"2019-05-06 16:45:44.000000000","message":"I *think* this is what we landed on at the PTG:\n\n- to get TPM, you can specify required version, or hw:tpm_model, or both:\n- required\u003d$version present, hw:tpm_model\u003d$model present \u003d\u003e you get $model at $version\n- required\u003d$version present, hw:tpm_model absent \u003d\u003e TIM at $version\n- required\u003d$version absent, hw:tpm_model\u003d$model present \u003d\u003e request filter adds required\u003d$version, where $version \u003d 2_0 if $model is CRB else 1_2\n- required\u003d1_2, hw_tpm_model\u003dCRB \u003d\u003e request filter errors.\n\nPlease confirm.","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b9af9b86badb5ddfce9e13416dbfcfdca571290a","unresolved":false,"context_lines":[{"line_number":808,"context_line":"  Valid ``MODEL`` values are:"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"  - ``TIS``: Selects TIS device model. This is the default value."},{"line_number":811,"context_line":"  - ``CRB``: Selects CRB device model. Only valid for TPM version 2.0."}],"source_content_type":"text/x-rst","patch_set":23,"id":"3fa7e38b_c1866866","line":811,"in_reply_to":"dfbec78f_3ce9bb19","updated":"2019-10-04 21:50:49.000000000","message":"[Much later] This doesn\u0027t make sense in light of the defaults folks would be expecting if they\u0027re familiar with the libvirt side of things (and if they\u0027re not, they won\u0027t care). The way this should work is:\n\n- You have to specify a version. This is how you request the feature. Because the versions are like different things; it\u0027s not like 2.0 is a superset of 1.2. So you want the version you want, and you don\u0027t want the other one.\n- The model defaults to TIS. You have to say CRB if you want CRB; and if you want CRB, you have to have said 2.0.","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"}],"doc/source/user/support-matrix.ini":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":1755,"context_line":"[operation.boot-emulated-tpm]"},{"line_number":1756,"context_line":"title\u003dBoot instance with an emulated trusted platform module (TPM)"},{"line_number":1757,"context_line":"status\u003doptional"},{"line_number":1758,"context_line":"notes\u003dAllows VMs to be booted with an emulated trusted platform module (TMP)"},{"line_number":1759,"context_line":"  device. Only lifecycle operations performed by the VM owner are supported, as"},{"line_number":1760,"context_line":"  the user\u0027s credentials are required to unlock the virtual device files on the"},{"line_number":1761,"context_line":"  host."}],"source_content_type":"text/x-properties","patch_set":31,"id":"3fa7e38b_8b74e3d1","line":1758,"range":{"start_line":1758,"start_character":72,"end_line":1758,"end_character":75},"updated":"2019-11-14 19:25:25.000000000","message":"whoops","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":1755,"context_line":"[operation.boot-emulated-tpm]"},{"line_number":1756,"context_line":"title\u003dBoot instance with an emulated trusted platform module (TPM)"},{"line_number":1757,"context_line":"status\u003doptional"},{"line_number":1758,"context_line":"notes\u003dAllows VMs to be booted with an emulated trusted platform module (TMP)"},{"line_number":1759,"context_line":"  device. Only lifecycle operations performed by the VM owner are supported, as"},{"line_number":1760,"context_line":"  the user\u0027s credentials are required to unlock the virtual device files on the"},{"line_number":1761,"context_line":"  host."}],"source_content_type":"text/x-properties","patch_set":31,"id":"3fa7e38b_5100d802","line":1758,"range":{"start_line":1758,"start_character":72,"end_line":1758,"end_character":75},"in_reply_to":"3fa7e38b_8b74e3d1","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":1763,"context_line":"driver.xenserver\u003dmissing"},{"line_number":1764,"context_line":"driver.libvirt-kvm-x86\u003dpartial"},{"line_number":1765,"context_line":"driver-notes.libvirt-kvm-x86\u003dLive migration is not yet supported."},{"line_number":1766,"context_line":"driver.libvirt-kvm-aarch64\u003dmissing"},{"line_number":1767,"context_line":"driver.libvirt-kvm-ppc64\u003dmissing"},{"line_number":1768,"context_line":"driver.libvirt-kvm-s390x\u003dmissing"},{"line_number":1769,"context_line":"driver.libvirt-qemu-x86\u003dpartial"},{"line_number":1770,"context_line":"driver-notes.libvirt-qemu-x86\u003dLive migration is not yet supported."},{"line_number":1771,"context_line":"driver.libvirt-lxc\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":31,"id":"3fa7e38b_6b7967c3","line":1768,"range":{"start_line":1766,"start_character":0,"end_line":1768,"end_character":32},"updated":"2019-11-14 19:25:25.000000000","message":"Wait, do we get to claim these? Should we test them first? Maybe mark as `unknown` right now?","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":1763,"context_line":"driver.xenserver\u003dmissing"},{"line_number":1764,"context_line":"driver.libvirt-kvm-x86\u003dpartial"},{"line_number":1765,"context_line":"driver-notes.libvirt-kvm-x86\u003dLive migration is not yet supported."},{"line_number":1766,"context_line":"driver.libvirt-kvm-aarch64\u003dmissing"},{"line_number":1767,"context_line":"driver.libvirt-kvm-ppc64\u003dmissing"},{"line_number":1768,"context_line":"driver.libvirt-kvm-s390x\u003dmissing"},{"line_number":1769,"context_line":"driver.libvirt-qemu-x86\u003dpartial"},{"line_number":1770,"context_line":"driver-notes.libvirt-qemu-x86\u003dLive migration is not yet supported."},{"line_number":1771,"context_line":"driver.libvirt-lxc\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":31,"id":"3fa7e38b_51be98ae","line":1768,"range":{"start_line":1766,"start_character":0,"end_line":1768,"end_character":32},"in_reply_to":"3fa7e38b_6b7967c3","updated":"2019-11-14 21:27:20.000000000","message":"Per the spec (a bit I didn\u0027t write), only x86, so this is correct https://review.opendev.org/#/c/686804/6/specs/ussuri/approved/add-emulated-virtual-tpm.rst@63","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"}],"nova/crypto.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def ensure_vtpm_secret(context, instance):"},{"line_number":169,"context_line":"    \"\"\"Communicates with the key manager service to retrieve or create a secret"},{"line_number":170,"context_line":"    for an instance\u0027s emulated TPM."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    :param context: Nova auth context."},{"line_number":173,"context_line":"    :param instance: Instance object."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_ab1d1f78","line":170,"updated":"2019-11-14 19:25:25.000000000","message":"This should mention the side effect that the instance\u0027s system_metadata[\u0027vtpm_secret_uuid\u0027] is set when the method succeeds.","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def ensure_vtpm_secret(context, instance):"},{"line_number":169,"context_line":"    \"\"\"Communicates with the key manager service to retrieve or create a secret"},{"line_number":170,"context_line":"    for an instance\u0027s emulated TPM."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    :param context: Nova auth context."},{"line_number":173,"context_line":"    :param instance: Instance object."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_9c3427e1","line":170,"in_reply_to":"3fa7e38b_ab1d1f78","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                \"was manually deleted from the key manager service. Your vTPM \""},{"line_number":196,"context_line":"                \"is likely to be unrecoverable.\","},{"line_number":197,"context_line":"                secret_uuid, instance\u003dinstance)"},{"line_number":198,"context_line":"            raise"},{"line_number":199,"context_line":"    # If we get here, the instance has no vtpm_secret_uuid. Create a new one"},{"line_number":200,"context_line":"    # and register it with the key manager."},{"line_number":201,"context_line":"    secret \u003d base64.b64encode(os.urandom(_VTPM_SECRET_BYTE_LENGTH))"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_4b57cb27","line":198,"range":{"start_line":198,"start_character":12,"end_line":198,"end_character":17},"updated":"2019-11-14 19:25:25.000000000","message":"We don\u0027t need to use save_and_reraise anymore with just log messages, right?","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    # Castellan ManagedObject"},{"line_number":203,"context_line":"    cmo \u003d passphrase.Passphrase("},{"line_number":204,"context_line":"        secret, name\u003d\"vTPM secret for instance %s\" % instance.uuid)"},{"line_number":205,"context_line":"    secret_uuid \u003d key_mgr.store(context, cmo)"},{"line_number":206,"context_line":"    instance.system_metadata[\u0027vtpm_secret_uuid\u0027] \u003d secret_uuid"},{"line_number":207,"context_line":"    instance.save()"},{"line_number":208,"context_line":"    return secret_uuid, secret"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_6b008703","line":205,"updated":"2019-11-14 19:25:25.000000000","message":"LOG.debug(\"Created vTPM secret with UUID %s\", secret_uuid, instance\u003dinstance)","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    # Castellan ManagedObject"},{"line_number":203,"context_line":"    cmo \u003d passphrase.Passphrase("},{"line_number":204,"context_line":"        secret, name\u003d\"vTPM secret for instance %s\" % instance.uuid)"},{"line_number":205,"context_line":"    secret_uuid \u003d key_mgr.store(context, cmo)"},{"line_number":206,"context_line":"    instance.system_metadata[\u0027vtpm_secret_uuid\u0027] \u003d secret_uuid"},{"line_number":207,"context_line":"    instance.save()"},{"line_number":208,"context_line":"    return secret_uuid, secret"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_fc4afb58","line":205,"in_reply_to":"3fa7e38b_6b008703","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":213,"context_line":"    instance\u0027s emulated TPM."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    This operation is idempotent: if the instance never had a vTPM secret, OR"},{"line_number":216,"context_line":"    if the secret has already been deleted, it is a no-op."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    :param context: Nova auth context."},{"line_number":219,"context_line":"    :param instance: Instance object."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_6b2727c9","line":216,"updated":"2019-11-14 19:25:25.000000000","message":"This should mention the side effect that the instance\u0027s system_metadata[\u0027vtpm_secret_uuid\u0027] is unset when the method succeeds.","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":213,"context_line":"    instance\u0027s emulated TPM."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    This operation is idempotent: if the instance never had a vTPM secret, OR"},{"line_number":216,"context_line":"    if the secret has already been deleted, it is a no-op."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    :param context: Nova auth context."},{"line_number":219,"context_line":"    :param instance: Instance object."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_3c33b3f8","line":216,"in_reply_to":"3fa7e38b_6b2727c9","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    key_mgr \u003d _get_key_manager()"},{"line_number":229,"context_line":"    try:"},{"line_number":230,"context_line":"        key_mgr.delete(context, secret_uuid)"},{"line_number":231,"context_line":"    except castellan_exception.ManagedObjectNotFoundError:"},{"line_number":232,"context_line":"        LOG.debug(\"vTPM secret with UUID %s already deleted or never existed.\","},{"line_number":233,"context_line":"                  secret_uuid)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_d6091e2b","line":230,"updated":"2019-11-14 19:25:25.000000000","message":"LOG.debug(\"Deleted vTPM secret with UUID %s\", secret_uuid, instance\u003dinstance)","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    key_mgr \u003d _get_key_manager()"},{"line_number":229,"context_line":"    try:"},{"line_number":230,"context_line":"        key_mgr.delete(context, secret_uuid)"},{"line_number":231,"context_line":"    except castellan_exception.ManagedObjectNotFoundError:"},{"line_number":232,"context_line":"        LOG.debug(\"vTPM secret with UUID %s already deleted or never existed.\","},{"line_number":233,"context_line":"                  secret_uuid)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_1c4ef76d","line":230,"in_reply_to":"3fa7e38b_d6091e2b","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"515822a3777f384ed1edfffe6e55bc81631caf0c","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"_VTPM_SECRET_BYTE_LENGTH \u003d 384"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def _get_key_manager():"},{"line_number":54,"context_line":"    global _KEYMGR"},{"line_number":55,"context_line":"    if _KEYMGR is None:"},{"line_number":56,"context_line":"        _KEYMGR \u003d key_manager.API(configuration\u003dCONF)"}],"source_content_type":"text/x-python","patch_set":34,"id":"ff570b3c_eac148e6","line":53,"updated":"2020-05-14 16:48:49.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"e94df57f731ca4639484c0dafbbdb259567eb308"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"cd4d84fed48d0c7e63b7b9e4ed3045f0eb97c4f4","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"_VTPM_SECRET_BYTE_LENGTH \u003d 384"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def _get_key_manager():"},{"line_number":54,"context_line":"    global _KEYMGR"},{"line_number":55,"context_line":"    if _KEYMGR is None:"},{"line_number":56,"context_line":"        _KEYMGR \u003d key_manager.API(configuration\u003dCONF)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ff570b3c_db8b5c1c","line":53,"updated":"2020-05-15 23:27:24.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"ec8e66d43511ff6c4988491d99b2c3e059a71fec"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a5eca23818ca13de34378e5585979407a05f1d36","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"_VTPM_SECRET_BYTE_LENGTH \u003d 384"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def _get_key_manager():"},{"line_number":54,"context_line":"    global _KEYMGR"},{"line_number":55,"context_line":"    if _KEYMGR is None:"},{"line_number":56,"context_line":"        _KEYMGR \u003d key_manager.API(configuration\u003dCONF)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ff570b3c_6c1083a9","line":53,"in_reply_to":"ff570b3c_db8b5c1c","updated":"2020-05-20 17:13:57.000000000","message":"Done","commit_id":"ec8e66d43511ff6c4988491d99b2c3e059a71fec"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    :param context: Nova auth context."},{"line_number":175,"context_line":"    :param instance: Instance object."},{"line_number":176,"context_line":"    :return: A tuple comprising (secret_uuid, passphrase)."},{"line_number":177,"context_line":"    :raise: castellan exceptions if communication with the key manager API"},{"line_number":178,"context_line":"        fails, or if a vtpm_secret_uuid was present in the instance\u0027s system"},{"line_number":179,"context_line":"        metadata but could not be found in the key manager service."},{"line_number":180,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_b43539ab","line":177,"range":{"start_line":177,"start_character":12,"end_line":177,"end_character":32},"updated":"2020-07-02 11:56:10.000000000","message":"Do we have a common base type for those?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    :param context: Nova auth context."},{"line_number":175,"context_line":"    :param instance: Instance object."},{"line_number":176,"context_line":"    :return: A tuple comprising (secret_uuid, passphrase)."},{"line_number":177,"context_line":"    :raise: castellan exceptions if communication with the key manager API"},{"line_number":178,"context_line":"        fails, or if a vtpm_secret_uuid was present in the instance\u0027s system"},{"line_number":179,"context_line":"        metadata but could not be found in the key manager service."},{"line_number":180,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_2ac70448","line":177,"range":{"start_line":177,"start_character":12,"end_line":177,"end_character":32},"in_reply_to":"bf51134e_b43539ab","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    # If we get here, the instance has no vtpm_secret_uuid. Create a new one"},{"line_number":203,"context_line":"    # and register it with the key manager."},{"line_number":204,"context_line":"    secret \u003d base64.b64encode(os.urandom(_VTPM_SECRET_BYTE_LENGTH))"},{"line_number":205,"context_line":"    # Castellan ManagedObject"},{"line_number":206,"context_line":"    cmo \u003d passphrase.Passphrase("},{"line_number":207,"context_line":"        secret, name\u003d\"vTPM secret for instance %s\" % instance.uuid)"},{"line_number":208,"context_line":"    secret_uuid \u003d key_mgr.store(context, cmo)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_f45851fb","line":205,"updated":"2020-07-02 11:56:10.000000000","message":"this is almost like a type hint ;)","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    # If we get here, the instance has no vtpm_secret_uuid. Create a new one"},{"line_number":203,"context_line":"    # and register it with the key manager."},{"line_number":204,"context_line":"    secret \u003d base64.b64encode(os.urandom(_VTPM_SECRET_BYTE_LENGTH))"},{"line_number":205,"context_line":"    # Castellan ManagedObject"},{"line_number":206,"context_line":"    cmo \u003d passphrase.Passphrase("},{"line_number":207,"context_line":"        secret, name\u003d\"vTPM secret for instance %s\" % instance.uuid)"},{"line_number":208,"context_line":"    secret_uuid \u003d key_mgr.store(context, cmo)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_0affa067","line":205,"in_reply_to":"bf51134e_f45851fb","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    :param context: Nova auth context."},{"line_number":228,"context_line":"    :param instance: Instance object."},{"line_number":229,"context_line":"    :return: A tuple comprising (secret_uuid, passphrase)."},{"line_number":230,"context_line":"    :raise: castellan exceptions if communication with the key manager API"},{"line_number":231,"context_line":"        fails."},{"line_number":232,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_34f769d7","line":229,"updated":"2020-07-02 11:56:10.000000000","message":":return: None","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    :param context: Nova auth context."},{"line_number":228,"context_line":"    :param instance: Instance object."},{"line_number":229,"context_line":"    :return: A tuple comprising (secret_uuid, passphrase)."},{"line_number":230,"context_line":"    :raise: castellan exceptions if communication with the key manager API"},{"line_number":231,"context_line":"        fails."},{"line_number":232,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_aa095496","line":229,"in_reply_to":"bf51134e_34f769d7","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    :param context: Nova auth context."},{"line_number":228,"context_line":"    :param instance: Instance object."},{"line_number":229,"context_line":"    :return: A tuple comprising (secret_uuid, passphrase)."},{"line_number":230,"context_line":"    :raise: castellan exceptions if communication with the key manager API"},{"line_number":231,"context_line":"        fails."},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_14f4e5ce","line":230,"range":{"start_line":230,"start_character":12,"end_line":230,"end_character":32},"updated":"2020-07-02 11:56:10.000000000","message":"ditto as above","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    :param context: Nova auth context."},{"line_number":228,"context_line":"    :param instance: Instance object."},{"line_number":229,"context_line":"    :return: A tuple comprising (secret_uuid, passphrase)."},{"line_number":230,"context_line":"    :raise: castellan exceptions if communication with the key manager API"},{"line_number":231,"context_line":"        fails."},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_ca048881","line":230,"range":{"start_line":230,"start_character":12,"end_line":230,"end_character":32},"in_reply_to":"bf51134e_14f4e5ce","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"}],"nova/tests/functional/libvirt/base.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        qemu_version\u003dfakelibvirt.FAKE_QEMU_VERSION,"},{"line_number":105,"context_line":"        mdev_info\u003dNone, hostname\u003dNone,"},{"line_number":106,"context_line":"    ):"},{"line_number":107,"context_line":"        if not host_info:"},{"line_number":108,"context_line":"            host_info \u003d fakelibvirt.HostInfo("},{"line_number":109,"context_line":"                cpu_nodes\u003d2, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d2,"},{"line_number":110,"context_line":"                kB_mem\u003d16 * 1024 ** 2,  # 16 GB"}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_af1892d2","line":107,"updated":"2020-08-26 12:31:52.000000000","message":"this doesn\u0027t sound a crucial modification for the change itself, but OK.","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"}],"nova/tests/functional/libvirt/test_vtpm.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        server \u003d self._create_server("},{"line_number":165,"context_line":"            flavor_id\u003dflavor_id, expected_state\u003d\u0027ACTIVE\u0027)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # ensure our instance\u0027s system_metadata field and key manager inventory"},{"line_number":168,"context_line":"        # is correct"},{"line_number":169,"context_line":"        ctx \u003d nova_context.get_admin_context()"},{"line_number":170,"context_line":"        instance \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":171,"context_line":"        self.assertIn(\u0027vtpm_secret_uuid\u0027, instance.system_metadata)"},{"line_number":172,"context_line":"        self.assertEqual(1, len(self.key_mgr._passphrases))"},{"line_number":173,"context_line":"        self.assertIn("},{"line_number":174,"context_line":"            instance.system_metadata[\u0027vtpm_secret_uuid\u0027],"},{"line_number":175,"context_line":"            self.key_mgr._passphrases)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # now delete the server"},{"line_number":178,"context_line":"        self._delete_server(server)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_19b74c88","line":175,"range":{"start_line":167,"start_character":0,"end_line":175,"end_character":38},"updated":"2020-08-07 14:48:19.000000000","message":"This is repeated several times. We can pull this out to an assert_instance_has_keys_in_key_manager() function.","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15602ebd5a202e484676c2f24df7741d57ba0853","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        server \u003d self._create_server("},{"line_number":165,"context_line":"            flavor_id\u003dflavor_id, expected_state\u003d\u0027ACTIVE\u0027)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # ensure our instance\u0027s system_metadata field and key manager inventory"},{"line_number":168,"context_line":"        # is correct"},{"line_number":169,"context_line":"        ctx \u003d nova_context.get_admin_context()"},{"line_number":170,"context_line":"        instance \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":171,"context_line":"        self.assertIn(\u0027vtpm_secret_uuid\u0027, instance.system_metadata)"},{"line_number":172,"context_line":"        self.assertEqual(1, len(self.key_mgr._passphrases))"},{"line_number":173,"context_line":"        self.assertIn("},{"line_number":174,"context_line":"            instance.system_metadata[\u0027vtpm_secret_uuid\u0027],"},{"line_number":175,"context_line":"            self.key_mgr._passphrases)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # now delete the server"},{"line_number":178,"context_line":"        self._delete_server(server)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_bdc8b954","line":175,"range":{"start_line":167,"start_character":0,"end_line":175,"end_character":38},"in_reply_to":"9f560f44_19b74c88","updated":"2020-08-10 10:30:55.000000000","message":"Done","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":57,"id":"9f560f44_392210ba","line":251,"updated":"2020-08-07 14:48:19.000000000","message":"Nice tests, thanks!\n\nI would added the negative tests for not supported operations here as well and then later when we add support we just need to replace those test to become positive. \n\nBut this is just me. I\u0027m totally OK with your approach to have the negative test live in the unit test suite.","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"10d01fabd67e04a7515188eda69c2c9598eff5d7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"#: Libvirt version to match MIN_LIBVIRT_VTPM in driver.py"},{"line_number":35,"context_line":"FAKE_LIBVIRT_VERSION \u003d 5_006_000"},{"line_number":36,"context_line":"#: QEMU version to match MIN_QEMU_VTPM in driver.py"},{"line_number":37,"context_line":"FAKE_QEMU_VERSION \u003d 2_011_000"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_d30eece3","line":35,"range":{"start_line":35,"start_character":23,"end_line":35,"end_character":32},"updated":"2020-08-17 11:35:24.000000000","message":"nit - Use versionutils.convert_version_to_int to convert human readable versions","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e6f3f5dec75fbd798db8459f56ac7ca21bef932","unresolved":false,"context_lines":[{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"#: Libvirt version to match MIN_LIBVIRT_VTPM in driver.py"},{"line_number":35,"context_line":"FAKE_LIBVIRT_VERSION \u003d 5_006_000"},{"line_number":36,"context_line":"#: QEMU version to match MIN_QEMU_VTPM in driver.py"},{"line_number":37,"context_line":"FAKE_QEMU_VERSION \u003d 2_011_000"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_d79f814d","line":35,"range":{"start_line":35,"start_character":23,"end_line":35,"end_character":32},"in_reply_to":"9f560f44_d30eece3","updated":"2020-08-24 16:44:57.000000000","message":"Done","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"10d01fabd67e04a7515188eda69c2c9598eff5d7","unresolved":false,"context_lines":[{"line_number":34,"context_line":"#: Libvirt version to match MIN_LIBVIRT_VTPM in driver.py"},{"line_number":35,"context_line":"FAKE_LIBVIRT_VERSION \u003d 5_006_000"},{"line_number":36,"context_line":"#: QEMU version to match MIN_QEMU_VTPM in driver.py"},{"line_number":37,"context_line":"FAKE_QEMU_VERSION \u003d 2_011_000"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class FakeKeyManager(key_manager.KeyManager):"}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_13f864c2","line":37,"range":{"start_line":37,"start_character":20,"end_line":37,"end_character":29},"updated":"2020-08-17 11:35:24.000000000","message":"Ditto","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e6f3f5dec75fbd798db8459f56ac7ca21bef932","unresolved":false,"context_lines":[{"line_number":34,"context_line":"#: Libvirt version to match MIN_LIBVIRT_VTPM in driver.py"},{"line_number":35,"context_line":"FAKE_LIBVIRT_VERSION \u003d 5_006_000"},{"line_number":36,"context_line":"#: QEMU version to match MIN_QEMU_VTPM in driver.py"},{"line_number":37,"context_line":"FAKE_QEMU_VERSION \u003d 2_011_000"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class FakeKeyManager(key_manager.KeyManager):"}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_77b835c7","line":37,"range":{"start_line":37,"start_character":20,"end_line":37,"end_character":29},"in_reply_to":"9f560f44_13f864c2","updated":"2020-08-24 16:44:57.000000000","message":"Done","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"10d01fabd67e04a7515188eda69c2c9598eff5d7","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        # is still correct"},{"line_number":213,"context_line":"        self.assertInstanceHasSecret(server)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_soft_reboot_server(self):"},{"line_number":216,"context_line":"        fake_connection \u003d self._get_connection("},{"line_number":217,"context_line":"            libvirt_version\u003dFAKE_LIBVIRT_VERSION,"},{"line_number":218,"context_line":"            qemu_version\u003dFAKE_QEMU_VERSION,"}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_73d5601b","line":215,"range":{"start_line":215,"start_character":0,"end_line":215,"end_character":38},"updated":"2020-08-17 11:35:24.000000000","message":"What about hard reboot where we recreate the instance?","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e6f3f5dec75fbd798db8459f56ac7ca21bef932","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        # is still correct"},{"line_number":213,"context_line":"        self.assertInstanceHasSecret(server)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_soft_reboot_server(self):"},{"line_number":216,"context_line":"        fake_connection \u003d self._get_connection("},{"line_number":217,"context_line":"            libvirt_version\u003dFAKE_LIBVIRT_VERSION,"},{"line_number":218,"context_line":"            qemu_version\u003dFAKE_QEMU_VERSION,"}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_b7ae4d7e","line":215,"range":{"start_line":215,"start_character":0,"end_line":215,"end_character":38},"in_reply_to":"9f560f44_73d5601b","updated":"2020-08-24 16:44:57.000000000","message":"Good point. Done","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        self.key_mgr \u003d crypto._get_key_manager()"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # TODO(stephenfin): This should be moved to the base class"},{"line_number":144,"context_line":"    def start_compute(self, hostname\u003d\u0027compute1\u0027):"},{"line_number":145,"context_line":"        libvirt_version \u003d versionutils.convert_version_to_int("},{"line_number":146,"context_line":"            driver.MIN_LIBVIRT_VTPM)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_2f73e2e8","line":143,"updated":"2020-08-26 12:31:52.000000000","message":"we unfortunately have a number of callers like this. Factorizing it isn\u0027t trivial and I feel your pain, fwiw.","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            driver.MIN_LIBVIRT_VTPM)"},{"line_number":147,"context_line":"        qemu_version \u003d versionutils.convert_version_to_int("},{"line_number":148,"context_line":"            driver.MIN_QEMU_VTPM)"},{"line_number":149,"context_line":"        fake_connection \u003d self._get_connection("},{"line_number":150,"context_line":"            libvirt_version\u003dlibvirt_version, qemu_version\u003dqemu_version,"},{"line_number":151,"context_line":"            hostname\u003dhostname)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_af3532f9","line":149,"updated":"2020-08-26 12:31:52.000000000","message":"see, you could have generated a fake HostInfo before like others...","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"}],"nova/tests/unit/virt/libvirt/fakelibvirt.py":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"10d01fabd67e04a7515188eda69c2c9598eff5d7","unresolved":false,"context_lines":[{"line_number":122,"context_line":"VIR_DOMAIN_START_PAUSED \u003d 1"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# libvirtError enums"},{"line_number":125,"context_line":"# (Intentionally different from what\u0027s in libvirt. We do this to check,"},{"line_number":126,"context_line":"#  that consumers of the library are using the symbolic names rather than"},{"line_number":127,"context_line":"#  hardcoding the numerical values)"},{"line_number":128,"context_line":"VIR_FROM_QEMU \u003d 100"},{"line_number":129,"context_line":"VIR_FROM_DOMAIN \u003d 200"},{"line_number":130,"context_line":"VIR_FROM_SECRET \u003d 300"}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_13e6a417","line":127,"range":{"start_line":125,"start_character":0,"end_line":127,"end_character":35},"updated":"2020-08-17 11:35:24.000000000","message":"meh this is just odd FWIW, some of the enums below are actually correct.","commit_id":"5d66ec411f436e1836a8e29cfd56cb9f37bc8f7c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"VIR_FROM_REMOTE \u003d 340"},{"line_number":133,"context_line":"VIR_FROM_RPC \u003d 345"},{"line_number":134,"context_line":"VIR_FROM_NODEDEV \u003d 666"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"VIR_ERR_INVALID_ARG \u003d 8"},{"line_number":137,"context_line":"VIR_ERR_NO_SUPPORT \u003d 3"},{"line_number":138,"context_line":"VIR_ERR_XML_ERROR \u003d 27"}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_8f05ce16","line":135,"updated":"2020-08-26 12:31:52.000000000","message":"unnecessary change","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":1387,"context_line":"        return self._value"},{"line_number":1388,"context_line":""},{"line_number":1389,"context_line":"    def undefine(self):"},{"line_number":1390,"context_line":"        self._connection._remove_secret(self)"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":""},{"line_number":1393,"context_line":"class Connection(object):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_6f003a03","line":1390,"updated":"2020-08-26 12:31:52.000000000","message":"++","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fe2e01b98fdefb927489a7492978481725c7da36","unresolved":false,"context_lines":[{"line_number":23147,"context_line":"                                network_info, disk_info,"},{"line_number":23148,"context_line":"                                image_meta)"},{"line_number":23149,"context_line":""},{"line_number":23150,"context_line":"        except nova.exception.Invalid:"},{"line_number":23151,"context_line":"            success \u003d True"},{"line_number":23152,"context_line":"            pass"},{"line_number":23153,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dfbec78f_1794f78a","line":23150,"range":{"start_line":23150,"start_character":15,"end_line":23150,"end_character":37},"updated":"2019-05-03 14:11:01.000000000","message":"exception.Invalid\n(See line 70)","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"            drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":1470,"context_line":"            drvr.init_host(\"dummyhost\")"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def test__check__vtpm_support_non_qemu(self):"},{"line_number":1473,"context_line":"        \"\"\"Test checking for vTPM support when we\u0027re not using QEMU or KVM.\"\"\""},{"line_number":1474,"context_line":"        self.flags(swtpm_enabled\u003dTrue, virt_type\u003d\u0027lxc\u0027, group\u003d\u0027libvirt\u0027)"},{"line_number":1475,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_0f569207","line":1472,"range":{"start_line":1472,"start_character":19,"end_line":1472,"end_character":21},"updated":"2020-07-02 11:56:10.000000000","message":"double dash","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"            drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":1470,"context_line":"            drvr.init_host(\"dummyhost\")"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def test__check__vtpm_support_non_qemu(self):"},{"line_number":1473,"context_line":"        \"\"\"Test checking for vTPM support when we\u0027re not using QEMU or KVM.\"\"\""},{"line_number":1474,"context_line":"        self.flags(swtpm_enabled\u003dTrue, virt_type\u003d\u0027lxc\u0027, group\u003d\u0027libvirt\u0027)"},{"line_number":1475,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_2a68a41f","line":1472,"range":{"start_line":1472,"start_character":19,"end_line":1472,"end_character":21},"in_reply_to":"bf51134e_0f569207","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"        mock_which.assert_has_calls("},{"line_number":1533,"context_line":"            [mock.call(\u0027swtpm_setup\u0027), mock.call().__bool__()],"},{"line_number":1534,"context_line":"        )"},{"line_number":1535,"context_line":"        mock_version.assert_called_with(lv_ver\u003d(5, 6, 0), hv_ver\u003d(2, 11, 0))"},{"line_number":1536,"context_line":""},{"line_number":1537,"context_line":"    @mock.patch.object(libvirt_driver.LOG, \u0027warning\u0027)"},{"line_number":1538,"context_line":"    def test_check_cpu_set_configuration__no_configuration(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_af9e86b5","line":1535,"updated":"2020-07-02 11:56:10.000000000","message":"I think an assert is missing about the value of drvr.supports_vtpm","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":1532,"context_line":"        mock_which.assert_has_calls("},{"line_number":1533,"context_line":"            [mock.call(\u0027swtpm_setup\u0027), mock.call().__bool__()],"},{"line_number":1534,"context_line":"        )"},{"line_number":1535,"context_line":"        mock_version.assert_called_with(lv_ver\u003d(5, 6, 0), hv_ver\u003d(2, 11, 0))"},{"line_number":1536,"context_line":""},{"line_number":1537,"context_line":"    @mock.patch.object(libvirt_driver.LOG, \u0027warning\u0027)"},{"line_number":1538,"context_line":"    def test_check_cpu_set_configuration__no_configuration(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_ea5fcc6f","line":1535,"in_reply_to":"bf51134e_af9e86b5","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3080,"context_line":"        drvr.supports_vtpm \u003d True"},{"line_number":3081,"context_line":""},{"line_number":3082,"context_line":"        with drvr._vtpm_secret(self.context, instance):"},{"line_number":3083,"context_line":"            pass"},{"line_number":3084,"context_line":""},{"line_number":3085,"context_line":"        drvr._host.create_secret.assert_called_once_with("},{"line_number":3086,"context_line":"            \u0027vtpm\u0027, instance.uuid, password\u003dfake_passphrase, uuid\u003dfake_secret,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_0f7df26d","line":3083,"updated":"2020-07-02 11:56:10.000000000","message":"we should do the drvr._host.create_secret.assert_called_once_with() call under the context manager as we expect that the secret is created _before_ we enter the context.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":3080,"context_line":"        drvr.supports_vtpm \u003d True"},{"line_number":3081,"context_line":""},{"line_number":3082,"context_line":"        with drvr._vtpm_secret(self.context, instance):"},{"line_number":3083,"context_line":"            pass"},{"line_number":3084,"context_line":""},{"line_number":3085,"context_line":"        drvr._host.create_secret.assert_called_once_with("},{"line_number":3086,"context_line":"            \u0027vtpm\u0027, instance.uuid, password\u003dfake_passphrase, uuid\u003dfake_secret,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_cac5a80c","line":3083,"in_reply_to":"bf51134e_0f7df26d","updated":"2020-07-03 11:18:05.000000000","message":"Good idea. Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":15629,"context_line":"                              return_value\u003dNone),"},{"line_number":15630,"context_line":"            mock.patch.object(objects.Service, \"get_by_compute_host\","},{"line_number":15631,"context_line":"                              return_value\u003dservice_mock),"},{"line_number":15632,"context_line":"            mock.patch(\u0027shutil.which\u0027, return_value\u003dFalse),"},{"line_number":15633,"context_line":"            mock.patch.object(host.Host, \"get_capabilities\")):"},{"line_number":15634,"context_line":""},{"line_number":15635,"context_line":"            drvr.init_host(\"wibble\")"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_8fe5823b","line":15632,"updated":"2020-07-02 11:56:10.000000000","message":"This seems to be unnecessary","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":15629,"context_line":"                              return_value\u003dNone),"},{"line_number":15630,"context_line":"            mock.patch.object(objects.Service, \"get_by_compute_host\","},{"line_number":15631,"context_line":"                              return_value\u003dservice_mock),"},{"line_number":15632,"context_line":"            mock.patch(\u0027shutil.which\u0027, return_value\u003dFalse),"},{"line_number":15633,"context_line":"            mock.patch.object(host.Host, \"get_capabilities\")):"},{"line_number":15634,"context_line":""},{"line_number":15635,"context_line":"            drvr.init_host(\"wibble\")"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_aac154e7","line":15632,"in_reply_to":"bf51134e_8fe5823b","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":20839,"context_line":"        old_supports_vtpm \u003d self.driver.supports_vtpm"},{"line_number":20840,"context_line":"        self.driver.supports_vtpm \u003d True"},{"line_number":20841,"context_line":"        self._test_update_provider_tree()"},{"line_number":20842,"context_line":"        self.driver.supports_vtpm \u003d old_supports_vtpm"},{"line_number":20843,"context_line":"        for trait in (\u0027COMPUTE_SECURITY_TPM_2_0\u0027, \u0027COMPUTE_SECURITY_TPM_1_2\u0027):"},{"line_number":20844,"context_line":"            self.assertIn(trait, self.pt.data(self.cn_rp[\u0027uuid\u0027]).traits)"},{"line_number":20845,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_cf35baaa","line":20842,"updated":"2020-07-02 11:56:10.000000000","message":"self.driver is created in setUp() so we don\u0027t have to restore the values on it.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":20839,"context_line":"        old_supports_vtpm \u003d self.driver.supports_vtpm"},{"line_number":20840,"context_line":"        self.driver.supports_vtpm \u003d True"},{"line_number":20841,"context_line":"        self._test_update_provider_tree()"},{"line_number":20842,"context_line":"        self.driver.supports_vtpm \u003d old_supports_vtpm"},{"line_number":20843,"context_line":"        for trait in (\u0027COMPUTE_SECURITY_TPM_2_0\u0027, \u0027COMPUTE_SECURITY_TPM_1_2\u0027):"},{"line_number":20844,"context_line":"            self.assertIn(trait, self.pt.data(self.cn_rp[\u0027uuid\u0027]).traits)"},{"line_number":20845,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_2aad4431","line":20842,"in_reply_to":"bf51134e_cf35baaa","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"        self.flags(swtpm_enabled\u003dTrue, group\u003d\u0027libvirt\u0027)"},{"line_number":1063,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":1064,"context_line":"        self.assertTrue("},{"line_number":1065,"context_line":"            drvr.capabilities[\u0027supports_image_type_ploop\u0027],"},{"line_number":1066,"context_line":"            \"Driver capabilities for \u0027supports_vtpm\u0027 is invalid when \""},{"line_number":1067,"context_line":"            \"\u0027swtpm_enabled\u003dTrue\u0027\""},{"line_number":1068,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":48,"id":"bf51134e_8970770a","line":1065,"range":{"start_line":1065,"start_character":31,"end_line":1065,"end_character":56},"updated":"2020-08-07 14:48:19.000000000","message":"copy pasta. But why does it pass the test?","commit_id":"3fcf31b4fcee7bfb68b180b808d6444f0911cec4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        exc \u003d self.assertRaises(exception.InvalidConfiguration,"},{"line_number":1526,"context_line":"                                drvr.init_host, \u0027dummyhost\u0027)"},{"line_number":1527,"context_line":"        self.assertIn(\"vTPM support requires \u0027[libvirt] virt_type\u0027 of \u0027qemu\u0027 \""},{"line_number":1528,"context_line":"                      \"or \u0027kvm\u0027; found lxc.\", six.text_type(exc))"},{"line_number":1529,"context_line":""},{"line_number":1530,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027)"},{"line_number":1531,"context_line":"    def test__check_vtpm_support_old_qemu(self, mock_version):"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_d4d47b4a","line":1528,"updated":"2020-08-07 14:48:19.000000000","message":"we should assert that the tpm capabilities is now reported accordingly.","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15602ebd5a202e484676c2f24df7741d57ba0853","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        exc \u003d self.assertRaises(exception.InvalidConfiguration,"},{"line_number":1526,"context_line":"                                drvr.init_host, \u0027dummyhost\u0027)"},{"line_number":1527,"context_line":"        self.assertIn(\"vTPM support requires \u0027[libvirt] virt_type\u0027 of \u0027qemu\u0027 \""},{"line_number":1528,"context_line":"                      \"or \u0027kvm\u0027; found lxc.\", six.text_type(exc))"},{"line_number":1529,"context_line":""},{"line_number":1530,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027)"},{"line_number":1531,"context_line":"    def test__check_vtpm_support_old_qemu(self, mock_version):"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_7de8e1b1","line":1528,"in_reply_to":"9f560f44_d4d47b4a","updated":"2020-08-10 10:30:55.000000000","message":"The \u0027_check_vtpm_support\u0027 function doesn\u0027t have any side effects. Rather, we enable our configuration based on the configuration option and simply ensure this is valid when initializing using this function. As such, it doesn\u0027t really make sense to check the capabilities here.\n\nDitto for below","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":1544,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":1545,"context_line":"        exc \u003d self.assertRaises(exception.InvalidConfiguration,"},{"line_number":1546,"context_line":"                                drvr.init_host, \u0027dummyhost\u0027)"},{"line_number":1547,"context_line":"        self.assertIn(\"vTPM support requires QEMU version\", six.text_type(exc))"},{"line_number":1548,"context_line":""},{"line_number":1549,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":1550,"context_line":"    @mock.patch(\u0027shutil.which\u0027)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_94e5e33a","line":1547,"updated":"2020-08-07 14:48:19.000000000","message":"we should assert that the tpm capabilities is now reported accordingly.","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        mock_which.assert_has_calls("},{"line_number":1568,"context_line":"            [mock.call(\u0027swtpm_setup\u0027), mock.call(\u0027swtpm\u0027)],"},{"line_number":1569,"context_line":"        )"},{"line_number":1570,"context_line":""},{"line_number":1571,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027)"},{"line_number":1572,"context_line":"    @mock.patch(\u0027shutil.which\u0027)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_54dfcb67","line":1569,"updated":"2020-08-07 14:48:19.000000000","message":"we should assert that the tpm capabilities is now reported accordingly.","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":1583,"context_line":"        mock_which.assert_has_calls("},{"line_number":1584,"context_line":"            [mock.call(\u0027swtpm_setup\u0027), mock.call().__bool__()],"},{"line_number":1585,"context_line":"        )"},{"line_number":1586,"context_line":"        mock_version.assert_called_with(lv_ver\u003d(5, 6, 0), hv_ver\u003d(2, 11, 0))"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"    @mock.patch.object(libvirt_driver.LOG, \u0027warning\u0027)"},{"line_number":1589,"context_line":"    def test_check_cpu_set_configuration__no_configuration(self, mock_log):"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_546cebcc","line":1586,"updated":"2020-08-07 14:48:19.000000000","message":"As a follow up on https://review.opendev.org/#/c/631363/43/nova/tests/unit/virt/libvirt/test_driver.py@1535\n\nhere now we can check the state of tpm capability","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"}],"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        if isinstance(expected, type) and issubclass(expected, Exception):"},{"line_number":4505,"context_line":"            with testtools.ExpectedException(expected):"},{"line_number":4506,"context_line":"                print(hw.get_vtpm_constraint(flavor, image_meta))"},{"line_number":4507,"context_line":"        else:"},{"line_number":4508,"context_line":"            hw.get_vtpm_constraint(flavor, image_meta)"},{"line_number":4509,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_b4eed988","line":4506,"range":{"start_line":4506,"start_character":16,"end_line":4506,"end_character":21},"updated":"2020-07-02 11:56:10.000000000","message":"drop the print() call","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":4503,"context_line":""},{"line_number":4504,"context_line":"        if isinstance(expected, type) and issubclass(expected, Exception):"},{"line_number":4505,"context_line":"            with testtools.ExpectedException(expected):"},{"line_number":4506,"context_line":"                print(hw.get_vtpm_constraint(flavor, image_meta))"},{"line_number":4507,"context_line":"        else:"},{"line_number":4508,"context_line":"            hw.get_vtpm_constraint(flavor, image_meta)"},{"line_number":4509,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_6a7c5cb5","line":4506,"range":{"start_line":4506,"start_character":16,"end_line":4506,"end_character":21},"in_reply_to":"bf51134e_b4eed988","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":4505,"context_line":"            with testtools.ExpectedException(expected):"},{"line_number":4506,"context_line":"                print(hw.get_vtpm_constraint(flavor, image_meta))"},{"line_number":4507,"context_line":"        else:"},{"line_number":4508,"context_line":"            hw.get_vtpm_constraint(flavor, image_meta)"},{"line_number":4509,"context_line":""},{"line_number":4510,"context_line":""},{"line_number":4511,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_3402c93f","line":4508,"updated":"2020-07-02 11:56:10.000000000","message":"I think the assert of the return value is missing","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":4505,"context_line":"            with testtools.ExpectedException(expected):"},{"line_number":4506,"context_line":"                print(hw.get_vtpm_constraint(flavor, image_meta))"},{"line_number":4507,"context_line":"        else:"},{"line_number":4508,"context_line":"            hw.get_vtpm_constraint(flavor, image_meta)"},{"line_number":4509,"context_line":""},{"line_number":4510,"context_line":""},{"line_number":4511,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_aa4f9490","line":4508,"in_reply_to":"bf51134e_3402c93f","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"}],"nova/utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"        will have ``secret_uuid\u003dNone``."},{"line_number":1209,"context_line":"    :return: A VTPMConfig named tuple, or None if no vTPM configuration was"},{"line_number":1210,"context_line":"        found. The secret_uuid may be None if the instance has not yet been"},{"line_number":1211,"context_line":"        spawned, of if the sysmeta param was not specified."},{"line_number":1212,"context_line":"    :raise: FlavorImageConflict if a value is specified in both the flavor and"},{"line_number":1213,"context_line":"        the image, but the values do not match."},{"line_number":1214,"context_line":"    :raise: Invalid if a value or combination of values is invalid."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_164ed66d","line":1211,"range":{"start_line":1211,"start_character":27,"end_line":1211,"end_character":34},"updated":"2019-11-14 19:25:25.000000000","message":"``literal``","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"        will have ``secret_uuid\u003dNone``."},{"line_number":1209,"context_line":"    :return: A VTPMConfig named tuple, or None if no vTPM configuration was"},{"line_number":1210,"context_line":"        found. The secret_uuid may be None if the instance has not yet been"},{"line_number":1211,"context_line":"        spawned, of if the sysmeta param was not specified."},{"line_number":1212,"context_line":"    :raise: FlavorImageConflict if a value is specified in both the flavor and"},{"line_number":1213,"context_line":"        the image, but the values do not match."},{"line_number":1214,"context_line":"    :raise: Invalid if a value or combination of values is invalid."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_bc5483ff","line":1211,"range":{"start_line":1211,"start_character":27,"end_line":1211,"end_character":34},"in_reply_to":"3fa7e38b_164ed66d","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"}],"nova/virt/driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        \"\"\""},{"line_number":844,"context_line":"        raise NotImplementedError()"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    def unrescue(self, context, instance, network_info):"},{"line_number":847,"context_line":"        \"\"\"Unrescue the specified instance."},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        :param instance: nova.objects.instance.Instance"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_b66d82cd","line":846,"range":{"start_line":846,"start_character":0,"end_line":846,"end_character":56},"updated":"2019-11-14 19:25:25.000000000","message":"ML post for this","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        \"\"\""},{"line_number":844,"context_line":"        raise NotImplementedError()"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    def unrescue(self, context, instance, network_info):"},{"line_number":847,"context_line":"        \"\"\"Unrescue the specified instance."},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        :param instance: nova.objects.instance.Instance"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_9c3987d0","line":846,"range":{"start_line":846,"start_character":0,"end_line":846,"end_character":56},"in_reply_to":"3fa7e38b_b66d82cd","updated":"2019-11-14 21:27:20.000000000","message":"http://lists.openstack.org/pipermail/openstack-discuss/2019-November/010859.html","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    def unrescue(self, context, instance, network_info):"},{"line_number":847,"context_line":"        \"\"\"Unrescue the specified instance."},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        :param instance: nova.objects.instance.Instance"},{"line_number":850,"context_line":"        \"\"\""},{"line_number":851,"context_line":"        # TODO(Vek): Need to pass context in for access to auth_token"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_d6f35e08","line":848,"updated":"2019-11-14 19:25:25.000000000","message":"Is it worth bothering to document `context`?\n\nWhat about catch-up for network_info? (separately)","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    def unrescue(self, context, instance, network_info):"},{"line_number":847,"context_line":"        \"\"\"Unrescue the specified instance."},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        :param instance: nova.objects.instance.Instance"},{"line_number":850,"context_line":"        \"\"\""},{"line_number":851,"context_line":"        # TODO(Vek): Need to pass context in for access to auth_token"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_3c8f3376","line":848,"in_reply_to":"3fa7e38b_d6f35e08","updated":"2019-11-14 21:27:20.000000000","message":"Done and done (not separately)","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        :param instance: nova.objects.instance.Instance"},{"line_number":850,"context_line":"        \"\"\""},{"line_number":851,"context_line":"        # TODO(Vek): Need to pass context in for access to auth_token"},{"line_number":852,"context_line":"        raise NotImplementedError()"},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def power_off(self, instance, timeout\u003d0, retry_interval\u003d0):"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_7c95ab87","line":851,"range":{"start_line":851,"start_character":8,"end_line":851,"end_character":69},"updated":"2019-11-14 21:27:20.000000000","message":"o, I guess this can be removed now :)","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"}],"nova/virt/hardware.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":1837,"context_line":"    if version is None:"},{"line_number":1838,"context_line":"        return None"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    if version not in fields.TPMVersion.ALL:"},{"line_number":1841,"context_line":"        raise exception.Invalid("},{"line_number":1842,"context_line":"            \"Invalid TPM version %(version)r. Allowed values: %(valid)s.\" %"},{"line_number":1843,"context_line":"            {\u0027version\u0027: version, \u0027valid\u0027: \u0027, \u0027.join(fields.TPMVersion.ALL)}"},{"line_number":1844,"context_line":"        )"},{"line_number":1845,"context_line":""},{"line_number":1846,"context_line":"    model \u003d _get_unique_flavor_image_meta(\u0027tpm_model\u0027, flavor, image_meta)"},{"line_number":1847,"context_line":"    if model is None:"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_f4b051e0","line":1844,"range":{"start_line":1840,"start_character":1,"end_line":1844,"end_character":9},"updated":"2020-07-02 11:56:10.000000000","message":"When this could happen? We validate the flavor extra spec. Does image_meta validated by glance?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":1837,"context_line":"    if version is None:"},{"line_number":1838,"context_line":"        return None"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    if version not in fields.TPMVersion.ALL:"},{"line_number":1841,"context_line":"        raise exception.Invalid("},{"line_number":1842,"context_line":"            \"Invalid TPM version %(version)r. Allowed values: %(valid)s.\" %"},{"line_number":1843,"context_line":"            {\u0027version\u0027: version, \u0027valid\u0027: \u0027, \u0027.join(fields.TPMVersion.ALL)}"},{"line_number":1844,"context_line":"        )"},{"line_number":1845,"context_line":""},{"line_number":1846,"context_line":"    model \u003d _get_unique_flavor_image_meta(\u0027tpm_model\u0027, flavor, image_meta)"},{"line_number":1847,"context_line":"    if model is None:"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_3dda494a","line":1844,"range":{"start_line":1840,"start_character":1,"end_line":1844,"end_character":9},"in_reply_to":"bf51134e_0a3a00e6","updated":"2020-08-07 14:48:19.000000000","message":"My mistake I forget about that the extra_spec validation is opt-in only.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":1837,"context_line":"    if version is None:"},{"line_number":1838,"context_line":"        return None"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    if version not in fields.TPMVersion.ALL:"},{"line_number":1841,"context_line":"        raise exception.Invalid("},{"line_number":1842,"context_line":"            \"Invalid TPM version %(version)r. Allowed values: %(valid)s.\" %"},{"line_number":1843,"context_line":"            {\u0027version\u0027: version, \u0027valid\u0027: \u0027, \u0027.join(fields.TPMVersion.ALL)}"},{"line_number":1844,"context_line":"        )"},{"line_number":1845,"context_line":""},{"line_number":1846,"context_line":"    model \u003d _get_unique_flavor_image_meta(\u0027tpm_model\u0027, flavor, image_meta)"},{"line_number":1847,"context_line":"    if model is None:"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_0a3a00e6","line":1844,"range":{"start_line":1840,"start_character":1,"end_line":1844,"end_character":9},"in_reply_to":"bf51134e_f4b051e0","updated":"2020-07-03 11:18:05.000000000","message":"Assuming we\u0027re talking about the same thing, we only validate the flavor extra spec if API microversion 2.86 or greater is used, so we need to do it again here in case something lower is requested.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"}],"nova/virt/libvirt/config.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":676,"context_line":"        super(LibvirtConfigGuestDevice, self).__init__(**kwargs)"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"class LibvirtConfigGuestVTPM(LibvirtConfigGuestDevice):"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"    def __init__(self, model\u003dNone, **kwargs):"},{"line_number":682,"context_line":"        super(LibvirtConfigGuestVTPM, self).__init__(root_name\u003d\"tpm\","}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_d202023f","line":679,"range":{"start_line":679,"start_character":6,"end_line":679,"end_character":28},"updated":"2019-01-18 19:06:39.000000000","message":"do we maybe want to version this class explicitly as well?","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        super(LibvirtConfigGuestVTPM, self).__init__(root_name\u003d\"tpm\","},{"line_number":683,"context_line":"                                                     **kwargs)"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        if model is not None and model not in (\"\", \"TIS\", \"CRB\"):"},{"line_number":686,"context_line":"            msg \u003d (_(\"Invalid model definition %s for TPM.\") % model)"},{"line_number":687,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_b2f97e4e","line":685,"range":{"start_line":685,"start_character":47,"end_line":685,"end_character":49},"updated":"2019-01-18 19:06:39.000000000","message":"do we support explicitly setting the model to an empty string?","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":28931,"name":"Paul-Emile Element","email":"Paul-Emile.Element@windriver.com","username":"pelement"},"change_message_id":"ba416b9c83accf859e4f9e5381804a95c907dc3b","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        super(LibvirtConfigGuestVTPM, self).__init__(root_name\u003d\"tpm\","},{"line_number":683,"context_line":"                                                     **kwargs)"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        if model is not None and model not in (\"\", \"TIS\", \"CRB\"):"},{"line_number":686,"context_line":"            msg \u003d (_(\"Invalid model definition %s for TPM.\") % model)"},{"line_number":687,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_b55088d6","line":685,"range":{"start_line":685,"start_character":47,"end_line":685,"end_character":49},"in_reply_to":"9fdfeff1_554cbc75","updated":"2019-01-18 19:20:27.000000000","message":"I can remove the empty sting option.","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":28931,"name":"Paul-Emile Element","email":"Paul-Emile.Element@windriver.com","username":"pelement"},"change_message_id":"d3c4ab4030b5460b419adb91e4f446b09259442e","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        super(LibvirtConfigGuestVTPM, self).__init__(root_name\u003d\"tpm\","},{"line_number":683,"context_line":"                                                     **kwargs)"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"        if model is not None and model not in (\"\", \"TIS\", \"CRB\"):"},{"line_number":686,"context_line":"            msg \u003d (_(\"Invalid model definition %s for TPM.\") % model)"},{"line_number":687,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":688,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_554cbc75","line":685,"range":{"start_line":685,"start_character":47,"end_line":685,"end_character":49},"in_reply_to":"9fdfeff1_b2f97e4e","updated":"2019-01-18 19:13:31.000000000","message":"Not really, but the code internally provides and empty string when the value is not set.","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"class LibvirtConfigGuestVTPM_1_2(LibvirtConfigGuestDevice):"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"    def __init__(self, model\u003dNone, **kwargs):"},{"line_number":709,"context_line":"        super(LibvirtConfigGuestVTPM_1_2, self).__init__(root_name\u003d\"tpm12\","},{"line_number":710,"context_line":"                                                     **kwargs)"},{"line_number":711,"context_line":"        if model is not None and model !\u003d \"TIS\":"},{"line_number":712,"context_line":"            msg \u003d (_(\"Invalid model definition %s for TPM.\") % model)"},{"line_number":713,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def format_dom(self):"},{"line_number":716,"context_line":"        dev \u003d super(LibvirtConfigGuestVTPM, self).format_dom()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_52629218","line":713,"range":{"start_line":708,"start_character":0,"end_line":713,"end_character":45},"updated":"2019-01-18 19:06:39.000000000","message":"why even pass in a model to this class?  there\u0027s only one valid option and we test for it in the caller.","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":28931,"name":"Paul-Emile Element","email":"Paul-Emile.Element@windriver.com","username":"pelement"},"change_message_id":"d3c4ab4030b5460b419adb91e4f446b09259442e","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"class LibvirtConfigGuestVTPM_1_2(LibvirtConfigGuestDevice):"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"    def __init__(self, model\u003dNone, **kwargs):"},{"line_number":709,"context_line":"        super(LibvirtConfigGuestVTPM_1_2, self).__init__(root_name\u003d\"tpm12\","},{"line_number":710,"context_line":"                                                     **kwargs)"},{"line_number":711,"context_line":"        if model is not None and model !\u003d \"TIS\":"},{"line_number":712,"context_line":"            msg \u003d (_(\"Invalid model definition %s for TPM.\") % model)"},{"line_number":713,"context_line":"            raise exception.InvalidInput(msg)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def format_dom(self):"},{"line_number":716,"context_line":"        dev \u003d super(LibvirtConfigGuestVTPM, self).format_dom()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_9549c461","line":713,"range":{"start_line":708,"start_character":0,"end_line":713,"end_character":45},"in_reply_to":"9fdfeff1_52629218","updated":"2019-01-18 19:13:31.000000000","message":"Simply to catch configuration errors and fail if user sets the model to \u0027CRB\u0027","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3299,"context_line":"            root.append(self._text_node(\"uuid\", str(self.uuid)))"},{"line_number":3300,"context_line":"        usage \u003d self._new_node(\"usage\")"},{"line_number":3301,"context_line":"        usage.set(\"type\", self.usage_type)"},{"line_number":3302,"context_line":"        if self.usage_type in (\u0027ceph\u0027, \u0027vtpm\u0027):"},{"line_number":3303,"context_line":"            usage.append(self._text_node(\u0027name\u0027, str(self.usage_id)))"},{"line_number":3304,"context_line":"        elif self.usage_type \u003d\u003d \u0027iscsi\u0027:"},{"line_number":3305,"context_line":"            usage.append(self._text_node(\u0027target\u0027, str(self.usage_id)))"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_b4937900","line":3302,"updated":"2020-07-02 11:56:10.000000000","message":"Do we have test coverage for this change?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":3299,"context_line":"            root.append(self._text_node(\"uuid\", str(self.uuid)))"},{"line_number":3300,"context_line":"        usage \u003d self._new_node(\"usage\")"},{"line_number":3301,"context_line":"        usage.set(\"type\", self.usage_type)"},{"line_number":3302,"context_line":"        if self.usage_type in (\u0027ceph\u0027, \u0027vtpm\u0027):"},{"line_number":3303,"context_line":"            usage.append(self._text_node(\u0027name\u0027, str(self.usage_id)))"},{"line_number":3304,"context_line":"        elif self.usage_type \u003d\u003d \u0027iscsi\u0027:"},{"line_number":3305,"context_line":"            usage.append(self._text_node(\u0027target\u0027, str(self.usage_id)))"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_853441e0","line":3302,"in_reply_to":"bf51134e_b4937900","updated":"2020-07-03 11:18:05.000000000","message":"Nope. Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":4778,"context_line":"            vtpm \u003d vconfig.LibvirtConfigGuestVTPM(vtpm_model)"},{"line_number":4779,"context_line":"            guest.add_device(vtpm)"},{"line_number":4780,"context_line":"        elif vtpm_1_2 \u003d\u003d \"required\":"},{"line_number":4781,"context_line":"            vtpm \u003d vconfig.LibvirtConfigGuestVTPM_1_2(vtpm_model)"},{"line_number":4782,"context_line":"            guest.add_device(vtpm)"},{"line_number":4783,"context_line":""},{"line_number":4784,"context_line":"    def _get_guest_memory_backing_config("}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_524b7286","line":4781,"range":{"start_line":4781,"start_character":54,"end_line":4781,"end_character":64},"updated":"2019-01-18 19:06:39.000000000","message":"I don\u0027t think we should pass the model to this class, instead we should add a check in this function to raise an exception if the model is specified wrongly.\n\n(Do we want to allow an explicit model at all for TPM 1.2?  Or just say that it\u0027s only valid for TPM 2.0?  I can see arguments for doing it either way.)","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"47fc6613d66524ed983e5e5099e0442759e56f32","unresolved":false,"context_lines":[{"line_number":5354,"context_line":"                self._guest_add_usb_host_keyboard(guest)"},{"line_number":5355,"context_line":""},{"line_number":5356,"context_line":"        # Qemu guest agent only support \u0027qemu\u0027 and \u0027kvm\u0027 hypervisor"},{"line_number":5357,"context_line":"        # virtuall TPM support is also only supported on qemu / kvm"},{"line_number":5358,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":5359,"context_line":"            self._set_qemu_guest_agent(guest, flavor, instance, image_meta)"},{"line_number":5360,"context_line":"            self._set_qemu_guest_vtpm(guest, flavor, instance, image_meta)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_324a6e80","line":5357,"range":{"start_line":5357,"start_character":10,"end_line":5357,"end_character":18},"updated":"2019-01-18 19:06:39.000000000","message":"typo","commit_id":"810d3f5144c7c9d1bab394d446270109865609c8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":"# minimum versions required to support virtual TPM"},{"line_number":241,"context_line":"VTPM_MIN_QEMU_VERSION \u003d (2, 11, 0)"},{"line_number":242,"context_line":"VTPM_MIN_LIBVIRT_VERSION \u003d (4, 5, 0)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"# Virtuozzo driver support"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_b6a262fb","line":242,"range":{"start_line":242,"start_character":27,"end_line":242,"end_character":36},"updated":"2019-11-14 19:25:25.000000000","message":"whoops, (5, 6, 0)","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":"# minimum versions required to support virtual TPM"},{"line_number":241,"context_line":"VTPM_MIN_QEMU_VERSION \u003d (2, 11, 0)"},{"line_number":242,"context_line":"VTPM_MIN_LIBVIRT_VERSION \u003d (4, 5, 0)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"# Virtuozzo driver support"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_dcf37f08","line":242,"range":{"start_line":242,"start_character":27,"end_line":242,"end_character":36},"in_reply_to":"3fa7e38b_b6a262fb","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                               conn_event_handler\u003dself._handle_conn_event)"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        # vtpm support is conditional"},{"line_number":363,"context_line":"        # on qemu and libvirt versions"},{"line_number":364,"context_line":"        self.supports_vtpm \u003d False"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        self._initiator \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_96a7260a","line":363,"range":{"start_line":363,"start_character":10,"end_line":363,"end_character":38},"updated":"2019-11-14 19:25:25.000000000","message":"and presence of swtpm... should we bother with this comment at all here or just leave it to _check_vtpm_support?","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                               conn_event_handler\u003dself._handle_conn_event)"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        # vtpm support is conditional"},{"line_number":363,"context_line":"        # on qemu and libvirt versions"},{"line_number":364,"context_line":"        self.supports_vtpm \u003d False"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        self._initiator \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_7cda8b79","line":363,"range":{"start_line":363,"start_character":10,"end_line":363,"end_character":38},"in_reply_to":"3fa7e38b_96a7260a","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":5206,"context_line":"        rng_device.backend \u003d rng_path"},{"line_number":5207,"context_line":"        guest.add_device(rng_device)"},{"line_number":5208,"context_line":""},{"line_number":5209,"context_line":"    def _set_qemu_guest_config(self, guest, flavor, instance, image_meta):"},{"line_number":5210,"context_line":"        # Enable qga only if the \u0027hw_qemu_guest_agent\u0027 is equal to yes"},{"line_number":5211,"context_line":"        if image_meta.properties.get(\u0027hw_qemu_guest_agent\u0027, False):"},{"line_number":5212,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_96be46fe","line":5209,"range":{"start_line":5209,"start_character":24,"end_line":5209,"end_character":30},"updated":"2019-11-14 19:25:25.000000000","message":"eh?","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":5206,"context_line":"        rng_device.backend \u003d rng_path"},{"line_number":5207,"context_line":"        guest.add_device(rng_device)"},{"line_number":5208,"context_line":""},{"line_number":5209,"context_line":"    def _set_qemu_guest_config(self, guest, flavor, instance, image_meta):"},{"line_number":5210,"context_line":"        # Enable qga only if the \u0027hw_qemu_guest_agent\u0027 is equal to yes"},{"line_number":5211,"context_line":"        if image_meta.properties.get(\u0027hw_qemu_guest_agent\u0027, False):"},{"line_number":5212,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_3ce4133c","line":5209,"range":{"start_line":5209,"start_character":24,"end_line":5209,"end_character":30},"in_reply_to":"3fa7e38b_96be46fe","updated":"2019-11-14 21:27:20.000000000","message":"Reverted this, though it probably makes more sense as `config`.","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":5212,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""},{"line_number":5213,"context_line":"                      \"metadata\", instance\u003dinstance)"},{"line_number":5214,"context_line":"            self._add_qga_device(guest, instance)"},{"line_number":5215,"context_line":""},{"line_number":5216,"context_line":"        rng_is_virtio \u003d image_meta.properties.get(\u0027hw_rng_model\u0027) \u003d\u003d \u0027virtio\u0027"},{"line_number":5217,"context_line":"        rng_allowed_str \u003d flavor.extra_specs.get(\u0027hw_rng:allowed\u0027, \u0027\u0027)"},{"line_number":5218,"context_line":"        rng_allowed \u003d strutils.bool_from_string(rng_allowed_str)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_36bd1202","line":5215,"updated":"2019-11-14 19:25:25.000000000","message":"unrelated whitespace damage","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":5212,"context_line":"            LOG.debug(\"Qemu guest agent is enabled through image \""},{"line_number":5213,"context_line":"                      \"metadata\", instance\u003dinstance)"},{"line_number":5214,"context_line":"            self._add_qga_device(guest, instance)"},{"line_number":5215,"context_line":""},{"line_number":5216,"context_line":"        rng_is_virtio \u003d image_meta.properties.get(\u0027hw_rng_model\u0027) \u003d\u003d \u0027virtio\u0027"},{"line_number":5217,"context_line":"        rng_allowed_str \u003d flavor.extra_specs.get(\u0027hw_rng:allowed\u0027, \u0027\u0027)"},{"line_number":5218,"context_line":"        rng_allowed \u003d strutils.bool_from_string(rng_allowed_str)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_5cdf8f65","line":5215,"in_reply_to":"3fa7e38b_36bd1202","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":5240,"context_line":"        no-op."},{"line_number":5241,"context_line":""},{"line_number":5242,"context_line":"        :param context: Nova *user* auth context. A non-user context will fail"},{"line_number":5243,"context_line":"            attempting to access the key manager API."},{"line_number":5244,"context_line":"        :param instance: Instance object. If the instance calls for a vTPM (via"},{"line_number":5245,"context_line":"            flavor/image properties) and the context manager completes"},{"line_number":5246,"context_line":"            successfully, the instance is guaranteed to contain"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_1638169d","line":5243,"updated":"2019-11-14 19:25:25.000000000","message":"yeah, raising some kind of castellan exception, which we should at least attempt to document","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":5240,"context_line":"        no-op."},{"line_number":5241,"context_line":""},{"line_number":5242,"context_line":"        :param context: Nova *user* auth context. A non-user context will fail"},{"line_number":5243,"context_line":"            attempting to access the key manager API."},{"line_number":5244,"context_line":"        :param instance: Instance object. If the instance calls for a vTPM (via"},{"line_number":5245,"context_line":"            flavor/image properties) and the context manager completes"},{"line_number":5246,"context_line":"            successfully, the instance is guaranteed to contain"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_bcc9e3ac","line":5243,"in_reply_to":"3fa7e38b_1638169d","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":5827,"context_line":"            if caps.host.cpu.arch \u003d\u003d fields.Architecture.AARCH64:"},{"line_number":5828,"context_line":"                self._guest_add_usb_host_keyboard(guest)"},{"line_number":5829,"context_line":""},{"line_number":5830,"context_line":"        # Set up things only supported by \u0027qemu\u0027 and \u0027kvm\u0027 hypervisor:"},{"line_number":5831,"context_line":"        # qemu guest agent, virtio RNG, virtual TPM support."},{"line_number":5832,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":5833,"context_line":"            self._set_qemu_guest_config(guest, flavor, instance, image_meta)"},{"line_number":5834,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_9643a611","line":5831,"range":{"start_line":5830,"start_character":0,"end_line":5831,"end_character":60},"updated":"2019-11-14 19:25:25.000000000","message":"revert this delta, as the vtpm pieces have moved","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"64357e12d99e0b85e73a88ce246b4167d71c4551","unresolved":false,"context_lines":[{"line_number":5827,"context_line":"            if caps.host.cpu.arch \u003d\u003d fields.Architecture.AARCH64:"},{"line_number":5828,"context_line":"                self._guest_add_usb_host_keyboard(guest)"},{"line_number":5829,"context_line":""},{"line_number":5830,"context_line":"        # Set up things only supported by \u0027qemu\u0027 and \u0027kvm\u0027 hypervisor:"},{"line_number":5831,"context_line":"        # qemu guest agent, virtio RNG, virtual TPM support."},{"line_number":5832,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":5833,"context_line":"            self._set_qemu_guest_config(guest, flavor, instance, image_meta)"},{"line_number":5834,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_fc343bae","line":5831,"range":{"start_line":5830,"start_character":0,"end_line":5831,"end_character":60},"in_reply_to":"3fa7e38b_9643a611","updated":"2019-11-14 21:27:20.000000000","message":"Done","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7424b5c4ee99d08dddc291e6ecf4062199674852","unresolved":false,"context_lines":[{"line_number":756,"context_line":"        self._check_vtpm_support()"},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"    def _check_vtpm_support(self):"},{"line_number":759,"context_line":"        # TODO(efried): A key manager must be configured to create/retrieve"},{"line_number":760,"context_line":"        #  secrets. Is there a way to check that one is set up correctly?"},{"line_number":761,"context_line":"        #  CONF.key_manager.backend is optional :("},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"        if not CONF.libvirt.swtpm_enabled:"},{"line_number":764,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_5168951f","line":761,"range":{"start_line":759,"start_character":8,"end_line":761,"end_character":50},"updated":"2019-11-20 17:14:37.000000000","message":"Not really, and we don\u0027t want to go querying the service catalog during init_host. But we could at least check that the CONF.key_manager group exists.\n\nDitto for swift (when that\u0027s a thing)","commit_id":"130ffa3f8f76a5f184fe5b12385f4332d5dd84eb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"281f71bdf424e9fd2e0083196e5a361dc2c822ac","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"                instance.cleaned \u003d True"},{"line_number":1461,"context_line":"            instance.save()"},{"line_number":1462,"context_line":""},{"line_number":1463,"context_line":"        if destroy_disks:"},{"line_number":1464,"context_line":"            crypto.delete_vtpm_secret(context, instance)"},{"line_number":1465,"context_line":""},{"line_number":1466,"context_line":"        self._undefine_domain(instance)"},{"line_number":1467,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_202341c0","line":1464,"range":{"start_line":1463,"start_character":8,"end_line":1464,"end_character":56},"updated":"2019-11-20 23:20:48.000000000","message":"Ugh, if we do this, we can never boot from a snapshot\n\nAnd we can never know if there are snapshot \"out there\" that still need this key.\n\nSo... I think we maybe can\u0027t ever delete this secret. Has to be up to the admin to prune :(","commit_id":"130ffa3f8f76a5f184fe5b12385f4332d5dd84eb"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d8f1277b08b5c51972745266202eec8a269db18d","unresolved":false,"context_lines":[{"line_number":1420,"context_line":"                instance.cleaned \u003d True"},{"line_number":1421,"context_line":"            instance.save()"},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"        if destroy_disks:"},{"line_number":1424,"context_line":"            crypto.delete_vtpm_secret(context, instance)"},{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":"        self._undefine_domain(instance)"}],"source_content_type":"text/x-python","patch_set":40,"id":"ff570b3c_36074acc","line":1423,"updated":"2020-05-27 15:02:56.000000000","message":"pep8: F821 undefined name \u0027destroy_disks\u0027","commit_id":"fe4114a130c04b4034e66d0e67988eb2f4eb6568"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    def _check_vtpm_support(self):"},{"line_number":795,"context_line":"        # TODO(efried): A key manager must be configured to create/retrieve"},{"line_number":796,"context_line":"        # secrets. Is there a way to check that one is set up correctly?"},{"line_number":797,"context_line":"        # CONF.key_manager.backend is optional :("},{"line_number":798,"context_line":"        if not CONF.libvirt.swtpm_enabled:"},{"line_number":799,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_74aa8119","line":796,"range":{"start_line":796,"start_character":19,"end_line":796,"end_character":72},"updated":"2020-07-02 11:56:10.000000000","message":"We can try to add / delete a secret to the key manager here to see if it works or not. This could be a follow up.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        # These executables need to be installed for libvirt to make use of"},{"line_number":817,"context_line":"        # emulated TPM."},{"line_number":818,"context_line":"        if not any(shutil.which(cmd) for cmd in (\u0027swtpm_setup\u0027, \u0027swtpm\u0027)):"},{"line_number":819,"context_line":"            msg \u003d _(\"vTPM support is configured but the \u0027swtpm\u0027 and \""},{"line_number":820,"context_line":"                    \"\u0027swtpm_setup\u0027 binaries could not be found.\")"},{"line_number":821,"context_line":"            raise exception.InvalidConfiguration(msg)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_943475fd","line":818,"range":{"start_line":818,"start_character":19,"end_line":818,"end_character":36},"updated":"2020-07-02 11:56:10.000000000","message":"I assume libvirt uses these binaries not nova. Do we do this existence check with the same user / creds as what libvirt will use? If not then it is possible that nova does not see the binaries while libvirt does due to permission differences.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        # These executables need to be installed for libvirt to make use of"},{"line_number":817,"context_line":"        # emulated TPM."},{"line_number":818,"context_line":"        if not any(shutil.which(cmd) for cmd in (\u0027swtpm_setup\u0027, \u0027swtpm\u0027)):"},{"line_number":819,"context_line":"            msg \u003d _(\"vTPM support is configured but the \u0027swtpm\u0027 and \""},{"line_number":820,"context_line":"                    \"\u0027swtpm_setup\u0027 binaries could not be found.\")"},{"line_number":821,"context_line":"            raise exception.InvalidConfiguration(msg)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_5dcd7d83","line":818,"range":{"start_line":818,"start_character":19,"end_line":818,"end_character":36},"in_reply_to":"bf51134e_2593b5a5","updated":"2020-08-07 14:48:19.000000000","message":"OK. A note is enough for now. I don\u0027t think that nova not seeing what libvirt sees is a highly likely error scenario.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        # These executables need to be installed for libvirt to make use of"},{"line_number":817,"context_line":"        # emulated TPM."},{"line_number":818,"context_line":"        if not any(shutil.which(cmd) for cmd in (\u0027swtpm_setup\u0027, \u0027swtpm\u0027)):"},{"line_number":819,"context_line":"            msg \u003d _(\"vTPM support is configured but the \u0027swtpm\u0027 and \""},{"line_number":820,"context_line":"                    \"\u0027swtpm_setup\u0027 binaries could not be found.\")"},{"line_number":821,"context_line":"            raise exception.InvalidConfiguration(msg)"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_2593b5a5","line":818,"range":{"start_line":818,"start_character":19,"end_line":818,"end_character":36},"in_reply_to":"bf51134e_943475fd","updated":"2020-07-03 11:18:05.000000000","message":"Yeah, correct. The PATH could also be different between users. However, we don\u0027t store any information about what user the libvirt process is running as nor could we necessarily execute commands as that user if we did. I guess this remains best effort. I can either convert to a warning or add a note stating this gap. Going to do the latter for now but can change","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"            instance.save()"},{"line_number":1496,"context_line":""},{"line_number":1497,"context_line":"        if cleanup_instance_disks:"},{"line_number":1498,"context_line":"            crypto.delete_vtpm_secret(context, instance)"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        self._undefine_domain(instance)"},{"line_number":1501,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_cf5e5ae8","line":1498,"updated":"2020-07-02 11:56:10.000000000","message":"I don\u0027t find test coverage for this change","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"            instance.save()"},{"line_number":1496,"context_line":""},{"line_number":1497,"context_line":"        if cleanup_instance_disks:"},{"line_number":1498,"context_line":"            crypto.delete_vtpm_secret(context, instance)"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        self._undefine_domain(instance)"},{"line_number":1501,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_e5ed3d8c","line":1498,"in_reply_to":"bf51134e_cf5e5ae8","updated":"2020-07-03 11:18:05.000000000","message":"Done","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":2562,"context_line":"        #              for LXC, _create_domain must not be called."},{"line_number":2563,"context_line":"        if CONF.libvirt.virt_type !\u003d \u0027lxc\u0027 and not live_snapshot:"},{"line_number":2564,"context_line":"            if state \u003d\u003d power_state.RUNNING:"},{"line_number":2565,"context_line":"                with self._vtpm_secret(context, instance):"},{"line_number":2566,"context_line":"                    guest \u003d self._create_domain(domain\u003dvirt_dom)"},{"line_number":2567,"context_line":"            elif state \u003d\u003d power_state.PAUSED:"},{"line_number":2568,"context_line":"                with self._vtpm_secret(context, instance):"},{"line_number":2569,"context_line":"                    guest \u003d self._create_domain(domain\u003dvirt_dom, pause\u003dTrue)"},{"line_number":2570,"context_line":""},{"line_number":2571,"context_line":"            if guest is not None:"},{"line_number":2572,"context_line":"                self._attach_pci_devices("}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_8f6c629d","line":2569,"range":{"start_line":2565,"start_character":0,"end_line":2569,"end_character":76},"updated":"2020-07-02 11:56:10.000000000","message":"I don\u0027t find test coverage for this change","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":2562,"context_line":"        #              for LXC, _create_domain must not be called."},{"line_number":2563,"context_line":"        if CONF.libvirt.virt_type !\u003d \u0027lxc\u0027 and not live_snapshot:"},{"line_number":2564,"context_line":"            if state \u003d\u003d power_state.RUNNING:"},{"line_number":2565,"context_line":"                with self._vtpm_secret(context, instance):"},{"line_number":2566,"context_line":"                    guest \u003d self._create_domain(domain\u003dvirt_dom)"},{"line_number":2567,"context_line":"            elif state \u003d\u003d power_state.PAUSED:"},{"line_number":2568,"context_line":"                with self._vtpm_secret(context, instance):"},{"line_number":2569,"context_line":"                    guest \u003d self._create_domain(domain\u003dvirt_dom, pause\u003dTrue)"},{"line_number":2570,"context_line":""},{"line_number":2571,"context_line":"            if guest is not None:"},{"line_number":2572,"context_line":"                self._attach_pci_devices("}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_61d633c6","line":2569,"range":{"start_line":2565,"start_character":0,"end_line":2569,"end_character":76},"in_reply_to":"bf51134e_8f6c629d","updated":"2020-07-03 11:18:05.000000000","message":"I\u0027ve reworked all of this to move away from the context manager idea, meaning we only need one test instead of multiple.\n\nNow whether I remembered to add that test or not is a different matter...","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3251,"context_line":"                             power_state.CRASHED]:"},{"line_number":3252,"context_line":"                    LOG.info(\"Instance shutdown successfully.\","},{"line_number":3253,"context_line":"                             instance\u003dinstance)"},{"line_number":3254,"context_line":"                    with self._vtpm_secret(context, instance):"},{"line_number":3255,"context_line":"                        self._create_domain(domain\u003dguest._domain)"},{"line_number":3256,"context_line":"                    timer \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":3257,"context_line":"                        self._wait_for_running, instance)"},{"line_number":3258,"context_line":"                    timer.start(interval\u003d0.5).wait()"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_cf03fabd","line":3255,"range":{"start_line":3254,"start_character":0,"end_line":3255,"end_character":65},"updated":"2020-07-02 11:56:10.000000000","message":"I think this is not covered by test","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3631,"context_line":"                                  mdevs\u003dmdevs,"},{"line_number":3632,"context_line":"                                  block_device_info\u003dblock_device_info)"},{"line_number":3633,"context_line":"        self._destroy(instance)"},{"line_number":3634,"context_line":"        with self._vtpm_secret(context, instance):"},{"line_number":3635,"context_line":"            self._create_domain(xml, post_xml_callback\u003dgen_confdrive)"},{"line_number":3636,"context_line":""},{"line_number":3637,"context_line":"    def unrescue("},{"line_number":3638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_af0846d9","line":3635,"range":{"start_line":3634,"start_character":0,"end_line":3635,"end_character":69},"updated":"2020-07-02 11:56:10.000000000","message":"I think this is not covered by test","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3651,"context_line":"        # We should be able to remove virt_dom at the end."},{"line_number":3652,"context_line":"        virt_dom \u003d guest._domain"},{"line_number":3653,"context_line":"        self._destroy(instance)"},{"line_number":3654,"context_line":"        with self._vtpm_secret(context, instance):"},{"line_number":3655,"context_line":"            self._create_domain(xml, virt_dom)"},{"line_number":3656,"context_line":"        os.unlink(unrescue_xml_path)"},{"line_number":3657,"context_line":"        rescue_files \u003d os.path.join(instance_dir, \"*.rescue\")"},{"line_number":3658,"context_line":"        for rescue_file in glob.iglob(rescue_files):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_0f0e92e4","line":3655,"range":{"start_line":3654,"start_character":0,"end_line":3655,"end_character":46},"updated":"2020-07-02 11:56:10.000000000","message":"I think this is not covered by test","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3697,"context_line":""},{"line_number":3698,"context_line":"        # If the guest needs a vTPM, _get_guest_xml needs its secret to exist"},{"line_number":3699,"context_line":"        # and its uuid to be registered in the instance prior to _get_guest_xml"},{"line_number":3700,"context_line":"        if self.supports_vtpm:"},{"line_number":3701,"context_line":"            vtpm_config \u003d hardware.get_vtpm_constraint("},{"line_number":3702,"context_line":"                instance.flavor, image_meta"},{"line_number":3703,"context_line":"            )"},{"line_number":3704,"context_line":"            vtpm_secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"},{"line_number":3705,"context_line":"            if vtpm_config and not vtpm_secret_uuid:"},{"line_number":3706,"context_line":"                # This is slightly wasteful, as _vtpm_secret will perform a"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_cffdba09","line":3703,"range":{"start_line":3700,"start_character":0,"end_line":3703,"end_character":13},"updated":"2020-07-02 11:56:10.000000000","message":"Wondering what will happen if I boot an instance with vtpm on a host that supporting it. Then disable the support in the config and then rebuild the VM. Does rebuild fails due to image / flavor is validated by the scheduler during rebuild?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":3697,"context_line":""},{"line_number":3698,"context_line":"        # If the guest needs a vTPM, _get_guest_xml needs its secret to exist"},{"line_number":3699,"context_line":"        # and its uuid to be registered in the instance prior to _get_guest_xml"},{"line_number":3700,"context_line":"        if self.supports_vtpm:"},{"line_number":3701,"context_line":"            vtpm_config \u003d hardware.get_vtpm_constraint("},{"line_number":3702,"context_line":"                instance.flavor, image_meta"},{"line_number":3703,"context_line":"            )"},{"line_number":3704,"context_line":"            vtpm_secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"},{"line_number":3705,"context_line":"            if vtpm_config and not vtpm_secret_uuid:"},{"line_number":3706,"context_line":"                # This is slightly wasteful, as _vtpm_secret will perform a"}],"source_content_type":"text/x-python","patch_set":43,"id":"9f560f44_d4659b1f","line":3703,"range":{"start_line":3700,"start_character":0,"end_line":3703,"end_character":13},"in_reply_to":"bf51134e_aff83f7c","updated":"2020-08-07 14:48:19.000000000","message":"I cannot find that startup check. Could you give me a link?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":3697,"context_line":""},{"line_number":3698,"context_line":"        # If the guest needs a vTPM, _get_guest_xml needs its secret to exist"},{"line_number":3699,"context_line":"        # and its uuid to be registered in the instance prior to _get_guest_xml"},{"line_number":3700,"context_line":"        if self.supports_vtpm:"},{"line_number":3701,"context_line":"            vtpm_config \u003d hardware.get_vtpm_constraint("},{"line_number":3702,"context_line":"                instance.flavor, image_meta"},{"line_number":3703,"context_line":"            )"},{"line_number":3704,"context_line":"            vtpm_secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"},{"line_number":3705,"context_line":"            if vtpm_config and not vtpm_secret_uuid:"},{"line_number":3706,"context_line":"                # This is slightly wasteful, as _vtpm_secret will perform a"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_aff83f7c","line":3703,"range":{"start_line":3700,"start_character":0,"end_line":3703,"end_character":13},"in_reply_to":"bf51134e_cffdba09","updated":"2020-07-03 11:18:05.000000000","message":"That\u0027s a fair point. I have no idea. I\u0027ve added a startup check like we have for instances with pinned CPUs and no PCPU allocation","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":3707,"context_line":"                # redundant key manager API call later when we create the"},{"line_number":3708,"context_line":"                # domain. But the alternative is (major refactoring and)"},{"line_number":3709,"context_line":"                # passing the passphrase down into _create_domain_and_network."},{"line_number":3710,"context_line":"                crypto.ensure_vtpm_secret(context, instance)"},{"line_number":3711,"context_line":""},{"line_number":3712,"context_line":"        xml \u003d self._get_guest_xml(context, instance, network_info,"},{"line_number":3713,"context_line":"                                  disk_info, image_meta,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_8f0102b3","line":3710,"updated":"2020-07-02 11:56:10.000000000","message":"Do we have test coverage for this change in spawn()?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":5506,"context_line":"            self._add_qga_device(guest, instance)"},{"line_number":5507,"context_line":""},{"line_number":5508,"context_line":"        # Enable virtual tpm support if required in the flavor or image."},{"line_number":5509,"context_line":"        if self.supports_vtpm:"},{"line_number":5510,"context_line":"            vtpm_config \u003d hardware.get_vtpm_constraint("},{"line_number":5511,"context_line":"                instance.flavor, image_meta"},{"line_number":5512,"context_line":"            )"},{"line_number":5513,"context_line":"            vtpm_secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"},{"line_number":5514,"context_line":"            if vtpm_config is not None:"},{"line_number":5515,"context_line":"                if not vtpm_secret_uuid:"},{"line_number":5516,"context_line":"                    raise exception.Invalid("},{"line_number":5517,"context_line":"                        \"Refusing to create an emulated TPM with no secret!\""},{"line_number":5518,"context_line":"                    )"},{"line_number":5519,"context_line":"                vtpm \u003d vconfig.LibvirtConfigGuestVTPM("},{"line_number":5520,"context_line":"                    vtpm_config, vtpm_secret_uuid,"},{"line_number":5521,"context_line":"                )"},{"line_number":5522,"context_line":"                guest.add_device(vtpm)"},{"line_number":5523,"context_line":""},{"line_number":5524,"context_line":"    @contextlib.contextmanager"},{"line_number":5525,"context_line":"    def _vtpm_secret(self, context, instance):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_cf265abb","line":5522,"range":{"start_line":5509,"start_character":0,"end_line":5522,"end_character":38},"updated":"2020-07-02 11:56:10.000000000","message":"How does vtpm relate to the qemu geust agent?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":5506,"context_line":"            self._add_qga_device(guest, instance)"},{"line_number":5507,"context_line":""},{"line_number":5508,"context_line":"        # Enable virtual tpm support if required in the flavor or image."},{"line_number":5509,"context_line":"        if self.supports_vtpm:"},{"line_number":5510,"context_line":"            vtpm_config \u003d hardware.get_vtpm_constraint("},{"line_number":5511,"context_line":"                instance.flavor, image_meta"},{"line_number":5512,"context_line":"            )"},{"line_number":5513,"context_line":"            vtpm_secret_uuid \u003d instance.system_metadata.get(\u0027vtpm_secret_uuid\u0027)"},{"line_number":5514,"context_line":"            if vtpm_config is not None:"},{"line_number":5515,"context_line":"                if not vtpm_secret_uuid:"},{"line_number":5516,"context_line":"                    raise exception.Invalid("},{"line_number":5517,"context_line":"                        \"Refusing to create an emulated TPM with no secret!\""},{"line_number":5518,"context_line":"                    )"},{"line_number":5519,"context_line":"                vtpm \u003d vconfig.LibvirtConfigGuestVTPM("},{"line_number":5520,"context_line":"                    vtpm_config, vtpm_secret_uuid,"},{"line_number":5521,"context_line":"                )"},{"line_number":5522,"context_line":"                guest.add_device(vtpm)"},{"line_number":5523,"context_line":""},{"line_number":5524,"context_line":"    @contextlib.contextmanager"},{"line_number":5525,"context_line":"    def _vtpm_secret(self, context, instance):"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_a1e04b98","line":5522,"range":{"start_line":5509,"start_character":0,"end_line":5522,"end_character":38},"in_reply_to":"bf51134e_cf265abb","updated":"2020-07-03 11:18:05.000000000","message":"It doesn\u0027t. Moved to a separate function","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":6644,"context_line":"                    self._lxc_disk_handler("},{"line_number":6645,"context_line":"                        context, instance, instance.image_meta,"},{"line_number":6646,"context_line":"                        block_device_info),"},{"line_number":6647,"context_line":"                    self._vtpm_secret(context, instance)"},{"line_number":6648,"context_line":"                ):"},{"line_number":6649,"context_line":"                    guest \u003d self._create_domain("},{"line_number":6650,"context_line":"                        xml, pause\u003dpause, power_on\u003dpower_on,"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_6ffe2eaf","line":6647,"range":{"start_line":6647,"start_character":0,"end_line":6647,"end_character":56},"updated":"2020-07-02 11:56:10.000000000","message":"I don\u0027t find test coverage for this change","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fd7fce1640af0e5dda5632d25af73cb8160159af","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        self._host \u003d host.Host(self._uri(), read_only,"},{"line_number":348,"context_line":"                               lifecycle_event_handler\u003dself.emit_event,"},{"line_number":349,"context_line":"                               conn_event_handler\u003dself._handle_conn_event)"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"        # vTPM support is detected during init_host()"},{"line_number":352,"context_line":"        self.supports_vtpm \u003d False"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        self._initiator \u003d None"},{"line_number":355,"context_line":"        self._fc_wwnns \u003d None"}],"source_content_type":"text/x-python","patch_set":45,"id":"bf51134e_812387be","line":352,"range":{"start_line":350,"start_character":0,"end_line":352,"end_character":34},"updated":"2020-07-10 10:31:26.000000000","message":"We could just check \u0027self.capabilities[\u0027supports_vtpm\u0027]\u0027 instead","commit_id":"c082ec8e16f08343380307800f96ae719d9a43c9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":6086,"context_line":"            if caps.host.cpu.arch \u003d\u003d fields.Architecture.AARCH64:"},{"line_number":6087,"context_line":"                self._guest_add_usb_host_keyboard(guest)"},{"line_number":6088,"context_line":""},{"line_number":6089,"context_line":"        # Qemu guest agent only support \u0027qemu\u0027 and \u0027kvm\u0027 hypervisor"},{"line_number":6090,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":6091,"context_line":"            self._set_qemu_guest_agent(guest, flavor, instance, image_meta)"},{"line_number":6092,"context_line":"            self._add_rng_device(guest, flavor, image_meta)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_f429bf36","line":6089,"updated":"2020-08-07 14:48:19.000000000","message":"This comment is now too specific compared to what is done in the if branch below. Either move it to the top of L6091 or generalize it to cover the all action we take in the if branch","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15602ebd5a202e484676c2f24df7741d57ba0853","unresolved":false,"context_lines":[{"line_number":6086,"context_line":"            if caps.host.cpu.arch \u003d\u003d fields.Architecture.AARCH64:"},{"line_number":6087,"context_line":"                self._guest_add_usb_host_keyboard(guest)"},{"line_number":6088,"context_line":""},{"line_number":6089,"context_line":"        # Qemu guest agent only support \u0027qemu\u0027 and \u0027kvm\u0027 hypervisor"},{"line_number":6090,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":6091,"context_line":"            self._set_qemu_guest_agent(guest, flavor, instance, image_meta)"},{"line_number":6092,"context_line":"            self._add_rng_device(guest, flavor, image_meta)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_3d0b098e","line":6089,"in_reply_to":"9f560f44_f429bf36","updated":"2020-08-10 10:30:55.000000000","message":"Done","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7eabfb3f09b474e1cd0491820b2d01c968fd57af","unresolved":false,"context_lines":[{"line_number":6090,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":6091,"context_line":"            self._set_qemu_guest_agent(guest, flavor, instance, image_meta)"},{"line_number":6092,"context_line":"            self._add_rng_device(guest, flavor, image_meta)"},{"line_number":6093,"context_line":"            self._add_vtpm_device(guest, flavor, instance, image_meta)"},{"line_number":6094,"context_line":""},{"line_number":6095,"context_line":"        if self._guest_needs_pcie(guest, caps):"},{"line_number":6096,"context_line":"            self._guest_add_pcie_root_ports(guest)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_d4975beb","line":6093,"updated":"2020-08-07 14:48:19.000000000","message":"Something is strange with this. If I comment this line out all unit and functional test passes but I feel this is a core part of the feature so it should make at least some of the happy path test to fail","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15602ebd5a202e484676c2f24df7741d57ba0853","unresolved":false,"context_lines":[{"line_number":6090,"context_line":"        if virt_type in (\u0027qemu\u0027, \u0027kvm\u0027):"},{"line_number":6091,"context_line":"            self._set_qemu_guest_agent(guest, flavor, instance, image_meta)"},{"line_number":6092,"context_line":"            self._add_rng_device(guest, flavor, image_meta)"},{"line_number":6093,"context_line":"            self._add_vtpm_device(guest, flavor, instance, image_meta)"},{"line_number":6094,"context_line":""},{"line_number":6095,"context_line":"        if self._guest_needs_pcie(guest, caps):"},{"line_number":6096,"context_line":"            self._guest_add_pcie_root_ports(guest)"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_ddb3ed96","line":6093,"in_reply_to":"9f560f44_d4975beb","updated":"2020-08-10 10:30:55.000000000","message":"Done","commit_id":"3945c3068aea6bfe81c088b9a70020a2a0f7fae8"}],"nova/virt/libvirt/host.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"35de07243e349a64f5d8aceebfe6f0bad0e7cf60","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"                           are private and ephemeral; others are not."},{"line_number":1006,"context_line":"        :param usage_id: name of resource in secret"},{"line_number":1007,"context_line":"        :param password: optional secret value to set"},{"line_number":1008,"context_line":"        :param uuid: optional UUID of the secret; else one is generated"},{"line_number":1009,"context_line":"        \"\"\""},{"line_number":1010,"context_line":"        secret_conf \u003d vconfig.LibvirtConfigSecret()"},{"line_number":1011,"context_line":"        secret_conf.ephemeral \u003d usage_type \u003d\u003d \u0027vtpm\u0027"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_b41259b3","line":1008,"range":{"start_line":1008,"start_character":49,"end_line":1008,"end_character":71},"updated":"2020-07-02 11:56:10.000000000","message":"I don\u0027t see where it is generated in nova. Is it done by libvirt?","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8fc41ef751741096ef6142fa26dcbc7d014672f3","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"                           are private and ephemeral; others are not."},{"line_number":1006,"context_line":"        :param usage_id: name of resource in secret"},{"line_number":1007,"context_line":"        :param password: optional secret value to set"},{"line_number":1008,"context_line":"        :param uuid: optional UUID of the secret; else one is generated"},{"line_number":1009,"context_line":"        \"\"\""},{"line_number":1010,"context_line":"        secret_conf \u003d vconfig.LibvirtConfigSecret()"},{"line_number":1011,"context_line":"        secret_conf.ephemeral \u003d usage_type \u003d\u003d \u0027vtpm\u0027"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf51134e_457509cc","line":1008,"range":{"start_line":1008,"start_character":49,"end_line":1008,"end_character":71},"in_reply_to":"bf51134e_b41259b3","updated":"2020-07-03 11:18:05.000000000","message":"Yup, this is libvirt.","commit_id":"8a16297782cd7a44313e9cd8d0fade5431a2a218"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":1049,"context_line":"        \"\"\"Delete a secret."},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        :param usage_type: one of \u0027iscsi\u0027, \u0027ceph\u0027, \u0027rbd\u0027, \u0027volume\u0027 or \u0027vtpm\u0027"},{"line_number":1052,"context_line":"        :param usage_id: name of resource in secret"},{"line_number":1053,"context_line":"        \"\"\""},{"line_number":1054,"context_line":"        secret \u003d self.find_secret(usage_type, usage_id)"},{"line_number":1055,"context_line":"        if secret is not None:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_0b3d31c3","line":1052,"updated":"2020-08-26 12:31:52.000000000","message":"thanks for cleaning this up","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"}],"nova/virt/libvirt/utils.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fe2e01b98fdefb927489a7492978481725c7da36","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import re"},{"line_number":24,"context_line":"import subprocess"},{"line_number":25,"context_line":"import uuid"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import os_traits"},{"line_number":29,"context_line":"from oslo_concurrency import processutils"}],"source_content_type":"text/x-python","patch_set":23,"id":"dfbec78f_d7e2df2f","line":26,"updated":"2019-05-03 14:11:01.000000000","message":"nit: unnecessary change","commit_id":"58a208a99b7039e4abc91071867119b14937faf3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f92f53735429e5705af57596abecd3b2deea2373","unresolved":false,"context_lines":[{"line_number":609,"context_line":"    return set(flags)"},{"line_number":610,"context_line":""},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"def executable_exists_in_path(cmd):"},{"line_number":613,"context_line":"    \"\"\"Returns whether the specified command exists on the host"},{"line_number":614,"context_line":"    as an executable file somewhere in the current process\u0027 $PATH"},{"line_number":615,"context_line":"    or as an absolute path to a binary."}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_1661f6a8","line":612,"updated":"2019-11-14 19:25:25.000000000","message":"Still wondering if we should bother with this or just let guest boot bounce if the supporting software isn\u0027t installed.","commit_id":"21b9734c2c0e55a78b7f8f7632cb782592d5fd02"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7e494d4d40f24c11226b9c81b11c09b2039df21f","unresolved":false,"context_lines":[{"line_number":615,"context_line":"    or as an absolute path to a binary."},{"line_number":616,"context_line":"    \"\"\""},{"line_number":617,"context_line":"    return subprocess.call(\"which \" + cmd, shell\u003dTrue,"},{"line_number":618,"context_line":"        stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_c35b9083","line":618,"updated":"2019-11-15 19:37:12.000000000","message":"Since it\u0027s already imported, this might be a bit cleaner as:\n\n    try:\n        processutils.execute(\u0027which\u0027, cmd)\n        return True\n    except processutils.ProcessExecutionError:\n        return False\n\nOr if playing code golf:\n\n    return bool(processutils.execute(\u0027which\u0027, cmd, check_exit_code\u003dFalse)[0])","commit_id":"130ffa3f8f76a5f184fe5b12385f4332d5dd84eb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7424b5c4ee99d08dddc291e6ecf4062199674852","unresolved":false,"context_lines":[{"line_number":615,"context_line":"    or as an absolute path to a binary."},{"line_number":616,"context_line":"    \"\"\""},{"line_number":617,"context_line":"    return subprocess.call(\"which \" + cmd, shell\u003dTrue,"},{"line_number":618,"context_line":"        stdout\u003dsubprocess.PIPE, stderr\u003dsubprocess.PIPE) \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_2e160bf4","line":618,"in_reply_to":"3fa7e38b_c35b9083","updated":"2019-11-20 17:14:37.000000000","message":"Ack. This is a piece of this patch (possibly the only piece) I never touched :P","commit_id":"130ffa3f8f76a5f184fe5b12385f4332d5dd84eb"}],"releasenotes/notes/emulated-tpm-cb277659fc2f9660.yaml":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Nova now supports adding an emulated virtual `Trusted Platform Module`__ to"},{"line_number":5,"context_line":"    libvirt guests with a ``virt_type`` of ``kvm`` or ``qemu``. See the"},{"line_number":6,"context_line":"    documentation__ for details."},{"line_number":7,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":61,"id":"9f560f44_cb6df9cc","line":4,"range":{"start_line":4,"start_character":9,"end_line":4,"end_character":28},"updated":"2020-08-26 12:31:52.000000000","message":"I\u0027d have appreciated if we could have made it explicit that we only support spawn at the moment.","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f0bb05a697b05fa6f6154f53fdef1af19d8a140a","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    documentation__ for details."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    .. __: https://en.wikipedia.org/wiki/Trusted_Platform_Module"},{"line_number":9,"context_line":"    .. __: https://docs.openstack.org/nova/latest/admin/emulated-tpm.rst"}],"source_content_type":"text/x-yaml","patch_set":61,"id":"9f560f44_2b43d540","line":9,"range":{"start_line":9,"start_character":11,"end_line":9,"end_character":72},"updated":"2020-08-26 12:31:52.000000000","message":"this gives me a 404","commit_id":"e0ca2652eda52d26c8665e93e24d119901ae0fa4"}]}
