)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1da6b349c8b135483ea162b8bbb1ff92ad19fec8","unresolved":true,"context_lines":[{"line_number":27,"context_line":"https://listman.redhat.com/archives/libvir-list/2021-October/msg00546.html"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I6445433142286728a8c7efadcf80d07082d60bc3"},{"line_number":30,"context_line":"Depends-On: I07ef52769da72cde8867f996111b7df4a80e4d79"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"bbded519_dd0ed2d9","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":53},"updated":"2021-11-19 13:10:55.000000000","message":"not to others this is the spec which is now merged.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"5499251a7126551bd01a8436167311fda9db440e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8023a530_22bd76af","updated":"2021-10-25 17:07:50.000000000","message":"I discovered an issue while doing an integrated test, see in-line comments and proposal for how to deal with it.","commit_id":"322fb9f160d6becf5c586c759868240183a8a621"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"9e8bea31fac728c7761fefbfea3ff6615e83d3d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"18271a18_353326ce","updated":"2021-10-11 17:37:02.000000000","message":"Patch set 6 has the necessary changes according to the v6 of the Libvirt patch (XML format changes).","commit_id":"322fb9f160d6becf5c586c759868240183a8a621"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"57e4ec224c9d58bb67ea71b9ebc8d98e0fe7ea8c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f961004b_a95c832b","updated":"2021-11-19 09:26:23.000000000","message":"Note: the corresponding Libvirt changes have been merged already - I\u0027ll update the commit message next time I rebase.\n\nhttps://gitlab.com/libvirt/libvirt/-/commits/master?search\u003dPCI.*VPD","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"d8e33381795f6c11da1ab4e91ffc8db2f821e90d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"83753646_f3cc731f","updated":"2021-11-19 13:49:05.000000000","message":"Thanks for the review. Added some comments inline, will do a respin with small fixes.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4538c963_fdf6502a","updated":"2021-11-19 13:06:59.000000000","message":"i think this looks pretty good to be honest.\ni have some nits in line and it would be nice to add a small release not that can then be extended by the follow on patch but i dont see any major issues so +1\n\nbecasue this is not actully querying libvirt for any extra data via new apis just parsing extra xml elements form the exsitng api it also does not need any libvirt version check which is nice too.\nwe shoudl however list the version of libvirt that enabled reporting VPD info in the release note.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"339dade60afb48a14dbd461aa9c261070c3b8982","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8414e573_bf139f84","updated":"2021-11-19 10:13:21.000000000","message":"recheck","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a82eb5e22d22042931077ccb8d2fcaaa06e69cc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0ca53c1f_66a4bec6","updated":"2021-11-19 19:50:54.000000000","message":"recheck","commit_id":"e228a361f79148f695b1ea5b4c2fae6b8ae2c586"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"9657fa9420a30c9f1a0bfe0d7e9288b93b37b45f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"9db968c1_40c4fe35","updated":"2021-11-19 20:16:01.000000000","message":"Added a release note with Libvirt version references and fixed the commit message.\n\nMight also be worth implementing the logic to take the VPD data from a PF if it is not available on a VF in this change.\n\nPresence of VPD on VFs is firmware-specific and the above logic might help with increasing the range of supported devices or their default configurations.","commit_id":"cfc89a48550a07ab6fe817225057b8383beae19c"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"ee4608f0dcf5dbf556152ced5353ad2200fc7bc2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"54a9c793_563353c5","updated":"2021-11-22 22:11:21.000000000","message":"Implemented the logic to retrieve VPD information from a parent PF in case a VF does not have it and added new test cases for that.\n\nHaving VPD exposed on a VF is now optional.","commit_id":"cff864a8ed50b40682336ac44561121fd2cba042"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ec0eedd257a2fab24401e06909ef1221ba55cb38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f613a352_da5c4092","in_reply_to":"54a9c793_563353c5","updated":"2021-12-17 11:38:34.000000000","message":"ack i proably would have left that for a follow up patch to keep it minimal but ill re review","commit_id":"cff864a8ed50b40682336ac44561121fd2cba042"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"8fa892cc_99af9da2","updated":"2022-01-11 11:08:54.000000000","message":"A handful of nits which you free to ignore and one probably bug in the handling of parentless VFs. Overall looks pretty clean.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"ad1aadecc2184301880d5254371dc8079be4f9b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"2c1f68e2_e5c7dcb9","updated":"2022-01-11 14:58:26.000000000","message":"Thanks for the reviews! I\u0027ll address the issues that were brought up and re-spin.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"5a7b18cead5eee47fdd1b727e666fcd716bfafd8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"e0d15d8b_a930cb9e","updated":"2021-11-25 12:20:08.000000000","message":"recheck","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"09e599e4879aec055854d566e3d662ac1ba68f67","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"3f05a848_cf628080","updated":"2022-01-16 10:55:44.000000000","message":"Looks like the following tests are failing in tempest-integrated-compute-centos-8-stream:\n\ntempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_hotplug_nic\ntempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops\n\nbut that does not happen in tempest-integrated-compute.\n\nDon\u0027t see a relation between this change and a failure though.","commit_id":"7b8d37b592cfcb1f223538b4193de7cd3c2397a4"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"5c5f2e79266bd3eeddfecf2b7e1c108d5d50e1ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"007a592c_028fbc8b","updated":"2022-01-13 14:49:57.000000000","message":"recheck","commit_id":"7b8d37b592cfcb1f223538b4193de7cd3c2397a4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d23dcbecb3b732ee0744cdddf469d145a846a21c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"c2ce2c88_5f5a751f","updated":"2022-01-24 10:55:23.000000000","message":"i think this inital patch is in a good state i will try to review the rest of the series this\nweek but this is self contained and i think it can merge independtly of the rest of the series.\n\nthanks for your work on this.","commit_id":"c2929f74dd2800a1d3c870aff796421908753b7e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"dbc2a9e115ab522b56b3611ef1ebe0e2bec999da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"74347d4f_a8ce2757","in_reply_to":"c2ce2c88_5f5a751f","updated":"2022-01-24 18:08:38.000000000","message":"Thanks a lot for the reviews!","commit_id":"c2929f74dd2800a1d3c870aff796421908753b7e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f18d1f6416400ca305bc188d5ce228c4088528c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"2628d632_4f169a1f","updated":"2022-02-01 13:15:50.000000000","message":"I have couple of suggestions inline. But it is close so I can be convinced to fix those in a followup instead of respinning the series","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b2be177d2e5650b124337e2eaee817d85f38f477","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"1182aed4_7bc58050","updated":"2022-02-01 14:32:16.000000000","message":"ok reducing to +1 i agree with gibi\u0027s comments\n","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"45f04a3a02ec6fdd7f7c2bb1f115b88bce2a61c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"aa562b7d_18b55930","updated":"2022-02-03 13:20:46.000000000","message":"Looks good to me","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8d0e5603f67150489b8ee737981f5fe272a79035","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"fdc9be24_aebfa96d","updated":"2022-02-02 10:35:29.000000000","message":"https://bugs.launchpad.net/tempest/+bug/1959467 is fixed now, going to do another recheck","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"098f6d130dbc4c1ef8902761683ad9cfdcff75a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"b631a30d_a2a90b6d","updated":"2022-02-02 10:35:35.000000000","message":"recheck","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"d831756a08d4238caf94fca8d1b331fc5f5a1313","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"de708c96_a0cb6723","updated":"2022-02-05 06:26:11.000000000","message":"recheck","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"35115b17df77985ad40768a2228bc39207e2065b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"ef1f18ea_863b63d9","updated":"2022-02-01 20:29:21.000000000","message":"recheck","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"c2049193_0367f2a3","updated":"2022-02-04 16:26:54.000000000","message":"the fact gerrit now brings up all the old comments is annoying but i checked them and marked them as done.\n\nanyway i think this is safe to merge before the rest of the seirice and i am happy with this so i would like to merge the vpd part now.\n\nthe rest of the series likely shoudl merge together but this is self contained so +2.","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"7c4afce84022846b4636a74e43cfd815cc83172e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"7ec736d3_06f2346d","in_reply_to":"c2049193_0367f2a3","updated":"2022-02-04 18:05:04.000000000","message":"\\o/ tyvm","commit_id":"ab49f97b2c08294234c7bfd3dedb75780ca519e6"}],"nova/network/neutron.py":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"5499251a7126551bd01a8436167311fda9db440e","unresolved":true,"context_lines":[{"line_number":665,"context_line":"            # NOTE: We\u0027re doing this to remove the binding information"},{"line_number":666,"context_line":"            # for the physical device but don\u0027t want to overwrite the other"},{"line_number":667,"context_line":"            # information in the binding profile."},{"line_number":668,"context_line":"            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,"},{"line_number":669,"context_line":"                                constants.ALLOCATION, \u0027arq_uuid\u0027):"},{"line_number":670,"context_line":"                if profile_key in port_profile:"},{"line_number":671,"context_line":"                    del port_profile[profile_key]"},{"line_number":672,"context_line":"            port_req_body[\u0027port\u0027][constants.BINDING_PROFILE] \u003d port_profile"}],"source_content_type":"text/x-python","patch_set":6,"id":"ef6665df_8fca9a60","line":669,"range":{"start_line":668,"start_character":1,"end_line":669,"end_character":66},"updated":"2021-10-25 17:07:50.000000000","message":"This works around the issue:\n\n            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,\n                                constants.ALLOCATION, \u0027arq_uuid\u0027,\n                                \u0027physical_network\u0027, \u0027card_serial_number\u0027,\n                                \u0027pf_mac_address\u0027, \u0027vf_num\u0027):\n\nI don\u0027t know if the strings should be made into constants, if the behavior should be conditional depending on VNIC_TYPE or if this could work as-is.","commit_id":"322fb9f160d6becf5c586c759868240183a8a621"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":665,"context_line":"            # NOTE: We\u0027re doing this to remove the binding information"},{"line_number":666,"context_line":"            # for the physical device but don\u0027t want to overwrite the other"},{"line_number":667,"context_line":"            # information in the binding profile."},{"line_number":668,"context_line":"            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,"},{"line_number":669,"context_line":"                                constants.ALLOCATION, \u0027arq_uuid\u0027):"},{"line_number":670,"context_line":"                if profile_key in port_profile:"},{"line_number":671,"context_line":"                    del port_profile[profile_key]"},{"line_number":672,"context_line":"            port_req_body[\u0027port\u0027][constants.BINDING_PROFILE] \u003d port_profile"}],"source_content_type":"text/x-python","patch_set":6,"id":"dda60833_23e44415","line":669,"range":{"start_line":668,"start_character":1,"end_line":669,"end_character":66},"in_reply_to":"ef6665df_8fca9a60","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"322fb9f160d6becf5c586c759868240183a8a621"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"5499251a7126551bd01a8436167311fda9db440e","unresolved":true,"context_lines":[{"line_number":1502,"context_line":"    def _get_pci_device_profile(self, pci_dev):"},{"line_number":1503,"context_line":"        dev_spec \u003d self.pci_whitelist.get_devspec(pci_dev)"},{"line_number":1504,"context_line":"        if dev_spec:"},{"line_number":1505,"context_line":"            dev_profile \u003d {\u0027pci_vendor_info\u0027: \"%s:%s\" %"},{"line_number":1506,"context_line":"                           (pci_dev.vendor_id, pci_dev.product_id),"},{"line_number":1507,"context_line":"                           \u0027pci_slot\u0027: pci_dev.address,"},{"line_number":1508,"context_line":"                           \u0027physical_network\u0027:"},{"line_number":1509,"context_line":"                        dev_spec.get_tags().get(\u0027physical_network\u0027)}"},{"line_number":1510,"context_line":"            card_serial_number \u003d pci_dev.card_serial_number"},{"line_number":1511,"context_line":"            if card_serial_number:"},{"line_number":1512,"context_line":"                dev_profile.update({"},{"line_number":1513,"context_line":"                    \u0027card_serial_number\u0027: card_serial_number"},{"line_number":1514,"context_line":"                })"},{"line_number":1515,"context_line":"            return dev_profile"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"        raise exception.PciDeviceNotFound(node_id\u003dpci_dev.compute_node_id,"},{"line_number":1518,"context_line":"                                          address\u003dpci_dev.address)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5c3f6a2b_839883e5","line":1515,"range":{"start_line":1505,"start_character":0,"end_line":1515,"end_character":30},"updated":"2021-10-25 17:07:50.000000000","message":"The new keys added here needs to be removed again at https://review.opendev.org/c/openstack/nova/+/808199/6/nova/network/neutron.py#668\n\nOtherwise the Neutron data validation will lead to the request to update the port to raise an exception and log something like this:\n\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers [req-d10a98b9-031d-4bc2-8a89-474b4597a3c0 cb257beb2c40444eaa8131d92d87a400 b0430c9341f7489180f2ff95f49c44d0 - 15e93e29d3b546feafdcd28a2703672a 15e93e29d3b546feafdcd28a2703672a] Mechanism driver \u0027ovn\u0027 failed in update_port_precommit: neutron_lib.exceptions.InvalidInput: Invalid input for operation: Invalid binding:profile. dict_keys([\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027, \u0027physical_network\u0027, \u0027card_serial_number\u0027, \u0027pf_mac_address\u0027, \u0027vf_num\u0027]) are all required..\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers Traceback (most recent call last):\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers   File \"/usr/lib/python3/dist-packages/neutron/plugins/ml2/managers.py\", line 477, in _call_on_drivers\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers     getattr(driver.obj, method_name)(context)\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers   File \"/usr/lib/python3/dist-packages/neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py\", line 754, in update_port_precommit\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers     ovn_utils.validate_and_get_data_from_binding_profile(port)\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers   File \"/usr/lib/python3/dist-packages/neutron/common/ovn/utils.py\", line 243, in validate_and_get_data_from_binding_profile\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers     raise n_exc.InvalidInput(error_message\u003dmsg)\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers neutron_lib.exceptions.InvalidInput: Invalid input for operation: Invalid binding:profile. dict_keys([\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027, \u0027physical_network\u0027, \u0027card_serial_number\u0027, \u0027pf_mac_address\u0027, \u0027vf_num\u0027]) are all required..\n2021-10-25 16:49:03.668 593357 ERROR neutron.plugins.ml2.managers\n2021-10-25 16:49:03.685 593357 INFO neutron.pecan_wsgi.hooks.translation [req-d10a98b9-031d-4bc2-8a89-474b4597a3c0 cb257beb2c40444eaa8131d92d87a400 b0430c9341f7489180f2ff95f49c44d0 - 15e93e29d3b546feafdcd28a2703672a 15e93e29d3b546feafdcd28a2703672a] PUT failed (client error): The server could not comply with the request since it is either malformed or otherwise incorrect.\n2021-10-25 16:49:03.686 593357 INFO neutron.wsgi [req-d10a98b9-031d-4bc2-8a89-474b4597a3c0 cb257beb2c40444eaa8131d92d87a400 b0430c9341f7489180f2ff95f49c44d0 - 15e93e29d3b546feafdcd28a2703672a 15e93e29d3b546feafdcd28a2703672a] 10.246.114.7,127.0.0.1 \"PUT /v2.0/ports/dffc3b2b-f2e3-487e-b3e7-154fbf41a57e HTTP/1.1\" status: 400  len: 464 time: 0.4498489","commit_id":"322fb9f160d6becf5c586c759868240183a8a621"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":1516,"context_line":"                dev_profile.update({"},{"line_number":1517,"context_line":"                    \u0027card_serial_number\u0027: card_serial_number"},{"line_number":1518,"context_line":"                })"},{"line_number":1519,"context_line":"            return dev_profile"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"        raise exception.PciDeviceNotFound(node_id\u003dpci_dev.compute_node_id,"},{"line_number":1522,"context_line":"                                          address\u003dpci_dev.address)"}],"source_content_type":"text/x-python","patch_set":7,"id":"b8114a79_99dd3726","line":1519,"updated":"2021-11-19 13:06:59.000000000","message":"+1 adding the serial when ever its present makes sense.\nits harmless to include for ports that dont need it and\nit keeps the logic simple.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":1516,"context_line":"                dev_profile.update({"},{"line_number":1517,"context_line":"                    \u0027card_serial_number\u0027: card_serial_number"},{"line_number":1518,"context_line":"                })"},{"line_number":1519,"context_line":"            return dev_profile"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"        raise exception.PciDeviceNotFound(node_id\u003dpci_dev.compute_node_id,"},{"line_number":1522,"context_line":"                                          address\u003dpci_dev.address)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ffbfc6e5_46bc4011","line":1519,"in_reply_to":"b8114a79_99dd3726","updated":"2022-02-04 16:26:54.000000000","message":"Ack","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":1506,"context_line":"    def _get_pci_device_profile(self, pci_dev):"},{"line_number":1507,"context_line":"        dev_spec \u003d self.pci_whitelist.get_devspec(pci_dev)"},{"line_number":1508,"context_line":"        if dev_spec:"},{"line_number":1509,"context_line":"            dev_profile \u003d {\u0027pci_vendor_info\u0027: \"%s:%s\" %"},{"line_number":1510,"context_line":"                           (pci_dev.vendor_id, pci_dev.product_id),"},{"line_number":1511,"context_line":"                           \u0027pci_slot\u0027: pci_dev.address,"},{"line_number":1512,"context_line":"                           \u0027physical_network\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bb0a865f_2aac6774","line":1509,"range":{"start_line":1509,"start_character":26,"end_line":1509,"end_character":28},"updated":"2022-01-11 11:08:54.000000000","message":"nit: as you reformatting it I would suggest to add a wrap between { and \u0027 as well.\n\nor if you want to go full black then\n\n            dev_profile \u003d {\n                \u0027pci_vendor_info\u0027: \"%s:%s\"\n                % (pci_dev.vendor_id, pci_dev.product_id),\n                \u0027pci_slot\u0027: pci_dev.address,\n                \u0027physical_network\u0027: dev_spec.get_tags().get(\n                    \u0027physical_network\u0027\n                ),\n            }","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1506,"context_line":"    def _get_pci_device_profile(self, pci_dev):"},{"line_number":1507,"context_line":"        dev_spec \u003d self.pci_whitelist.get_devspec(pci_dev)"},{"line_number":1508,"context_line":"        if dev_spec:"},{"line_number":1509,"context_line":"            dev_profile \u003d {\u0027pci_vendor_info\u0027: \"%s:%s\" %"},{"line_number":1510,"context_line":"                           (pci_dev.vendor_id, pci_dev.product_id),"},{"line_number":1511,"context_line":"                           \u0027pci_slot\u0027: pci_dev.address,"},{"line_number":1512,"context_line":"                           \u0027physical_network\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"432f3ff7_5f82a38b","line":1509,"range":{"start_line":1509,"start_character":26,"end_line":1509,"end_character":28},"in_reply_to":"a3a4fd6c_47f11511","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c70f0a1dade97a24ab456583ac3c885c35dff919","unresolved":true,"context_lines":[{"line_number":1506,"context_line":"    def _get_pci_device_profile(self, pci_dev):"},{"line_number":1507,"context_line":"        dev_spec \u003d self.pci_whitelist.get_devspec(pci_dev)"},{"line_number":1508,"context_line":"        if dev_spec:"},{"line_number":1509,"context_line":"            dev_profile \u003d {\u0027pci_vendor_info\u0027: \"%s:%s\" %"},{"line_number":1510,"context_line":"                           (pci_dev.vendor_id, pci_dev.product_id),"},{"line_number":1511,"context_line":"                           \u0027pci_slot\u0027: pci_dev.address,"},{"line_number":1512,"context_line":"                           \u0027physical_network\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"a3a4fd6c_47f11511","line":1509,"range":{"start_line":1509,"start_character":26,"end_line":1509,"end_character":28},"in_reply_to":"bb0a865f_2aac6774","updated":"2022-01-11 14:14:31.000000000","message":"ya that i the general recommenation even for pep8\nif you have to go onto multiple lines you are always recommened to move all data to the next line\n\nthis also applies to function ro any other uage of brackets.\n\nits a minor nit but it help reduce the overall indentation so if you do respin +1","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":false,"context_lines":[{"line_number":1511,"context_line":"                           \u0027pci_slot\u0027: pci_dev.address,"},{"line_number":1512,"context_line":"                           \u0027physical_network\u0027:"},{"line_number":1513,"context_line":"                        dev_spec.get_tags().get(\u0027physical_network\u0027)}"},{"line_number":1514,"context_line":"            card_serial_number \u003d pci_dev.card_serial_number"},{"line_number":1515,"context_line":"            if card_serial_number:"},{"line_number":1516,"context_line":"                dev_profile.update({"},{"line_number":1517,"context_line":"                    \u0027card_serial_number\u0027: card_serial_number"}],"source_content_type":"text/x-python","patch_set":11,"id":"a445e35b_368a6717","line":1514,"updated":"2022-01-11 11:08:54.000000000","message":"OK, this does not create an upgrade impact as the new field is provided by a property on the OVO that returns None if the underlying data structure is old and don\u0027t have the new field. \n\nAlso this new field end up in the binding:profile of the port which is unversioned in neutron so we are not breaking any APIs adding new stuff there.\n\nnicely done","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c70f0a1dade97a24ab456583ac3c885c35dff919","unresolved":false,"context_lines":[{"line_number":1511,"context_line":"                           \u0027pci_slot\u0027: pci_dev.address,"},{"line_number":1512,"context_line":"                           \u0027physical_network\u0027:"},{"line_number":1513,"context_line":"                        dev_spec.get_tags().get(\u0027physical_network\u0027)}"},{"line_number":1514,"context_line":"            card_serial_number \u003d pci_dev.card_serial_number"},{"line_number":1515,"context_line":"            if card_serial_number:"},{"line_number":1516,"context_line":"                dev_profile.update({"},{"line_number":1517,"context_line":"                    \u0027card_serial_number\u0027: card_serial_number"}],"source_content_type":"text/x-python","patch_set":11,"id":"c587577f_3b983fc3","line":1514,"in_reply_to":"a445e35b_368a6717","updated":"2022-01-11 14:14:31.000000000","message":"yes and also the binding profile by definition is owned by nova/ironic\n\ni.e. it is defiend as being used by the hypertiors to pass info to the netwrok backend.\nwe are allowed to start any info in it we like but nothing else shoudl every use it so we effectly define the keys that are vaild to be set in nova as a result.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f18d1f6416400ca305bc188d5ce228c4088528c","unresolved":true,"context_lines":[{"line_number":667,"context_line":"            # for the physical device but don\u0027t want to overwrite the other"},{"line_number":668,"context_line":"            # information in the binding profile."},{"line_number":669,"context_line":"            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,"},{"line_number":670,"context_line":"                                constants.ALLOCATION, \u0027arq_uuid\u0027):"},{"line_number":671,"context_line":"                if profile_key in port_profile:"},{"line_number":672,"context_line":"                    del port_profile[profile_key]"},{"line_number":673,"context_line":"            port_req_body[\u0027port\u0027][constants.BINDING_PROFILE] \u003d port_profile"}],"source_content_type":"text/x-python","patch_set":15,"id":"d997990a_5be803b3","line":670,"updated":"2022-02-01 13:15:50.000000000","message":"Frode mentioned this in PS6 before and I tend to agree that we should remove the new fields from the profile during unbind that we add during bind","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b2be177d2e5650b124337e2eaee817d85f38f477","unresolved":true,"context_lines":[{"line_number":667,"context_line":"            # for the physical device but don\u0027t want to overwrite the other"},{"line_number":668,"context_line":"            # information in the binding profile."},{"line_number":669,"context_line":"            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,"},{"line_number":670,"context_line":"                                constants.ALLOCATION, \u0027arq_uuid\u0027):"},{"line_number":671,"context_line":"                if profile_key in port_profile:"},{"line_number":672,"context_line":"                    del port_profile[profile_key]"},{"line_number":673,"context_line":"            port_req_body[\u0027port\u0027][constants.BINDING_PROFILE] \u003d port_profile"}],"source_content_type":"text/x-python","patch_set":15,"id":"56a338ae_fdcc86d2","line":670,"in_reply_to":"54d64de4_17ee3c3c","updated":"2022-02-01 14:32:16.000000000","message":"when we unbind the port i was expecting use to already clear the binding profile.\nthe binding profile is used  to pass inform from nova to neutron so in general nothing else shoudl be stored thare althoguh i guess we dont do that todya becaue of the trusted vf hack\n\nal info related to the pci devcei including ht pci_slot and vendor info we add today shoudl be remvoed on unbind in any case.","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"bf09b2c0396eafb2df17ec80818c48aebe52e78d","unresolved":false,"context_lines":[{"line_number":667,"context_line":"            # for the physical device but don\u0027t want to overwrite the other"},{"line_number":668,"context_line":"            # information in the binding profile."},{"line_number":669,"context_line":"            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,"},{"line_number":670,"context_line":"                                constants.ALLOCATION, \u0027arq_uuid\u0027):"},{"line_number":671,"context_line":"                if profile_key in port_profile:"},{"line_number":672,"context_line":"                    del port_profile[profile_key]"},{"line_number":673,"context_line":"            port_req_body[\u0027port\u0027][constants.BINDING_PROFILE] \u003d port_profile"}],"source_content_type":"text/x-python","patch_set":15,"id":"f57404a4_d995f797","line":670,"in_reply_to":"56a338ae_fdcc86d2","updated":"2022-02-01 14:59:21.000000000","message":"Done","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a9297aab7c60030ff5132ef1fa51d49651ce0679","unresolved":true,"context_lines":[{"line_number":667,"context_line":"            # for the physical device but don\u0027t want to overwrite the other"},{"line_number":668,"context_line":"            # information in the binding profile."},{"line_number":669,"context_line":"            for profile_key in (\u0027pci_vendor_info\u0027, \u0027pci_slot\u0027,"},{"line_number":670,"context_line":"                                constants.ALLOCATION, \u0027arq_uuid\u0027):"},{"line_number":671,"context_line":"                if profile_key in port_profile:"},{"line_number":672,"context_line":"                    del port_profile[profile_key]"},{"line_number":673,"context_line":"            port_req_body[\u0027port\u0027][constants.BINDING_PROFILE] \u003d port_profile"}],"source_content_type":"text/x-python","patch_set":15,"id":"54d64de4_17ee3c3c","line":670,"in_reply_to":"d997990a_5be803b3","updated":"2022-02-01 14:09:15.000000000","message":"Yes, agreed that \u0027card_serial_number\u0027 should be removed in this patchset, not the next as I have it now.\n\nPlus the physical_network attribute which was there before needs to be cleared as well.","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"}],"nova/objects/pci_device.py":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"811431006c454cf09f00b54f7e273649c8fa29e2","unresolved":true,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    @property"},{"line_number":515,"context_line":"    def card_serial_number(self):"},{"line_number":516,"context_line":"        caps \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps:"},{"line_number":518,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":519,"context_line":"            if vpd_cap:"}],"source_content_type":"text/x-python","patch_set":4,"id":"aada9a0d_c4c8a895","line":516,"updated":"2021-10-05 10:54:31.000000000","message":"We need to de-serialize the capabilities here, something like: \n\n    jsonutils.loads(self.extra_info.get(\u0027capabilities\u0027))","commit_id":"11a0a50a8537ca067b71856e5919dc06b4159bc6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    @property"},{"line_number":515,"context_line":"    def card_serial_number(self):"},{"line_number":516,"context_line":"        caps \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps:"},{"line_number":518,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":519,"context_line":"            if vpd_cap:"}],"source_content_type":"text/x-python","patch_set":4,"id":"d1d98dd0_ff24ccb8","line":516,"in_reply_to":"aada9a0d_c4c8a895","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"11a0a50a8537ca067b71856e5919dc06b4159bc6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":"        return None"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"6021dfce_b62eb0ca","line":521,"range":{"start_line":519,"start_character":0,"end_line":521,"end_character":56},"updated":"2022-01-11 11:08:54.000000000","message":"nit: if you want to spare one conditional then you can do this:\n\n  return caps.get(\u0027vdp\u0027, {}).get(\u0027card_serial_number\u0027)\n\nor even\n\n  caps_json \u003d self.extra_info.get(\u0027capabilities\u0027, {})\n  caps \u003d jsonutils.loads(caps_json)\n  return caps.get(\u0027vdp\u0027, {}).get(\u0027card_serial_number\u0027)\n\nto spare both","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c70f0a1dade97a24ab456583ac3c885c35dff919","unresolved":true,"context_lines":[{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":"        return None"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"84984d71_99571a5c","line":521,"range":{"start_line":519,"start_character":0,"end_line":521,"end_character":56},"in_reply_to":"6021dfce_b62eb0ca","updated":"2022-01-11 14:14:31.000000000","message":"yep i think the later is nicer and more readable.\ncaps_json \u003d self.extra_info.get(\u0027capabilities\u0027, {})\nlikely  shoudl be \n\ncaps_json \u003d self.extra_info.get(\u0027capabilities\u0027, \u0027\u0027)\n\njsonutils.loads shoudl be expecting a string not a dictionary","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":"        return None"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fe7e05c0_f5988c75","line":521,"range":{"start_line":519,"start_character":0,"end_line":521,"end_character":56},"in_reply_to":"84984d71_99571a5c","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f18d1f6416400ca305bc188d5ce228c4088528c","unresolved":true,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    @property"},{"line_number":515,"context_line":"    def card_serial_number(self):"},{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027, \"{}\")"},{"line_number":524,"context_line":"        caps \u003d jsonutils.loads(caps_json)"},{"line_number":525,"context_line":"        return caps.get(\u0027vpd\u0027, {}).get(\u0027card_serial_number\u0027)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":15,"id":"a02394c6_9a024e27","line":525,"range":{"start_line":516,"start_character":0,"end_line":525,"end_character":60},"updated":"2022-02-01 13:15:50.000000000","message":"why do we need both L516-520 and L523-252? I think the latter is enough as it means the same as the former.","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b2be177d2e5650b124337e2eaee817d85f38f477","unresolved":true,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    @property"},{"line_number":515,"context_line":"    def card_serial_number(self):"},{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027, \"{}\")"},{"line_number":524,"context_line":"        caps \u003d jsonutils.loads(caps_json)"},{"line_number":525,"context_line":"        return caps.get(\u0027vpd\u0027, {}).get(\u0027card_serial_number\u0027)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":15,"id":"f03dd5b9_570ef894","line":525,"range":{"start_line":516,"start_character":0,"end_line":525,"end_character":60},"in_reply_to":"6099d8b0_b9399135","updated":"2022-02-01 14:32:16.000000000","message":"oh i completely missed that.","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a9297aab7c60030ff5132ef1fa51d49651ce0679","unresolved":true,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    @property"},{"line_number":515,"context_line":"    def card_serial_number(self):"},{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027, \"{}\")"},{"line_number":524,"context_line":"        caps \u003d jsonutils.loads(caps_json)"},{"line_number":525,"context_line":"        return caps.get(\u0027vpd\u0027, {}).get(\u0027card_serial_number\u0027)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":15,"id":"6099d8b0_b9399135","line":525,"range":{"start_line":516,"start_character":0,"end_line":525,"end_character":60},"in_reply_to":"a02394c6_9a024e27","updated":"2022-02-01 14:09:15.000000000","message":"Looks like I forgot to remove the portion that Sean suggested I refactor - silly me.\n\nhttps://review.opendev.org/c/openstack/nova/+/808199/11/nova/objects/pci_device.py#515\n\nThanks for noticing!","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"bf09b2c0396eafb2df17ec80818c48aebe52e78d","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"    @property"},{"line_number":515,"context_line":"    def card_serial_number(self):"},{"line_number":516,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027)"},{"line_number":517,"context_line":"        if caps_json:"},{"line_number":518,"context_line":"            caps \u003d jsonutils.loads(caps_json)"},{"line_number":519,"context_line":"            vpd_cap \u003d caps.get(\u0027vpd\u0027)"},{"line_number":520,"context_line":"            if vpd_cap:"},{"line_number":521,"context_line":"                return vpd_cap.get(\u0027card_serial_number\u0027)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        caps_json \u003d self.extra_info.get(\u0027capabilities\u0027, \"{}\")"},{"line_number":524,"context_line":"        caps \u003d jsonutils.loads(caps_json)"},{"line_number":525,"context_line":"        return caps.get(\u0027vpd\u0027, {}).get(\u0027card_serial_number\u0027)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":15,"id":"086d39b3_c785eebf","line":525,"range":{"start_line":516,"start_character":0,"end_line":525,"end_character":60},"in_reply_to":"f03dd5b9_570ef894","updated":"2022-02-01 14:59:21.000000000","message":"Done","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"}],"nova/tests/fixtures/libvirt_data.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":2049,"context_line":"          \u003clink validity\u003d\u0027sta\u0027 speed\u003d\u00278\u0027 width\u003d\u00278\u0027/\u003e"},{"line_number":2050,"context_line":"        \u003c/pci-express\u003e"},{"line_number":2051,"context_line":"      \u003c/capability\u003e"},{"line_number":2052,"context_line":"    \u003c/device\u003e\"\"\"  # noqa:E501"},{"line_number":2053,"context_line":"}"},{"line_number":2054,"context_line":""},{"line_number":2055,"context_line":"_fake_NodeDevXml_parents \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"2f22f0d0_2aff8e29","line":2052,"range":{"start_line":2052,"start_character":25,"end_line":2052,"end_character":29},"updated":"2021-11-19 13:06:59.000000000","message":"ah line to long ya that makes sense.\nthis is just static data we do not need to enforce that here.\nalso thanks for adding this it is good to have an example of what this will look like.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":2049,"context_line":"          \u003clink validity\u003d\u0027sta\u0027 speed\u003d\u00278\u0027 width\u003d\u00278\u0027/\u003e"},{"line_number":2050,"context_line":"        \u003c/pci-express\u003e"},{"line_number":2051,"context_line":"      \u003c/capability\u003e"},{"line_number":2052,"context_line":"    \u003c/device\u003e\"\"\"  # noqa:E501"},{"line_number":2053,"context_line":"}"},{"line_number":2054,"context_line":""},{"line_number":2055,"context_line":"_fake_NodeDevXml_parents \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"0d6969b1_2fc26ac5","line":2052,"range":{"start_line":2052,"start_character":25,"end_line":2052,"end_character":29},"in_reply_to":"2f22f0d0_2aff8e29","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"}],"nova/tests/unit/network/test_neutron.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":7392,"context_line":""},{"line_number":7393,"context_line":"    @mock.patch.object(pci_whitelist.Whitelist, \u0027get_devspec\u0027)"},{"line_number":7394,"context_line":"    @mock.patch.object(pci_manager, \u0027get_instance_pci_devs\u0027)"},{"line_number":7395,"context_line":"    def test_populate_neutron_extension_values_binding_sriov(self,"},{"line_number":7396,"context_line":"                                         mock_get_instance_pci_devs,"},{"line_number":7397,"context_line":"                                         mock_get_pci_device_devspec):"},{"line_number":7398,"context_line":"        host_id \u003d \u0027my_host_id\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"a9728f28_315025a5","line":7395,"updated":"2021-11-19 13:06:59.000000000","message":"ok so this covers legacy device without the VPD capablity","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":7392,"context_line":""},{"line_number":7393,"context_line":"    @mock.patch.object(pci_whitelist.Whitelist, \u0027get_devspec\u0027)"},{"line_number":7394,"context_line":"    @mock.patch.object(pci_manager, \u0027get_instance_pci_devs\u0027)"},{"line_number":7395,"context_line":"    def test_populate_neutron_extension_values_binding_sriov(self,"},{"line_number":7396,"context_line":"                                         mock_get_instance_pci_devs,"},{"line_number":7397,"context_line":"                                         mock_get_pci_device_devspec):"},{"line_number":7398,"context_line":"        host_id \u003d \u0027my_host_id\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa65947_56daa335","line":7395,"in_reply_to":"a9728f28_315025a5","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":7426,"context_line":""},{"line_number":7427,"context_line":"    @mock.patch.object(pci_whitelist.Whitelist, \u0027get_devspec\u0027)"},{"line_number":7428,"context_line":"    @mock.patch.object(pci_manager, \u0027get_instance_pci_devs\u0027)"},{"line_number":7429,"context_line":"    def test_populate_neutron_extension_values_binding_sriov_card_serial("},{"line_number":7430,"context_line":"        self, mock_get_instance_pci_devs, mock_get_pci_device_devspec):"},{"line_number":7431,"context_line":"        host_id \u003d \u0027my_host_id\u0027"},{"line_number":7432,"context_line":"        instance \u003d {\u0027host\u0027: host_id}"}],"source_content_type":"text/x-python","patch_set":7,"id":"cc75ac0c_2679a0bb","line":7429,"updated":"2021-11-19 13:06:59.000000000","message":"and this covers the case where VPD is present so both have coverage :)","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":7426,"context_line":""},{"line_number":7427,"context_line":"    @mock.patch.object(pci_whitelist.Whitelist, \u0027get_devspec\u0027)"},{"line_number":7428,"context_line":"    @mock.patch.object(pci_manager, \u0027get_instance_pci_devs\u0027)"},{"line_number":7429,"context_line":"    def test_populate_neutron_extension_values_binding_sriov_card_serial("},{"line_number":7430,"context_line":"        self, mock_get_instance_pci_devs, mock_get_pci_device_devspec):"},{"line_number":7431,"context_line":"        host_id \u003d \u0027my_host_id\u0027"},{"line_number":7432,"context_line":"        instance \u003d {\u0027host\u0027: host_id}"}],"source_content_type":"text/x-python","patch_set":7,"id":"0216e5e6_24458dfc","line":7429,"in_reply_to":"cc75ac0c_2679a0bb","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":7454,"context_line":"        devspec.get_tags.return_value \u003d {\u0027physical_network\u0027: \u0027physnet1\u0027}"},{"line_number":7455,"context_line":"        mock_get_pci_device_devspec.return_value \u003d devspec"},{"line_number":7456,"context_line":"        self.api._populate_neutron_binding_profile("},{"line_number":7457,"context_line":"            instance, pci_req_id, port_req_body, None)"},{"line_number":7458,"context_line":""},{"line_number":7459,"context_line":"        self.assertEqual(profile,"},{"line_number":7460,"context_line":"                         port_req_body[\u0027port\u0027]["}],"source_content_type":"text/x-python","patch_set":7,"id":"b33b30ab_932b2965","line":7457,"range":{"start_line":7457,"start_character":34,"end_line":7457,"end_character":47},"updated":"2021-11-19 13:06:59.000000000","message":"ah right this cuntion modifies its inputs instead of returning them.\ni forgot that for a moment this looks good to me","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":7454,"context_line":"        devspec.get_tags.return_value \u003d {\u0027physical_network\u0027: \u0027physnet1\u0027}"},{"line_number":7455,"context_line":"        mock_get_pci_device_devspec.return_value \u003d devspec"},{"line_number":7456,"context_line":"        self.api._populate_neutron_binding_profile("},{"line_number":7457,"context_line":"            instance, pci_req_id, port_req_body, None)"},{"line_number":7458,"context_line":""},{"line_number":7459,"context_line":"        self.assertEqual(profile,"},{"line_number":7460,"context_line":"                         port_req_body[\u0027port\u0027]["}],"source_content_type":"text/x-python","patch_set":7,"id":"3834d7d8_910b6f6a","line":7457,"range":{"start_line":7457,"start_character":34,"end_line":7457,"end_character":47},"in_reply_to":"b33b30ab_932b2965","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"}],"nova/tests/unit/objects/test_pci_device.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        self.dev_dict[\u0027capabilities\u0027] \u003d {\u0027vpd\u0027: {\u0027card_serial_number\u0027: \u002742\u0027}}"},{"line_number":171,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":172,"context_line":"        self.assertEqual(self.pci_device.card_serial_number, \u002742\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_update_device(self):"},{"line_number":175,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, dev_dict)"},{"line_number":176,"context_line":"        self.pci_device.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"ed386857_5d73967f","line":173,"updated":"2021-11-19 13:06:59.000000000","message":"nice and simple, one question on the serial number is it just a opaque string\nor does it have a defiend format.\n\ni assume its vendor depenent and we shoudl just treat it as an opaque string\nthat we pass around rather then trying to do any form of validation on it.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"50235de70b1b1fb7e0d04b14cdd2ad5a1253a048","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        self.dev_dict[\u0027capabilities\u0027] \u003d {\u0027vpd\u0027: {\u0027card_serial_number\u0027: \u002742\u0027}}"},{"line_number":171,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":172,"context_line":"        self.assertEqual(self.pci_device.card_serial_number, \u002742\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_update_device(self):"},{"line_number":175,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, dev_dict)"},{"line_number":176,"context_line":"        self.pci_device.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"c68f2a86_23a06490","line":173,"in_reply_to":"b2b040c9_ad241acf","updated":"2021-11-19 14:34:09.000000000","message":"my reall concern was really just ensuring it will be a vaild json string when its serialised adn sent to neutron in the profile.\n\nwe could enforece the size limit of 255 but i think this is not needed.\ninthis case.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        self.dev_dict[\u0027capabilities\u0027] \u003d {\u0027vpd\u0027: {\u0027card_serial_number\u0027: \u002742\u0027}}"},{"line_number":171,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":172,"context_line":"        self.assertEqual(self.pci_device.card_serial_number, \u002742\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_update_device(self):"},{"line_number":175,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, dev_dict)"},{"line_number":176,"context_line":"        self.pci_device.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"43c82853_91bdf87c","line":173,"in_reply_to":"c68f2a86_23a06490","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"d8e33381795f6c11da1ab4e91ffc8db2f821e90d","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        self.dev_dict[\u0027capabilities\u0027] \u003d {\u0027vpd\u0027: {\u0027card_serial_number\u0027: \u002742\u0027}}"},{"line_number":171,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, self.dev_dict)"},{"line_number":172,"context_line":"        self.assertEqual(self.pci_device.card_serial_number, \u002742\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_update_device(self):"},{"line_number":175,"context_line":"        self.pci_device \u003d pci_device.PciDevice.create(None, dev_dict)"},{"line_number":176,"context_line":"        self.pci_device.obj_reset_changes()"}],"source_content_type":"text/x-python","patch_set":7,"id":"b2b040c9_ad241acf","line":173,"in_reply_to":"ed386857_5d73967f","updated":"2021-11-19 13:49:05.000000000","message":"Had a discussion about the format with danpb [1]. Initially I restricted the set of characters to alphanumeric as the PCI/PCIe specs say, however, the vendors themselves violate this with punctuation and other printable characters.\n\nIn the end, danpb suggested allowing printable characters only instead of trying to enforce alphanumeric ones. The spec does not have concrete ranges or tables besides the verbal description saying \"alphanumeric\" so we stick with printable ASCII code points now [2].\n\nOne example he had for non-NIC PCI devices was some HPE component that had \"N/A\" printed instead of a serial number.\n\nEncountering a NIC with \"N/A\" for a serial number is subjectively unlikely for NICs (engineering samples I\u0027ve seen do not have a VPD at all).\n\nWe cannot statically (based on the value alone) or dynamically (via a vendor\u0027s manufacturing DB) validate uniqueness of a serial number much like with UUIDs. In this case we trust them to be unique because the PCI/PCIe specs require them to be unique and we trust Libvirt to read the right thing.\n\nDuplicate serial numbers on different NICs (manufacturing error) is another interesting possibility but I think Neutron should handle that when querying an OVN chassis hostname based on a serial number. From the operational standpoint, if such case is encountered, the offending NIC should be RMA-ed.\n\nAs we discussed in the early iterations of the spec, there is a possibility that a single DPU would service multiple compute nodes in a blade server in which case they would see the same serial number. Which means Nova should not do anything about multiple compute hosts seeing a device with the same serial.\n\nIn summary: I think we should treat it as a vendor-specific opaque string and trust its uniqueness. Since Libvirt enforces printable ASCII we could do that here too but Libvirt produces utf-8 encoded XML so we would be testing that Libvirt did not break.\n\nThe max VPD field value length per the PCI/PCIe spec is 255 bytes (because the length is encoded in 1 byte) so we have a size limit here as well in case we want to enforce it.\n\n\n[1] https://listman.redhat.com/archives/libvir-list/2021-October/msg01076.html\n[2] https://gitlab.com/libvirt/libvirt/-/blob/ad8ba5b1/src/util/virpcivpd.c#L193\n[3] https://libvirt.org/formatnode.html#VPDCap","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"}],"nova/tests/unit/virt/libvirt/test_config.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"e5a5db3b_9a27f1d1","line":3277,"updated":"2021-11-19 13:06:59.000000000","message":"i hva not compare this exactly but you proably could just reuse the one form the libvirt_data file?\n\nthis is fine too. since it self contained and it make it simpler to see what you are asserting.\n\nif you were copying it multiple time however it would be better to store it as a constant instead of inline.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"70d5a645_4f632616","line":3277,"in_reply_to":"95a085ed_475d1aa9","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"d8e33381795f6c11da1ab4e91ffc8db2f821e90d","unresolved":true,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"f87cff67_9c317cde","line":3277,"in_reply_to":"e5a5db3b_9a27f1d1","updated":"2021-11-19 13:49:05.000000000","message":"I think I could, I\u0027ll have a look.\n\nI think I was following what other test cases were doing but there\u0027s no need for a duplicate here.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"63fce80f7b20074e9fa2fb7119cd848cd5bc6803","unresolved":true,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"95a085ed_475d1aa9","line":3277,"in_reply_to":"f87cff67_9c317cde","updated":"2021-11-19 16:40:57.000000000","message":"Actually, in libvirt_data it\u0027s a full device XML whereas here it\u0027s just the VPD capability.\n\nSo I think it\u0027s better to keep those 2 separate rather than trying to reuse a portion.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":3313,"context_line":"        \u003clink validity\u003d\u0027cap\u0027 port\u003d\u00270\u0027 speed\u003d\u002716\u0027 width\u003d\u00278\u0027/\u003e"},{"line_number":3314,"context_line":"        \u003clink validity\u003d\u0027sta\u0027 speed\u003d\u00278\u0027 width\u003d\u00278\u0027/\u003e"},{"line_number":3315,"context_line":"      \u003c/pci-express\u003e"},{"line_number":3316,"context_line":"    \u003c/capability\u003e\"\"\"  # noqa: E501"},{"line_number":3317,"context_line":"        obj \u003d config.LibvirtConfigNodeDevicePciCap()"},{"line_number":3318,"context_line":"        obj.parse_str(xmlin)"},{"line_number":3319,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"b8b3b734_17d30933","line":3316,"range":{"start_line":3316,"start_character":30,"end_line":3316,"end_character":34},"updated":"2021-11-19 13:06:59.000000000","message":"again disableing line length checks for this i think is fine.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"63fce80f7b20074e9fa2fb7119cd848cd5bc6803","unresolved":false,"context_lines":[{"line_number":3313,"context_line":"        \u003clink validity\u003d\u0027cap\u0027 port\u003d\u00270\u0027 speed\u003d\u002716\u0027 width\u003d\u00278\u0027/\u003e"},{"line_number":3314,"context_line":"        \u003clink validity\u003d\u0027sta\u0027 speed\u003d\u00278\u0027 width\u003d\u00278\u0027/\u003e"},{"line_number":3315,"context_line":"      \u003c/pci-express\u003e"},{"line_number":3316,"context_line":"    \u003c/capability\u003e\"\"\"  # noqa: E501"},{"line_number":3317,"context_line":"        obj \u003d config.LibvirtConfigNodeDevicePciCap()"},{"line_number":3318,"context_line":"        obj.parse_str(xmlin)"},{"line_number":3319,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e527be03_8f502a89","line":3316,"range":{"start_line":3316,"start_character":30,"end_line":3316,"end_character":34},"in_reply_to":"b8b3b734_17d30933","updated":"2021-11-19 16:40:57.000000000","message":"Ack","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":3317,"context_line":"        obj \u003d config.LibvirtConfigNodeDevicePciCap()"},{"line_number":3318,"context_line":"        obj.parse_str(xmlin)"},{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"        self.assertEqual(0, obj.domain)"},{"line_number":3321,"context_line":"        self.assertEqual(130, obj.bus)"},{"line_number":3322,"context_line":"        self.assertEqual(0, obj.slot)"},{"line_number":3323,"context_line":"        self.assertEqual(1, obj.function)"},{"line_number":3324,"context_line":"        self.assertEqual(\"MT42822 BlueField-2\", obj.product)"},{"line_number":3325,"context_line":"        self.assertEqual(0xA2D6, obj.product_id)"},{"line_number":3326,"context_line":"        self.assertEqual(\"Mellanox Technologies\", obj.vendor)"},{"line_number":3327,"context_line":"        self.assertEqual(0x15B3, obj.vendor_id)"},{"line_number":3328,"context_line":"        self.assertEqual(obj.numa_node, 1)"},{"line_number":3329,"context_line":"        self.assertIsInstance(obj.vpd_capability,"},{"line_number":3330,"context_line":"                              config.LibvirtConfigNodeDeviceVpdCap)"},{"line_number":3331,"context_line":"        self.assertEqual(obj.vpd_capability.card_name, \u0027BlueField-2 DPU 25GbE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"4fa66068_f9580cd1","line":3328,"range":{"start_line":3320,"start_character":0,"end_line":3328,"end_character":42},"updated":"2021-11-19 13:06:59.000000000","message":"nit: these dont really hurt to assert but they are not related to the vpd feature\n\nif you respin can you leave a comment above and below this block jsut sayying\n\n# asserting common pci attribute parsing.\n\nand\n# asserting vpd capability parsing.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"d8e33381795f6c11da1ab4e91ffc8db2f821e90d","unresolved":true,"context_lines":[{"line_number":3317,"context_line":"        obj \u003d config.LibvirtConfigNodeDevicePciCap()"},{"line_number":3318,"context_line":"        obj.parse_str(xmlin)"},{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"        self.assertEqual(0, obj.domain)"},{"line_number":3321,"context_line":"        self.assertEqual(130, obj.bus)"},{"line_number":3322,"context_line":"        self.assertEqual(0, obj.slot)"},{"line_number":3323,"context_line":"        self.assertEqual(1, obj.function)"},{"line_number":3324,"context_line":"        self.assertEqual(\"MT42822 BlueField-2\", obj.product)"},{"line_number":3325,"context_line":"        self.assertEqual(0xA2D6, obj.product_id)"},{"line_number":3326,"context_line":"        self.assertEqual(\"Mellanox Technologies\", obj.vendor)"},{"line_number":3327,"context_line":"        self.assertEqual(0x15B3, obj.vendor_id)"},{"line_number":3328,"context_line":"        self.assertEqual(obj.numa_node, 1)"},{"line_number":3329,"context_line":"        self.assertIsInstance(obj.vpd_capability,"},{"line_number":3330,"context_line":"                              config.LibvirtConfigNodeDeviceVpdCap)"},{"line_number":3331,"context_line":"        self.assertEqual(obj.vpd_capability.card_name, \u0027BlueField-2 DPU 25GbE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"564f3a26_0a508c93","line":3328,"range":{"start_line":3320,"start_character":0,"end_line":3328,"end_character":42},"in_reply_to":"4fa66068_f9580cd1","updated":"2021-11-19 13:49:05.000000000","message":"Ack, will do.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"63fce80f7b20074e9fa2fb7119cd848cd5bc6803","unresolved":false,"context_lines":[{"line_number":3317,"context_line":"        obj \u003d config.LibvirtConfigNodeDevicePciCap()"},{"line_number":3318,"context_line":"        obj.parse_str(xmlin)"},{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"        self.assertEqual(0, obj.domain)"},{"line_number":3321,"context_line":"        self.assertEqual(130, obj.bus)"},{"line_number":3322,"context_line":"        self.assertEqual(0, obj.slot)"},{"line_number":3323,"context_line":"        self.assertEqual(1, obj.function)"},{"line_number":3324,"context_line":"        self.assertEqual(\"MT42822 BlueField-2\", obj.product)"},{"line_number":3325,"context_line":"        self.assertEqual(0xA2D6, obj.product_id)"},{"line_number":3326,"context_line":"        self.assertEqual(\"Mellanox Technologies\", obj.vendor)"},{"line_number":3327,"context_line":"        self.assertEqual(0x15B3, obj.vendor_id)"},{"line_number":3328,"context_line":"        self.assertEqual(obj.numa_node, 1)"},{"line_number":3329,"context_line":"        self.assertIsInstance(obj.vpd_capability,"},{"line_number":3330,"context_line":"                              config.LibvirtConfigNodeDeviceVpdCap)"},{"line_number":3331,"context_line":"        self.assertEqual(obj.vpd_capability.card_name, \u0027BlueField-2 DPU 25GbE\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"af0552af_cdc4f95c","line":3328,"range":{"start_line":3320,"start_character":0,"end_line":3328,"end_character":42},"in_reply_to":"564f3a26_0a508c93","updated":"2021-11-19 16:40:57.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"497a0925_b8a70350","line":3277,"updated":"2022-01-11 11:08:54.000000000","message":"can we use this from libvirt_data.py directly?","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c70f0a1dade97a24ab456583ac3c885c35dff919","unresolved":true,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"7eec2e26_4235ba68","line":3277,"in_reply_to":"497a0925_b8a70350","updated":"2022-01-11 14:14:31.000000000","message":"i asked the same question in PS7 tl;dr\n\n\u003e Actually, in libvirt_data it\u0027s a full device XML whereas here it\u0027s just the VPD capability.\n\u003e \n\u003e So I think it\u0027s better to keep those 2 separate rather than trying to reuse a portion.\n\nthat was also my first inclination but i was ok with keping them seperate based on ^","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dfacc34eda356146407560303f802165be25578a","unresolved":false,"context_lines":[{"line_number":3274,"context_line":"            \u0027type\u0027: \u0027nvidia-11\u0027}], obj.mdev_capability[0].mdev_types)"},{"line_number":3275,"context_line":""},{"line_number":3276,"context_line":"    def test_config_device_pci_vpd(self):"},{"line_number":3277,"context_line":"        xmlin \u003d \"\"\""},{"line_number":3278,"context_line":"    \u003ccapability type\u003d\u0027pci\u0027\u003e"},{"line_number":3279,"context_line":"      \u003cclass\u003e0x020000\u003c/class\u003e"},{"line_number":3280,"context_line":"      \u003cdomain\u003e0\u003c/domain\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"1428fd99_7e06926e","line":3277,"in_reply_to":"7eec2e26_4235ba68","updated":"2022-01-12 09:11:31.000000000","message":"OK. Then it is good as is.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"}],"nova/virt/libvirt/config.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f23d8b2c43e998a91a2cb7c163066b23b6da70f2","unresolved":true,"context_lines":[{"line_number":3297,"context_line":"class LibvirtConfigNodeDeviceVpdCap(LibvirtConfigObject):"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"    def __init__(self, **kwargs):"},{"line_number":3300,"context_line":"        super(LibvirtConfigNodeDeviceVpdCap, self).__init__("},{"line_number":3301,"context_line":"                                        root_name\u003d\"capability\", **kwargs)"},{"line_number":3302,"context_line":"        self._card_name \u003d None"},{"line_number":3303,"context_line":"        self._change_level \u003d None"},{"line_number":3304,"context_line":"        self._manufacture_id \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"afde97fd_3252927c","line":3301,"range":{"start_line":3300,"start_character":7,"end_line":3301,"end_character":73},"updated":"2021-11-19 13:06:59.000000000","message":"nit: we shoudl really fix the indentaion in the entire file at some point but can you make this\n        super().__init__(root_name\u003d\"capability\", **kwargs)\n\nwe can use the python3 only way of calling super now and that shoudl avoid the need to wrap lines i think\nif you do need to use a second line then the haning indent form is prefered\n        super().__init__(\n            root_name\u003d\"capability\", **kwargs)\nor \n        super().__init__(\n            root_name\u003d\"capability\", **kwargs\n        )\nwhere you indent the following line by 4 spaces and move all argument to the new line","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"50235de70b1b1fb7e0d04b14cdd2ad5a1253a048","unresolved":true,"context_lines":[{"line_number":3297,"context_line":"class LibvirtConfigNodeDeviceVpdCap(LibvirtConfigObject):"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"    def __init__(self, **kwargs):"},{"line_number":3300,"context_line":"        super(LibvirtConfigNodeDeviceVpdCap, self).__init__("},{"line_number":3301,"context_line":"                                        root_name\u003d\"capability\", **kwargs)"},{"line_number":3302,"context_line":"        self._card_name \u003d None"},{"line_number":3303,"context_line":"        self._change_level \u003d None"},{"line_number":3304,"context_line":"        self._manufacture_id \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"fb3acb74_8e7ec9fa","line":3301,"range":{"start_line":3300,"start_character":7,"end_line":3301,"end_character":73},"in_reply_to":"8a9e02d3_5a12645f","updated":"2021-11-19 14:34:09.000000000","message":"we had to keep python 2.7 support untill ussuri so in the last 3 release we just have not ported the existing uasage becasue it messes up git blame.\n\nwe might do a mass migration some day but for now we just avoid using the old patteren for new things an change exsitng usage when it makes sense to do so as part of new patches that are refarctoing the code.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"d8e33381795f6c11da1ab4e91ffc8db2f821e90d","unresolved":true,"context_lines":[{"line_number":3297,"context_line":"class LibvirtConfigNodeDeviceVpdCap(LibvirtConfigObject):"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"    def __init__(self, **kwargs):"},{"line_number":3300,"context_line":"        super(LibvirtConfigNodeDeviceVpdCap, self).__init__("},{"line_number":3301,"context_line":"                                        root_name\u003d\"capability\", **kwargs)"},{"line_number":3302,"context_line":"        self._card_name \u003d None"},{"line_number":3303,"context_line":"        self._change_level \u003d None"},{"line_number":3304,"context_line":"        self._manufacture_id \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"8a9e02d3_5a12645f","line":3301,"range":{"start_line":3300,"start_character":7,"end_line":3301,"end_character":73},"in_reply_to":"afde97fd_3252927c","updated":"2021-11-19 13:49:05.000000000","message":"Agreed, I\u0027ll use the new form. Wasn\u0027t sure if the old form was intentional or not so I just did it coherently with other cases but the current python version requirements should allow us to use it safely now.","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":3297,"context_line":"class LibvirtConfigNodeDeviceVpdCap(LibvirtConfigObject):"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"    def __init__(self, **kwargs):"},{"line_number":3300,"context_line":"        super(LibvirtConfigNodeDeviceVpdCap, self).__init__("},{"line_number":3301,"context_line":"                                        root_name\u003d\"capability\", **kwargs)"},{"line_number":3302,"context_line":"        self._card_name \u003d None"},{"line_number":3303,"context_line":"        self._change_level \u003d None"},{"line_number":3304,"context_line":"        self._manufacture_id \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"cc0de5ae_0af16c1c","line":3301,"range":{"start_line":3300,"start_character":7,"end_line":3301,"end_character":73},"in_reply_to":"fb3acb74_8e7ec9fa","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"982400b30f935c03871815ab0572a45ce276df9e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":false,"context_lines":[{"line_number":3130,"context_line":"        self.pci_capability \u003d None"},{"line_number":3131,"context_line":"        self.mdev_information \u003d None"},{"line_number":3132,"context_line":"        self.vdpa_capability \u003d None"},{"line_number":3133,"context_line":"        self.vpd_capability \u003d None"},{"line_number":3134,"context_line":""},{"line_number":3135,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":3136,"context_line":"        super(LibvirtConfigNodeDevice, self).parse_dom(xmldoc)"}],"source_content_type":"text/x-python","patch_set":11,"id":"05e0fd3d_f58a5ff7","line":3133,"updated":"2022-01-11 11:08:54.000000000","message":"vdpa - vpd /o\\ I will mix them a lot :/","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":3130,"context_line":"        self.pci_capability \u003d None"},{"line_number":3131,"context_line":"        self.mdev_information \u003d None"},{"line_number":3132,"context_line":"        self.vdpa_capability \u003d None"},{"line_number":3133,"context_line":"        self.vpd_capability \u003d None"},{"line_number":3134,"context_line":""},{"line_number":3135,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":3136,"context_line":"        super(LibvirtConfigNodeDevice, self).parse_dom(xmldoc)"}],"source_content_type":"text/x-python","patch_set":11,"id":"e9f39338_ad561ae0","line":3133,"in_reply_to":"05e0fd3d_f58a5ff7","updated":"2022-01-13 11:58:21.000000000","message":"Yep.\n\nInterestingly, mirroring \"pd\" either vertically or horizontally results in \"bq\".","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d23dcbecb3b732ee0744cdddf469d145a846a21c","unresolved":true,"context_lines":[{"line_number":3353,"context_line":"                        continue"},{"line_number":3354,"context_line":""},{"line_number":3355,"context_line":"    @property"},{"line_number":3356,"context_line":"    def card_name(self):"},{"line_number":3357,"context_line":"        return self._card_name"},{"line_number":3358,"context_line":""},{"line_number":3359,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":13,"id":"7c8ef31f_50d2e576","line":3356,"updated":"2022-01-24 10:55:23.000000000","message":"nit technically these propertites are not needed\nits nice that it makes the feild read only but you could have just used the fields directly","commit_id":"c2929f74dd2800a1d3c870aff796421908753b7e"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"dbc2a9e115ab522b56b3611ef1ebe0e2bec999da","unresolved":true,"context_lines":[{"line_number":3353,"context_line":"                        continue"},{"line_number":3354,"context_line":""},{"line_number":3355,"context_line":"    @property"},{"line_number":3356,"context_line":"    def card_name(self):"},{"line_number":3357,"context_line":"        return self._card_name"},{"line_number":3358,"context_line":""},{"line_number":3359,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":13,"id":"e86d80fe_72eddb9b","line":3356,"in_reply_to":"7c8ef31f_50d2e576","updated":"2022-01-24 18:08:38.000000000","message":"Ack, I don\u0027t mind changing this but would prefer to leave it as-is to avoid a respin.","commit_id":"c2929f74dd2800a1d3c870aff796421908753b7e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f47d6a7c550bf7106d78535e4cc15f0f11de0955","unresolved":false,"context_lines":[{"line_number":3353,"context_line":"                        continue"},{"line_number":3354,"context_line":""},{"line_number":3355,"context_line":"    @property"},{"line_number":3356,"context_line":"    def card_name(self):"},{"line_number":3357,"context_line":"        return self._card_name"},{"line_number":3358,"context_line":""},{"line_number":3359,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":13,"id":"f71164a1_51937727","line":3356,"in_reply_to":"e86d80fe_72eddb9b","updated":"2022-02-04 16:26:54.000000000","message":"Done","commit_id":"c2929f74dd2800a1d3c870aff796421908753b7e"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":7737,"context_line":"        vdpa_devs \u003d ["},{"line_number":7738,"context_line":"            dev for dev in devices.values() if \"vdpa\" in dev.listCaps()"},{"line_number":7739,"context_line":"        ]"},{"line_number":7740,"context_line":"        pci_devs \u003d {name: dev for name, dev in devices.items()"},{"line_number":7741,"context_line":"                    if \"pci\" in dev.listCaps()}"},{"line_number":7742,"context_line":"        pci_info \u003d ["},{"line_number":7743,"context_line":"            self._host._get_pcidev_info(name, dev, net_devs,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ad4ed194_9727f856","line":7740,"range":{"start_line":7740,"start_character":19,"end_line":7740,"end_character":21},"updated":"2022-01-11 11:08:54.000000000","message":"nit: I would wrap the line after {","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":7737,"context_line":"        vdpa_devs \u003d ["},{"line_number":7738,"context_line":"            dev for dev in devices.values() if \"vdpa\" in dev.listCaps()"},{"line_number":7739,"context_line":"        ]"},{"line_number":7740,"context_line":"        pci_devs \u003d {name: dev for name, dev in devices.items()"},{"line_number":7741,"context_line":"                    if \"pci\" in dev.listCaps()}"},{"line_number":7742,"context_line":"        pci_info \u003d ["},{"line_number":7743,"context_line":"            self._host._get_pcidev_info(name, dev, net_devs,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff70197f_6bb8835a","line":7740,"range":{"start_line":7740,"start_character":19,"end_line":7740,"end_character":21},"in_reply_to":"ad4ed194_9727f856","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":7740,"context_line":"        pci_devs \u003d {name: dev for name, dev in devices.items()"},{"line_number":7741,"context_line":"                    if \"pci\" in dev.listCaps()}"},{"line_number":7742,"context_line":"        pci_info \u003d ["},{"line_number":7743,"context_line":"            self._host._get_pcidev_info(name, dev, net_devs,"},{"line_number":7744,"context_line":"                                        vdpa_devs, list(pci_devs.values()))"},{"line_number":7745,"context_line":"            for name, dev in pci_devs.items()"},{"line_number":7746,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":11,"id":"c1ef74af_093ddb05","line":7743,"range":{"start_line":7743,"start_character":39,"end_line":7743,"end_character":41},"updated":"2022-01-11 11:08:54.000000000","message":"nit: I would wrap after (","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":7740,"context_line":"        pci_devs \u003d {name: dev for name, dev in devices.items()"},{"line_number":7741,"context_line":"                    if \"pci\" in dev.listCaps()}"},{"line_number":7742,"context_line":"        pci_info \u003d ["},{"line_number":7743,"context_line":"            self._host._get_pcidev_info(name, dev, net_devs,"},{"line_number":7744,"context_line":"                                        vdpa_devs, list(pci_devs.values()))"},{"line_number":7745,"context_line":"            for name, dev in pci_devs.items()"},{"line_number":7746,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":11,"id":"f5442f6e_89619937","line":7743,"range":{"start_line":7743,"start_character":39,"end_line":7743,"end_character":41},"in_reply_to":"c1ef74af_093ddb05","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"}],"nova/virt/libvirt/host.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":1238,"context_line":"        \"\"\"Returns PCI VPD info of a parent device of a PCI VF."},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":"        :param vf_device: a VF device object to use for lookup."},{"line_number":1241,"context_line":"        :type vf_device: :class:`libvirt.virNodeDevice`"},{"line_number":1242,"context_line":"        :param str parent_pf_name: parent PF name formatted as pci_dddd_bb_ss_f"},{"line_number":1243,"context_line":"        :param candidate_devs: devices that could be parent devs for the VF."},{"line_number":1244,"context_line":"        :type candidate_devs: List[:class:`libvirt.virNodeDevice`]"}],"source_content_type":"text/x-python","patch_set":11,"id":"a13088db_014831e4","line":1241,"updated":"2022-01-11 11:08:54.000000000","message":"this is probably superfluous (here and below) as you added type annotations","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"        \"\"\"Returns PCI VPD info of a parent device of a PCI VF."},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":"        :param vf_device: a VF device object to use for lookup."},{"line_number":1241,"context_line":"        :type vf_device: :class:`libvirt.virNodeDevice`"},{"line_number":1242,"context_line":"        :param str parent_pf_name: parent PF name formatted as pci_dddd_bb_ss_f"},{"line_number":1243,"context_line":"        :param candidate_devs: devices that could be parent devs for the VF."},{"line_number":1244,"context_line":"        :type candidate_devs: List[:class:`libvirt.virNodeDevice`]"}],"source_content_type":"text/x-python","patch_set":11,"id":"c5c6c5ed_5f42155e","line":1241,"in_reply_to":"a13088db_014831e4","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":1245,"context_line":"        :returns: A VPD capability object of a parent device."},{"line_number":1246,"context_line":"        :rtype: virt.libvirt.config.LibvirtConfigNodeDeviceVpdCap or None"},{"line_number":1247,"context_line":"        \"\"\""},{"line_number":1248,"context_line":"        parent_dev \u003d next((dev for dev in candidate_devs"},{"line_number":1249,"context_line":"                           if dev.name() \u003d\u003d parent_pf_name), None)"},{"line_number":1250,"context_line":"        if parent_dev is None:"},{"line_number":1251,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":11,"id":"91dd7d18_292d86e0","line":1248,"range":{"start_line":1248,"start_character":25,"end_line":1248,"end_character":27},"updated":"2022-01-11 11:08:54.000000000","message":"nit: I probably wrap the line between the two (","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"        :returns: A VPD capability object of a parent device."},{"line_number":1246,"context_line":"        :rtype: virt.libvirt.config.LibvirtConfigNodeDeviceVpdCap or None"},{"line_number":1247,"context_line":"        \"\"\""},{"line_number":1248,"context_line":"        parent_dev \u003d next((dev for dev in candidate_devs"},{"line_number":1249,"context_line":"                           if dev.name() \u003d\u003d parent_pf_name), None)"},{"line_number":1250,"context_line":"        if parent_dev is None:"},{"line_number":1251,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":11,"id":"643c0bb4_62dd086a","line":1248,"range":{"start_line":1248,"start_character":25,"end_line":1248,"end_character":27},"in_reply_to":"91dd7d18_292d86e0","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":false,"context_lines":[{"line_number":1357,"context_line":""},{"line_number":1358,"context_line":"            return caps"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        def _get_vpd_details("},{"line_number":1361,"context_line":"            device_dict: dict,"},{"line_number":1362,"context_line":"            device: \u0027libvirt.virNodeDevice\u0027,"},{"line_number":1363,"context_line":"            pci_devs: ty.List[\u0027libvirt.virNodeDevice\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"d6a7aeb8_88658674","line":1360,"updated":"2022-01-11 11:08:54.000000000","message":"I never liked this embed-a-big-function-into-another style, but I see that it was done about too. So I make a peace with it :)","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1357,"context_line":""},{"line_number":1358,"context_line":"            return caps"},{"line_number":1359,"context_line":""},{"line_number":1360,"context_line":"        def _get_vpd_details("},{"line_number":1361,"context_line":"            device_dict: dict,"},{"line_number":1362,"context_line":"            device: \u0027libvirt.virNodeDevice\u0027,"},{"line_number":1363,"context_line":"            pci_devs: ty.List[\u0027libvirt.virNodeDevice\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"927f9a3a_43d565ee","line":1360,"in_reply_to":"d6a7aeb8_88658674","updated":"2022-01-13 11:58:21.000000000","message":"Yes, took me some time to realize there\u0027s a lot of embedding here the first time I read through this chunk of code.\n\nIt definitely looks like a candidate for future refactoring.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":1379,"context_line":"            # use-case. However, the set of fields may be extended."},{"line_number":1380,"context_line":"            card_serial_number \u003d self._get_vpd_card_serial_number(device)"},{"line_number":1381,"context_line":""},{"line_number":1382,"context_line":"            if not card_serial_number and \\"},{"line_number":1383,"context_line":"               device_dict.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":1384,"context_line":"                # Format the address of a physical function to use underscores"},{"line_number":1385,"context_line":"                # since that\u0027s how Libvirt formats the \u003cname\u003e element content."}],"source_content_type":"text/x-python","patch_set":11,"id":"b8571b12_cef27ee8","line":1382,"range":{"start_line":1382,"start_character":42,"end_line":1382,"end_character":43},"updated":"2022-01-11 11:08:54.000000000","message":"I suggest to use () instead of backslash as the current style make it hard to distinguish visually where the condition of the if ends and the core of the if branch starts \n\n\n            if (\n                not card_serial_number and\n                device_dict.get(\u0027dev_type\u0027)\n                    \u003d\u003d fields.PciDeviceType.SRIOV_VF\n            ):","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"            # use-case. However, the set of fields may be extended."},{"line_number":1380,"context_line":"            card_serial_number \u003d self._get_vpd_card_serial_number(device)"},{"line_number":1381,"context_line":""},{"line_number":1382,"context_line":"            if not card_serial_number and \\"},{"line_number":1383,"context_line":"               device_dict.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":1384,"context_line":"                # Format the address of a physical function to use underscores"},{"line_number":1385,"context_line":"                # since that\u0027s how Libvirt formats the \u003cname\u003e element content."}],"source_content_type":"text/x-python","patch_set":11,"id":"dfd317d5_e7851d10","line":1382,"range":{"start_line":1382,"start_character":42,"end_line":1382,"end_character":43},"in_reply_to":"b8571b12_cef27ee8","updated":"2022-01-13 11:58:21.000000000","message":"Ack, agreed.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":1383,"context_line":"               device_dict.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":1384,"context_line":"                # Format the address of a physical function to use underscores"},{"line_number":1385,"context_line":"                # since that\u0027s how Libvirt formats the \u003cname\u003e element content."},{"line_number":1386,"context_line":"                pf_addr \u003d device_dict.get(\u0027parent_addr\u0027, None)"},{"line_number":1387,"context_line":"                if not pf_addr:"},{"line_number":1388,"context_line":"                    LOG.warning(\"A VF device dict does not have a parent PF \""},{"line_number":1389,"context_line":"                                \"address in it which is unexpected. Skipping \""}],"source_content_type":"text/x-python","patch_set":11,"id":"25167d98_348f7468","line":1386,"range":{"start_line":1386,"start_character":55,"end_line":1386,"end_character":61},"updated":"2022-01-11 11:08:54.000000000","message":"This is the default behavior of dict get() already so the code does not have to state it","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1383,"context_line":"               device_dict.get(\u0027dev_type\u0027) \u003d\u003d fields.PciDeviceType.SRIOV_VF:"},{"line_number":1384,"context_line":"                # Format the address of a physical function to use underscores"},{"line_number":1385,"context_line":"                # since that\u0027s how Libvirt formats the \u003cname\u003e element content."},{"line_number":1386,"context_line":"                pf_addr \u003d device_dict.get(\u0027parent_addr\u0027, None)"},{"line_number":1387,"context_line":"                if not pf_addr:"},{"line_number":1388,"context_line":"                    LOG.warning(\"A VF device dict does not have a parent PF \""},{"line_number":1389,"context_line":"                                \"address in it which is unexpected. Skipping \""}],"source_content_type":"text/x-python","patch_set":11,"id":"26be4d9f_abd5d193","line":1386,"range":{"start_line":1386,"start_character":55,"end_line":1386,"end_character":61},"in_reply_to":"25167d98_348f7468","updated":"2022-01-13 11:58:21.000000000","message":"Ack, agreed.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"837141ad53b7ba2a0a021752fec67d44a3a27669","unresolved":true,"context_lines":[{"line_number":1385,"context_line":"                # since that\u0027s how Libvirt formats the \u003cname\u003e element content."},{"line_number":1386,"context_line":"                pf_addr \u003d device_dict.get(\u0027parent_addr\u0027, None)"},{"line_number":1387,"context_line":"                if not pf_addr:"},{"line_number":1388,"context_line":"                    LOG.warning(\"A VF device dict does not have a parent PF \""},{"line_number":1389,"context_line":"                                \"address in it which is unexpected. Skipping \""},{"line_number":1390,"context_line":"                                \"serial number retrieval\")"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"                formatted_addr \u003d pf_addr.replace(\u0027.\u0027, \u0027_\u0027).replace(\u0027:\u0027, \u0027_\u0027)"},{"line_number":1393,"context_line":"                vpd_cap \u003d self._get_vf_parent_pci_vpd_info("}],"source_content_type":"text/x-python","patch_set":11,"id":"23627e4e_a5c08294","line":1390,"range":{"start_line":1388,"start_character":0,"end_line":1390,"end_character":58},"updated":"2022-01-11 11:08:54.000000000","message":"Good point. I think I saw a bug report in the past stated there are such devices.\n\nHowever this code is not skipping the serial number retrial. Instead it will call replace() on None below, that will blow.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":1385,"context_line":"                # since that\u0027s how Libvirt formats the \u003cname\u003e element content."},{"line_number":1386,"context_line":"                pf_addr \u003d device_dict.get(\u0027parent_addr\u0027, None)"},{"line_number":1387,"context_line":"                if not pf_addr:"},{"line_number":1388,"context_line":"                    LOG.warning(\"A VF device dict does not have a parent PF \""},{"line_number":1389,"context_line":"                                \"address in it which is unexpected. Skipping \""},{"line_number":1390,"context_line":"                                \"serial number retrieval\")"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"                formatted_addr \u003d pf_addr.replace(\u0027.\u0027, \u0027_\u0027).replace(\u0027:\u0027, \u0027_\u0027)"},{"line_number":1393,"context_line":"                vpd_cap \u003d self._get_vf_parent_pci_vpd_info("}],"source_content_type":"text/x-python","patch_set":11,"id":"a601769b_b2cdb86a","line":1390,"range":{"start_line":1388,"start_character":0,"end_line":1390,"end_character":58},"in_reply_to":"23627e4e_a5c08294","updated":"2022-01-13 11:58:21.000000000","message":"Good catch, looks like I forgot the return statement here, however, I think maybe we should not handle this case altogether.\n\nThe bug you are referring to is probably https://bugs.launchpad.net/nova/+bug/1915255 which is about VFs with PFs that are not netdevs.\n\nLooking at the code again, I can see that Nova currently classifies devices as having `dev_type \u003d\u003d SRIOV_VF` only if they have the \u0027phys_function\u0027 capability AND if there is a parent PF address present:\n\nhttps://github.com/openstack/nova/blob/a6ef502/nova/virt/libvirt/host.py#L1261-L1264\n\u003e                if (\n\u003e                    fun_cap.type \u003d\u003d \u0027phys_function\u0027 and\n\u003e                    len(fun_cap.device_addrs) !\u003d 0\n\u003e                ):\n\u003e                    phys_address \u003d \"%04x:%02x:%02x.%01x\" % (\n\u003e                        fun_cap.device_addrs[0][0],\n\u003e                        fun_cap.device_addrs[0][1],\n\u003e                        fun_cap.device_addrs[0][2],\n\u003e                        fun_cap.device_addrs[0][3])\n\u003e                    result \u003d {\n\u003e                        \u0027dev_type\u0027: fields.PciDeviceType.SRIOV_VF,\n\u003e                        \u0027parent_addr\u0027: phys_address,\n\u003e                    }\n\nOtherwise the device will end up being a \"type-PCI\" one and the code path in question will not be hit.\n\nSo we always know that if a device type is VF then there is always a parent_addr populated based on the address data provided in the phys_function capability.\n\nAs a side note, it\u0027s easy to confuse the parent PCIe address in Libvirt XML which is not the same as the parent PF PCIe address.\n\nI will leave the check for now but since there is no way to generate a device XML that would trigger it, I am open to removing it completely.\n\n\nThanks!","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f18d1f6416400ca305bc188d5ce228c4088528c","unresolved":true,"context_lines":[{"line_number":1244,"context_line":"        \"\"\""},{"line_number":1245,"context_line":"        parent_dev \u003d next("},{"line_number":1246,"context_line":"            (dev for dev in candidate_devs"},{"line_number":1247,"context_line":"                           if dev.name() \u003d\u003d parent_pf_name), None)"},{"line_number":1248,"context_line":"        if parent_dev is None:"},{"line_number":1249,"context_line":"            return None"},{"line_number":1250,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7f3c1539_37b88f9a","line":1247,"range":{"start_line":1247,"start_character":17,"end_line":1247,"end_character":27},"updated":"2022-02-01 13:15:50.000000000","message":"nit: I would align the \u0027if\u0027 with the \u0027for\u0027. \n\n        parent_dev \u003d next(\n            (dev for dev in candidate_devs\n                 if dev.name() \u003d\u003d parent_pf_name), None)\n\nbut I guess black would do\n\n        parent_dev \u003d next(\n            (dev for dev in candidate_devs if dev.name() \u003d\u003d parent_pf_name),\n            None,\n        )\n\nwhich also look pretty nice","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"a9297aab7c60030ff5132ef1fa51d49651ce0679","unresolved":true,"context_lines":[{"line_number":1244,"context_line":"        \"\"\""},{"line_number":1245,"context_line":"        parent_dev \u003d next("},{"line_number":1246,"context_line":"            (dev for dev in candidate_devs"},{"line_number":1247,"context_line":"                           if dev.name() \u003d\u003d parent_pf_name), None)"},{"line_number":1248,"context_line":"        if parent_dev is None:"},{"line_number":1249,"context_line":"            return None"},{"line_number":1250,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"cbfe9f7e_1a948417","line":1247,"range":{"start_line":1247,"start_character":17,"end_line":1247,"end_character":27},"in_reply_to":"7f3c1539_37b88f9a","updated":"2022-02-01 14:09:15.000000000","message":"Ack, makes sense.","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"45f04a3a02ec6fdd7f7c2bb1f115b88bce2a61c7","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"        \"\"\""},{"line_number":1245,"context_line":"        parent_dev \u003d next("},{"line_number":1246,"context_line":"            (dev for dev in candidate_devs"},{"line_number":1247,"context_line":"                           if dev.name() \u003d\u003d parent_pf_name), None)"},{"line_number":1248,"context_line":"        if parent_dev is None:"},{"line_number":1249,"context_line":"            return None"},{"line_number":1250,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ff1c7bcf_b5b91902","line":1247,"range":{"start_line":1247,"start_character":17,"end_line":1247,"end_character":27},"in_reply_to":"cbfe9f7e_1a948417","updated":"2022-02-03 13:20:46.000000000","message":"Done","commit_id":"6c6cacc8df5f66c25f25fdc877a948dc9c47a485"}],"releasenotes/notes/pci-vpd-capability-0d8039629db4afb8.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ec0eedd257a2fab24401e06909ef1221ba55cb38","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    - https://libvirt.org/news.html#v7-9-0-2021-11-01"},{"line_number":19,"context_line":"    - https://libvirt.org/drvnodedev.html#VPDCap"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":11,"id":"df207ee0_8401afef","line":20,"updated":"2021-12-17 11:38:34.000000000","message":"+1 thanks for adding this release note\nok so libvirt 7.9.0 is the minimum good to know.","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"},{"author":{"_account_id":24824,"name":"Dmitrii Shcherbakov","username":"dmitriis"},"change_message_id":"8ad9dea333889a743cadf64b7b523a5168d709de","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    - https://libvirt.org/news.html#v7-9-0-2021-11-01"},{"line_number":19,"context_line":"    - https://libvirt.org/drvnodedev.html#VPDCap"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":11,"id":"3111f9e7_35d88660","line":20,"in_reply_to":"df207ee0_8401afef","updated":"2022-01-13 11:58:21.000000000","message":"Ack","commit_id":"624202aee051cfd3232e12ab994779144b0f5c44"}]}
