)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3b728f19f9e2303e27e75ab0f0162dbbd2efa689","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7118527c_ee1aba9a","updated":"2023-05-15 11:26:11.000000000","message":"Thank you Iury.","commit_id":"c1b01d03a53e6790dabd144724c06b622a39c5b4"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"5f9617100e0193e147fa98bf6f7a1aad5471425e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d3701cdd_a48d6036","updated":"2023-05-15 08:44:28.000000000","message":"Thank you for submitting the patch, Iury.","commit_id":"c1b01d03a53e6790dabd144724c06b622a39c5b4"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"58c4a42dfdd087468cd2376f67d6a4e67a983afe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"aed70da6_e682207c","updated":"2023-05-15 07:39:14.000000000","message":"recheck","commit_id":"c1b01d03a53e6790dabd144724c06b622a39c5b4"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"4173e7532d67f4f099f0038d5cbcffb51b6069da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"b3ccad24_5d54968e","updated":"2023-05-31 20:59:26.000000000","message":"recheck test_port_changed_client_id_fail","commit_id":"0e0bf9a4567f7a911ec890cc3a174a5d53c8186f"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"9eda94158d71536176cc8814794f7070c5debc1f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a44db06a_b281def0","updated":"2023-06-06 16:34:00.000000000","message":"recheck openstack-tox-py39 was green previously but reached TIMED_OUT","commit_id":"f97007efed75a27d38d03d3f74ba6e5db4e78238"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"b096db8a122b63c9db19355add4079039d0166fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"b2302ec8_9fd27a99","updated":"2023-06-06 12:22:40.000000000","message":"recheck py310 TIMED_OUT","commit_id":"f97007efed75a27d38d03d3f74ba6e5db4e78238"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"448fc1fa355b5f4216404687b367ef87a4ecc630","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"302be80d_d2fcb81a","updated":"2023-06-19 19:15:20.000000000","message":"Thanks for the review Riccardo","commit_id":"1d97f2a37d8a47e03891664dc179efcc8a1618e9"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"e1a098f6e6ac10af13cbb3eee9b5d486832b134b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"609acd9a_81c27922","updated":"2023-06-20 12:54:35.000000000","message":"lgtm\nspotted a couple of nits, can be fixed in a follow up","commit_id":"94213d470ea547c22b0cc8f0d77fca737d9c5398"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"b0090a1b7d9cbff5ff3cdcadfc59e7d1891b90b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"30b24f94_09d740f7","updated":"2023-06-21 14:54:15.000000000","message":"recheck grenade failed, but grenade-skip-level is green...","commit_id":"2d22b6a089467f07f341c73c2d48fa3a39c0afba"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"dab8289ef984dbb630fed9b13f47c41d79af792b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"2e5774ee_d582478a","updated":"2023-06-20 16:02:55.000000000","message":"recheck metal3-integration POST_FAILURE","commit_id":"2d22b6a089467f07f341c73c2d48fa3a39c0afba"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"fc8a8e8d1ff20b0dd0ec08d78a76f180d8a79f86","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"62262dc1_b7f9f26d","updated":"2023-06-21 12:34:41.000000000","message":"recheck metal3-integration should be green","commit_id":"2d22b6a089467f07f341c73c2d48fa3a39c0afba"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"62231a41_35567aab","updated":"2023-06-22 14:11:59.000000000","message":"Looks good, but a bunch of minor issues. Please follow-up.","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"697034e798dd8b3b0f15e8365211006b5a7dc8c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"4fb0f7c0_52a64845","updated":"2023-06-22 16:14:03.000000000","message":"recheck  Timeout waiting for nodes e2381af9-4c52-4f7a-b212-e1e36a75e95c to reach target state \u0027available\u0027","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cccadaa5247b20472a98f0a50192650755a7901e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"767c1bb0_fbd488e1","updated":"2023-06-23 10:46:02.000000000","message":"recheck CI should be better now","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"5135fe068c513a895f7f33dee1055602c54bbbbd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"989ad71d_8a4ba176","updated":"2023-06-28 03:08:01.000000000","message":"recheck CI should be in a better shape after some patches we merged","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ced8db64f7abfe939ae4f2c557a4e96e90632c09","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e7cea564_2aab36e1","updated":"2023-06-23 15:10:11.000000000","message":"recheck Node 6fb3efea-9e0b-4b2b-aa4c-7e5aa563cd00 is locked by host np0034423544, please retry after the current operation is completed.","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"79b50f0fbfc67ce85e74b3325bad5ba64b4013dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"8a1ea13a_81e73d10","updated":"2023-06-22 19:38:41.000000000","message":"recheck ironic-tempest-wholedisk-bios-snmp-pxe https://zuul.opendev.org/t/openstack/build/428fb6d448a44f30a2332cffa9bbbffd : TIMED_OUT in 3h 11m","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"67fe39f5df3010d6c9388bb6f7ecc1bab64c6723","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"46b34156_19544de0","updated":"2023-06-22 22:04:16.000000000","message":"recheck weird failures in jobs install: cannot stat \u0027/opt/stack/devstack/files/non-existent-image.img\u0027: No such file or directory","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"800e786ec77329fd5e2a742f5ccb46e17357e61f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"9b1a4adb_0a7c40d8","updated":"2023-06-29 04:28:20.000000000","message":"recheck let\u0027s see if the issue reproduces again","commit_id":"dad6724292b57085a5234efba4441c754657e865"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"65ba3180a212f52c88355582ae6a7d60c1c19f94","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"99758261_997db813","updated":"2023-07-10 23:34:05.000000000","message":"recheck metal3 integration failed during inspection (there is a know bug about this)","commit_id":"dad6724292b57085a5234efba4441c754657e865"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"b211fa5c8f7a34d465ef61fc55cfa3b072fd0825","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"a37e1417_9371bf86","updated":"2023-07-07 01:47:08.000000000","message":"recheck standalone failed \u003d( we will probably need to figure out something to make more stable","commit_id":"dad6724292b57085a5234efba4441c754657e865"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"de646e829d647f1a05d7acb0dada1e798618120e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"b95a69f8_18824435","updated":"2023-07-10 21:25:16.000000000","message":"recheck standalones jobs are back to focal","commit_id":"dad6724292b57085a5234efba4441c754657e865"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"6f39e63d11093b7e13b0cc9bb16aa082d5700d2d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3e421d19_e2e71236","updated":"2023-06-30 14:17:15.000000000","message":"recheck we merged a lof of CI fixes.","commit_id":"dad6724292b57085a5234efba4441c754657e865"}],"ironic/db/api.py":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"5f9617100e0193e147fa98bf6f7a1aad5471425e","unresolved":true,"context_lines":[{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"    @abc.abstractmethod"},{"line_number":1528,"context_line":"    def get_firmware_component(self, node_id, name):"},{"line_number":1529,"context_line":"        \"\"\"Retrieve Firmware Component."},{"line_number":1530,"context_line":""},{"line_number":1531,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":2,"id":"f29dd48c_9075184d","line":1528,"range":{"start_line":1528,"start_character":4,"end_line":1528,"end_character":52},"updated":"2023-05-15 08:44:28.000000000","message":"How will individual components be created? Will this be through update_firmware_component_list() function?","commit_id":"c1b01d03a53e6790dabd144724c06b622a39c5b4"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3b728f19f9e2303e27e75ab0f0162dbbd2efa689","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"    @abc.abstractmethod"},{"line_number":1528,"context_line":"    def get_firmware_component(self, node_id, name):"},{"line_number":1529,"context_line":"        \"\"\"Retrieve Firmware Component."},{"line_number":1530,"context_line":""},{"line_number":1531,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":2,"id":"2bd13a11_4a6ab72f","line":1528,"range":{"start_line":1528,"start_character":4,"end_line":1528,"end_character":52},"in_reply_to":"857eeff1_b22b8b7d","updated":"2023-05-15 11:26:11.000000000","message":"Done","commit_id":"c1b01d03a53e6790dabd144724c06b622a39c5b4"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"1a02e3e766db8690265e7a84c08db2cfa9980137","unresolved":true,"context_lines":[{"line_number":1525,"context_line":"        \"\"\""},{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"    @abc.abstractmethod"},{"line_number":1528,"context_line":"    def get_firmware_component(self, node_id, name):"},{"line_number":1529,"context_line":"        \"\"\"Retrieve Firmware Component."},{"line_number":1530,"context_line":""},{"line_number":1531,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":2,"id":"857eeff1_b22b8b7d","line":1528,"range":{"start_line":1528,"start_character":4,"end_line":1528,"end_character":52},"in_reply_to":"f29dd48c_9075184d","updated":"2023-05-15 11:14:42.000000000","message":"Hi Jacob, yes.\nThe function can receive the list of the components so it would just work.","commit_id":"c1b01d03a53e6790dabd144724c06b622a39c5b4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a528364cd53176f007e0b50f6a57de7212542237","unresolved":true,"context_lines":[{"line_number":1514,"context_line":"        \"\"\""},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @abc.abstractclassmethod"},{"line_number":1517,"context_line":"    def delete_firmware_component_list(self, node_id, names):"},{"line_number":1518,"context_line":"        \"\"\"Delete a list of Firmware Component"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":4,"id":"7f1ae138_d12fd18f","line":1517,"updated":"2023-05-25 12:46:36.000000000","message":"I\u0027m not sure why you need this call. We don\u0027t have a delete operation for firmware components, do we?","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":1514,"context_line":"        \"\"\""},{"line_number":1515,"context_line":""},{"line_number":1516,"context_line":"    @abc.abstractclassmethod"},{"line_number":1517,"context_line":"    def delete_firmware_component_list(self, node_id, names):"},{"line_number":1518,"context_line":"        \"\"\"Delete a list of Firmware Component"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":4,"id":"df9e1cbb_54fa2c9c","line":1517,"in_reply_to":"7f1ae138_d12fd18f","updated":"2023-05-25 14:44:28.000000000","message":"removing based on the irc conversation.","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"5e70edfdc909753b7d166c90a8f9da667935e326","unresolved":true,"context_lines":[{"line_number":1537,"context_line":""},{"line_number":1538,"context_line":"    @abc.abstractclassmethod"},{"line_number":1539,"context_line":"    def get_firmware_component_list(self, node_id):"},{"line_number":1540,"context_line":"        \"\"\"TRetrieve Firmware Components of a given node."},{"line_number":1541,"context_line":""},{"line_number":1542,"context_line":"        :param node_id: The node id."},{"line_number":1543,"context_line":"        :returns: A list of FirmwareComponent objects."}],"source_content_type":"text/x-python","patch_set":4,"id":"97bffbeb_b140a343","line":1540,"range":{"start_line":1540,"start_character":11,"end_line":1540,"end_character":20},"updated":"2023-05-25 12:52:50.000000000","message":"nit: Retrieve","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":1537,"context_line":""},{"line_number":1538,"context_line":"    @abc.abstractclassmethod"},{"line_number":1539,"context_line":"    def get_firmware_component_list(self, node_id):"},{"line_number":1540,"context_line":"        \"\"\"TRetrieve Firmware Components of a given node."},{"line_number":1541,"context_line":""},{"line_number":1542,"context_line":"        :param node_id: The node id."},{"line_number":1543,"context_line":"        :returns: A list of FirmwareComponent objects."}],"source_content_type":"text/x-python","patch_set":4,"id":"db4b0d8d_f5ed21d4","line":1540,"range":{"start_line":1540,"start_character":11,"end_line":1540,"end_character":20},"in_reply_to":"97bffbeb_b140a343","updated":"2023-05-25 14:44:28.000000000","message":"Ack","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fbb5213c9435bf294a5ca8ac4895c409aee516b8","unresolved":true,"context_lines":[{"line_number":1446,"context_line":"        \"\"\""},{"line_number":1447,"context_line":""},{"line_number":1448,"context_line":"    @abc.abstractclassmethod"},{"line_number":1449,"context_line":"    def create_firmware_component(self, values):"},{"line_number":1450,"context_line":"        \"\"\"Create a FirmwareComponent record for a given node."},{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"        :param values: a dictionary with the necessary information to create"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aabb3bf_c76919c4","line":1449,"updated":"2023-06-05 13:13:47.000000000","message":"I\u0027m still somewhat puzzled how these functions will be used by the driver. Like this?\n\n try:\n     create_firmware_component(values)\n except FirmwareComponentAlreadyExists:\n     update_firmware_component(values[\u0027component\u0027], values)\n     \nSeems unnecessarily verbose to me. Or do you have another idea?\n\n(I understand we need a separate update for the update_firmware clean step, asking about creation)","commit_id":"cdb51038557afc61e88c89cee128d13f4d5aff16"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"671e2d4b156dc7004f770b65929bf282db0ac001","unresolved":false,"context_lines":[{"line_number":1446,"context_line":"        \"\"\""},{"line_number":1447,"context_line":""},{"line_number":1448,"context_line":"    @abc.abstractclassmethod"},{"line_number":1449,"context_line":"    def create_firmware_component(self, values):"},{"line_number":1450,"context_line":"        \"\"\"Create a FirmwareComponent record for a given node."},{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"        :param values: a dictionary with the necessary information to create"}],"source_content_type":"text/x-python","patch_set":9,"id":"564c48b0_d6c57ad9","line":1449,"in_reply_to":"3ee4836b_0786868a","updated":"2023-06-06 12:23:12.000000000","message":"Marking as done.","commit_id":"cdb51038557afc61e88c89cee128d13f4d5aff16"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"b09b5663f031b27b80a3c75ab2290438b78b9d94","unresolved":true,"context_lines":[{"line_number":1446,"context_line":"        \"\"\""},{"line_number":1447,"context_line":""},{"line_number":1448,"context_line":"    @abc.abstractclassmethod"},{"line_number":1449,"context_line":"    def create_firmware_component(self, values):"},{"line_number":1450,"context_line":"        \"\"\"Create a FirmwareComponent record for a given node."},{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"        :param values: a dictionary with the necessary information to create"}],"source_content_type":"text/x-python","patch_set":9,"id":"3ee4836b_0786868a","line":1449,"in_reply_to":"7aabb3bf_c76919c4","updated":"2023-06-05 14:00:12.000000000","message":"We can probably work with the same idea we have in BIOS,\n\n* The object has a method to identify what needs to be created /updated (like the sync_node_setting for BIOS)\n* The driver has method that would be called to store information (in BIOS we have cache_bios_settings), it would use the method from the object and handle the case calling FirmwareComponent.create/save\n\nwdyt?","commit_id":"cdb51038557afc61e88c89cee128d13f4d5aff16"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"bff01236cd35780cd496b8de97f8039881715d15","unresolved":true,"context_lines":[{"line_number":1121,"context_line":"        \"\"\""},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @abc.abstractmethod"},{"line_number":1124,"context_line":"    def delete_bios_setting_list(self, node_id, names):"},{"line_number":1125,"context_line":"        \"\"\"Delete a list of BIOS settings."},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":13,"id":"9ffb80ac_c7995adf","side":"PARENT","line":1124,"updated":"2023-06-19 14:51:36.000000000","message":"I probably lost this somewhere, but why was this removed?\nis it replaced by something else or not used anymore?","commit_id":"8ef69aaa6a3c3e449f870803ac0558fd02225234"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"a5595b01747b059cf3f0efa1d20893ce628314bf","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"        \"\"\""},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @abc.abstractmethod"},{"line_number":1124,"context_line":"    def delete_bios_setting_list(self, node_id, names):"},{"line_number":1125,"context_line":"        \"\"\"Delete a list of BIOS settings."},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":13,"id":"6c23579a_42ce2097","side":"PARENT","line":1124,"in_reply_to":"1327ac4f_e92f5271","updated":"2023-06-20 08:42:26.000000000","message":"that\u0027s for the firmware component, how\u0027s that related to the bios setting list?","commit_id":"8ef69aaa6a3c3e449f870803ac0558fd02225234"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"493977152c480d7219fc80ac91a3853ee6e6d968","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"        \"\"\""},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @abc.abstractmethod"},{"line_number":1124,"context_line":"    def delete_bios_setting_list(self, node_id, names):"},{"line_number":1125,"context_line":"        \"\"\"Delete a list of BIOS settings."},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":13,"id":"eff7595f_160f1342","side":"PARENT","line":1124,"in_reply_to":"6c23579a_42ce2097","updated":"2023-06-20 11:47:16.000000000","message":"oh right! my bad","commit_id":"8ef69aaa6a3c3e449f870803ac0558fd02225234"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"448fc1fa355b5f4216404687b367ef87a4ecc630","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"        \"\"\""},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @abc.abstractmethod"},{"line_number":1124,"context_line":"    def delete_bios_setting_list(self, node_id, names):"},{"line_number":1125,"context_line":"        \"\"\"Delete a list of BIOS settings."},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param node_id: The node id."}],"source_content_type":"text/x-python","patch_set":13,"id":"1327ac4f_e92f5271","side":"PARENT","line":1124,"in_reply_to":"9ffb80ac_c7995adf","updated":"2023-06-19 19:15:20.000000000","message":"Hey Riccardo, you probably missed in patch set #4 https://review.opendev.org/c/openstack/ironic/+/883062/4/ironic/db/api.py","commit_id":"8ef69aaa6a3c3e449f870803ac0558fd02225234"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"e1a098f6e6ac10af13cbb3eee9b5d486832b134b","unresolved":true,"context_lines":[{"line_number":1123,"context_line":"    @abc.abstractmethod"},{"line_number":1124,"context_line":"    def delete_bios_setting_list(self, node_id, names):"},{"line_number":1125,"context_line":"        \"\"\"Delete a list of BIOS settings."},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param node_id: The node id."},{"line_number":1128,"context_line":"        :param names: List of BIOS setting names to be deleted."},{"line_number":1129,"context_line":"        :raises: NodeNotFound if the node is not found."}],"source_content_type":"text/x-python","patch_set":14,"id":"946fcf7d_79af72ff","side":"PARENT","line":1126,"updated":"2023-06-20 12:54:35.000000000","message":"nit: unrelated change","commit_id":"6c05e99c8d55dcb33bbd6e07761e0e754ed50e8a"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"47d6becf262fd4382e827f8787dba6463b0aad14","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"    @abc.abstractmethod"},{"line_number":1124,"context_line":"    def delete_bios_setting_list(self, node_id, names):"},{"line_number":1125,"context_line":"        \"\"\"Delete a list of BIOS settings."},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param node_id: The node id."},{"line_number":1128,"context_line":"        :param names: List of BIOS setting names to be deleted."},{"line_number":1129,"context_line":"        :raises: NodeNotFound if the node is not found."}],"source_content_type":"text/x-python","patch_set":14,"id":"05b8d35b_53ab1b85","side":"PARENT","line":1126,"in_reply_to":"946fcf7d_79af72ff","updated":"2023-06-20 13:46:23.000000000","message":"Done","commit_id":"6c05e99c8d55dcb33bbd6e07761e0e754ed50e8a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"e1a098f6e6ac10af13cbb3eee9b5d486832b134b","unresolved":true,"context_lines":[{"line_number":1502,"context_line":"        :param name: name of Firmware component."},{"line_number":1503,"context_line":"        :returns: The FirmwareComponent object."},{"line_number":1504,"context_line":"        :raises: NodeNotFound if the node is not found."},{"line_number":1505,"context_line":"        :raises: FirmwareComponentNotFound if the BIOS setting is not found."},{"line_number":1506,"context_line":"        \"\"\""},{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"    @abc.abstractclassmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"19b6cfcb_e91867bd","line":1505,"range":{"start_line":1505,"start_character":50,"end_line":1505,"end_character":62},"updated":"2023-06-20 12:54:35.000000000","message":"Firmware Component?","commit_id":"94213d470ea547c22b0cc8f0d77fca737d9c5398"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"5e739b1781929027c28a37cf1ad54164ce0d3533","unresolved":true,"context_lines":[{"line_number":1502,"context_line":"        :param name: name of Firmware component."},{"line_number":1503,"context_line":"        :returns: The FirmwareComponent object."},{"line_number":1504,"context_line":"        :raises: NodeNotFound if the node is not found."},{"line_number":1505,"context_line":"        :raises: FirmwareComponentNotFound if the BIOS setting is not found."},{"line_number":1506,"context_line":"        \"\"\""},{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"    @abc.abstractclassmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"1f277379_d0e63c65","line":1505,"range":{"start_line":1505,"start_character":50,"end_line":1505,"end_character":62},"in_reply_to":"19b6cfcb_e91867bd","updated":"2023-06-20 12:58:30.000000000","message":"Right... ctrl+c/v my bad, if people are ok I can follow up in the FirmwareInterface patch.","commit_id":"94213d470ea547c22b0cc8f0d77fca737d9c5398"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"47d6becf262fd4382e827f8787dba6463b0aad14","unresolved":false,"context_lines":[{"line_number":1502,"context_line":"        :param name: name of Firmware component."},{"line_number":1503,"context_line":"        :returns: The FirmwareComponent object."},{"line_number":1504,"context_line":"        :raises: NodeNotFound if the node is not found."},{"line_number":1505,"context_line":"        :raises: FirmwareComponentNotFound if the BIOS setting is not found."},{"line_number":1506,"context_line":"        \"\"\""},{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"    @abc.abstractclassmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"e0beec05_974a4ac3","line":1505,"range":{"start_line":1505,"start_character":50,"end_line":1505,"end_character":62},"in_reply_to":"1f277379_d0e63c65","updated":"2023-06-20 13:46:23.000000000","message":"Done","commit_id":"94213d470ea547c22b0cc8f0d77fca737d9c5398"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"e1a098f6e6ac10af13cbb3eee9b5d486832b134b","unresolved":true,"context_lines":[{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"    @abc.abstractclassmethod"},{"line_number":1509,"context_line":"    def get_firmware_component_list(self, node_id):"},{"line_number":1510,"context_line":"        \"\"\"Retrieve Firmware Components of a given node."},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"        :param node_id: The node id."},{"line_number":1513,"context_line":"        :returns: A list of FirmwareComponent objects."}],"source_content_type":"text/x-python","patch_set":14,"id":"e904426c_2a27c0c1","line":1510,"updated":"2023-06-20 12:54:35.000000000","message":"maybe change to \"Retrieve a list of Firmware Components\" ?","commit_id":"94213d470ea547c22b0cc8f0d77fca737d9c5398"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"5e739b1781929027c28a37cf1ad54164ce0d3533","unresolved":false,"context_lines":[{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"    @abc.abstractclassmethod"},{"line_number":1509,"context_line":"    def get_firmware_component_list(self, node_id):"},{"line_number":1510,"context_line":"        \"\"\"Retrieve Firmware Components of a given node."},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"        :param node_id: The node id."},{"line_number":1513,"context_line":"        :returns: A list of FirmwareComponent objects."}],"source_content_type":"text/x-python","patch_set":14,"id":"5b65c124_279ee910","line":1510,"in_reply_to":"e904426c_2a27c0c1","updated":"2023-06-20 12:58:30.000000000","message":"Ack","commit_id":"94213d470ea547c22b0cc8f0d77fca737d9c5398"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":1462,"context_line":"        :param values: a dictionary with the necessary information to create"},{"line_number":1463,"context_line":"            a FirmwareComponent."},{"line_number":1464,"context_line":""},{"line_number":1465,"context_line":"                       ::"},{"line_number":1466,"context_line":""},{"line_number":1467,"context_line":"                        {"},{"line_number":1468,"context_line":"                            \u0027component\u0027: String,"}],"source_content_type":"text/x-python","patch_set":16,"id":"97e07c1b_65a9e48b","line":1465,"updated":"2023-06-22 14:11:59.000000000","message":"nit: I quite doubt this will render correctly: it has to be on the same level as \"a\" (I assume)","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cccadaa5247b20472a98f0a50192650755a7901e","unresolved":false,"context_lines":[{"line_number":1462,"context_line":"        :param values: a dictionary with the necessary information to create"},{"line_number":1463,"context_line":"            a FirmwareComponent."},{"line_number":1464,"context_line":""},{"line_number":1465,"context_line":"                       ::"},{"line_number":1466,"context_line":""},{"line_number":1467,"context_line":"                        {"},{"line_number":1468,"context_line":"                            \u0027component\u0027: String,"}],"source_content_type":"text/x-python","patch_set":16,"id":"955f2f6b_46960625","line":1465,"in_reply_to":"97e07c1b_65a9e48b","updated":"2023-06-23 10:46:02.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":1491,"context_line":"                            \u0027last_version_flashed\u0027: String"},{"line_number":1492,"context_line":"                        }"},{"line_number":1493,"context_line":"        :returns: A FirmwareComponent object."},{"line_number":1494,"context_line":"        :raises: FirmwareComponentNotFound the component"},{"line_number":1495,"context_line":"            is not found."},{"line_number":1496,"context_line":"        \"\"\""},{"line_number":1497,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"03b372c5_e6ab3117","line":1494,"updated":"2023-06-22 14:11:59.000000000","message":"nit: missing \"if\"","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cccadaa5247b20472a98f0a50192650755a7901e","unresolved":false,"context_lines":[{"line_number":1491,"context_line":"                            \u0027last_version_flashed\u0027: String"},{"line_number":1492,"context_line":"                        }"},{"line_number":1493,"context_line":"        :returns: A FirmwareComponent object."},{"line_number":1494,"context_line":"        :raises: FirmwareComponentNotFound the component"},{"line_number":1495,"context_line":"            is not found."},{"line_number":1496,"context_line":"        \"\"\""},{"line_number":1497,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5d603599_6c4ba7cf","line":1494,"in_reply_to":"03b372c5_e6ab3117","updated":"2023-06-23 10:46:02.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a528364cd53176f007e0b50f6a57de7212542237","unresolved":true,"context_lines":[{"line_number":2688,"context_line":"        fw_components \u003d []"},{"line_number":2689,"context_line":"        with _session_for_write() as session:"},{"line_number":2690,"context_line":"            self._check_node_exists(session, node_id)"},{"line_number":2691,"context_line":"            try:"},{"line_number":2692,"context_line":"                for cmp in components:"},{"line_number":2693,"context_line":"                    # NOTE(iurygregory): when creating the entry for the fw"},{"line_number":2694,"context_line":"                    # component, the current_version will be the same value"}],"source_content_type":"text/x-python","patch_set":4,"id":"add7d50c_72654740","line":2691,"updated":"2023-05-25 12:46:36.000000000","message":"I suspect you\u0027re adapting this code from somewhere, but I\u0027d move the try..except block to outside of the \"with\" block. Despite \"flush\", the transaction may not be committed until the session is closed.","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":2688,"context_line":"        fw_components \u003d []"},{"line_number":2689,"context_line":"        with _session_for_write() as session:"},{"line_number":2690,"context_line":"            self._check_node_exists(session, node_id)"},{"line_number":2691,"context_line":"            try:"},{"line_number":2692,"context_line":"                for cmp in components:"},{"line_number":2693,"context_line":"                    # NOTE(iurygregory): when creating the entry for the fw"},{"line_number":2694,"context_line":"                    # component, the current_version will be the same value"}],"source_content_type":"text/x-python","patch_set":4,"id":"669803c7_aed45f03","line":2691,"in_reply_to":"add7d50c_72654740","updated":"2023-05-25 14:44:28.000000000","message":"Yeah, adapting from the create_bios_settings_list, so we probably have the same problem there \u003dX","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a528364cd53176f007e0b50f6a57de7212542237","unresolved":true,"context_lines":[{"line_number":2706,"context_line":"                session.flush()"},{"line_number":2707,"context_line":"            except db_exc.DBDuplicateEntry:"},{"line_number":2708,"context_line":"                raise exception.FirmwareComponentAlreadyExists("},{"line_number":2709,"context_line":"                    name\u003dcmp[\u0027component\u0027], node\u003dnode_id)"},{"line_number":2710,"context_line":"        return fw_components"},{"line_number":2711,"context_line":""},{"line_number":2712,"context_line":"    @oslo_db_api.retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a62abc7_d445550c","line":2709,"updated":"2023-05-25 12:46:36.000000000","message":"\"cmp\" here will always contains the last component, not the one that caused the conflict.","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":2706,"context_line":"                session.flush()"},{"line_number":2707,"context_line":"            except db_exc.DBDuplicateEntry:"},{"line_number":2708,"context_line":"                raise exception.FirmwareComponentAlreadyExists("},{"line_number":2709,"context_line":"                    name\u003dcmp[\u0027component\u0027], node\u003dnode_id)"},{"line_number":2710,"context_line":"        return fw_components"},{"line_number":2711,"context_line":""},{"line_number":2712,"context_line":"    @oslo_db_api.retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":4,"id":"0cebc5a7_2b4e31c9","line":2709,"in_reply_to":"7a62abc7_d445550c","updated":"2023-05-25 14:44:28.000000000","message":"so we probably have the same problem in the bios_settings \u003cfunny\u003e","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d0922a4990b450ec38398ccd8e602f41f7ffe73f","unresolved":true,"context_lines":[{"line_number":2713,"context_line":"    def update_firmware_component_list(self, node_id, components, version):"},{"line_number":2714,"context_line":"        fw_components \u003d []"},{"line_number":2715,"context_line":"        with _session_for_write() as session:"},{"line_number":2716,"context_line":"            self._check_node_exists(session, node_id)"},{"line_number":2717,"context_line":"            try:"},{"line_number":2718,"context_line":"                for cmp in components:"},{"line_number":2719,"context_line":"                    query \u003d (session.query(models.FirmwareInformation)"}],"source_content_type":"text/x-python","patch_set":4,"id":"74fe6fc5_ae3ad10f","line":2716,"updated":"2023-05-26 00:04:21.000000000","message":"I night be crazy, but if your calling from a task, and there is a constraint in the db already schema model wise, this might be redundant to do. This being check that the node exists.","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"001d352d5c9a56a7b2c7f0b513eff45eef97e4d8","unresolved":false,"context_lines":[{"line_number":2713,"context_line":"    def update_firmware_component_list(self, node_id, components, version):"},{"line_number":2714,"context_line":"        fw_components \u003d []"},{"line_number":2715,"context_line":"        with _session_for_write() as session:"},{"line_number":2716,"context_line":"            self._check_node_exists(session, node_id)"},{"line_number":2717,"context_line":"            try:"},{"line_number":2718,"context_line":"                for cmp in components:"},{"line_number":2719,"context_line":"                    query \u003d (session.query(models.FirmwareInformation)"}],"source_content_type":"text/x-python","patch_set":4,"id":"71658135_7a3196b9","line":2716,"in_reply_to":"74fe6fc5_ae3ad10f","updated":"2023-05-26 06:17:11.000000000","message":"This is my plan, so I will update, thanks!","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a528364cd53176f007e0b50f6a57de7212542237","unresolved":true,"context_lines":[{"line_number":2714,"context_line":"        fw_components \u003d []"},{"line_number":2715,"context_line":"        with _session_for_write() as session:"},{"line_number":2716,"context_line":"            self._check_node_exists(session, node_id)"},{"line_number":2717,"context_line":"            try:"},{"line_number":2718,"context_line":"                for cmp in components:"},{"line_number":2719,"context_line":"                    query \u003d (session.query(models.FirmwareInformation)"},{"line_number":2720,"context_line":"                             .filter_by("}],"source_content_type":"text/x-python","patch_set":4,"id":"7c4663b3_38e24cb9","line":2717,"updated":"2023-05-25 12:46:36.000000000","message":"same two comments here","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":2714,"context_line":"        fw_components \u003d []"},{"line_number":2715,"context_line":"        with _session_for_write() as session:"},{"line_number":2716,"context_line":"            self._check_node_exists(session, node_id)"},{"line_number":2717,"context_line":"            try:"},{"line_number":2718,"context_line":"                for cmp in components:"},{"line_number":2719,"context_line":"                    query \u003d (session.query(models.FirmwareInformation)"},{"line_number":2720,"context_line":"                             .filter_by("}],"source_content_type":"text/x-python","patch_set":4,"id":"1793ae16_4eade6ad","line":2717,"in_reply_to":"7c4663b3_38e24cb9","updated":"2023-05-25 14:44:28.000000000","message":"Ack","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a528364cd53176f007e0b50f6a57de7212542237","unresolved":true,"context_lines":[{"line_number":2719,"context_line":"                    query \u003d (session.query(models.FirmwareInformation)"},{"line_number":2720,"context_line":"                             .filter_by("},{"line_number":2721,"context_line":"                             node_id\u003dnode_id, component\u003dcmp[\u0027component\u0027]))"},{"line_number":2722,"context_line":"                    ref \u003d query.one()"},{"line_number":2723,"context_line":"                    ref.update("},{"line_number":2724,"context_line":"                        {\u0027initial_version\u0027: cmp.get(\u0027initial_version\u0027),"},{"line_number":2725,"context_line":"                         \u0027current_version\u0027: cmp.get(\u0027current_version\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"01fb704a_2636544d","line":2722,"updated":"2023-05-25 12:46:36.000000000","message":"You probably want query.with_for_update().one() here to lock the record from conflicting changes","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":2719,"context_line":"                    query \u003d (session.query(models.FirmwareInformation)"},{"line_number":2720,"context_line":"                             .filter_by("},{"line_number":2721,"context_line":"                             node_id\u003dnode_id, component\u003dcmp[\u0027component\u0027]))"},{"line_number":2722,"context_line":"                    ref \u003d query.one()"},{"line_number":2723,"context_line":"                    ref.update("},{"line_number":2724,"context_line":"                        {\u0027initial_version\u0027: cmp.get(\u0027initial_version\u0027),"},{"line_number":2725,"context_line":"                         \u0027current_version\u0027: cmp.get(\u0027current_version\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"509ddf8d_41cf53ce","line":2722,"in_reply_to":"01fb704a_2636544d","updated":"2023-05-25 14:44:28.000000000","message":"Ack","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"56e74e8a00ac95aa0b8ff6a2b7ff264251f42f9b","unresolved":true,"context_lines":[{"line_number":2725,"context_line":"                         \u0027current_version\u0027: cmp.get(\u0027current_version\u0027),"},{"line_number":2726,"context_line":"                         \u0027last_version_flashed\u0027:"},{"line_number":2727,"context_line":"                            cmp.get(\u0027last_version_flashed\u0027),"},{"line_number":2728,"context_line":"                         \u0027version\u0027: version})"},{"line_number":2729,"context_line":"                    fw_components.append(ref)"},{"line_number":2730,"context_line":"                session.flush()"},{"line_number":2731,"context_line":"            except NoResultFound:"}],"source_content_type":"text/x-python","patch_set":4,"id":"62ff137c_f538c9c1","line":2728,"range":{"start_line":2728,"start_character":23,"end_line":2728,"end_character":45},"updated":"2023-05-25 23:54:10.000000000","message":"version is the object version in the oslo.db layer....  we shouldn\u0027t be using it for our own data storage. I think you mean current version?!","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"001d352d5c9a56a7b2c7f0b513eff45eef97e4d8","unresolved":false,"context_lines":[{"line_number":2725,"context_line":"                         \u0027current_version\u0027: cmp.get(\u0027current_version\u0027),"},{"line_number":2726,"context_line":"                         \u0027last_version_flashed\u0027:"},{"line_number":2727,"context_line":"                            cmp.get(\u0027last_version_flashed\u0027),"},{"line_number":2728,"context_line":"                         \u0027version\u0027: version})"},{"line_number":2729,"context_line":"                    fw_components.append(ref)"},{"line_number":2730,"context_line":"                session.flush()"},{"line_number":2731,"context_line":"            except NoResultFound:"}],"source_content_type":"text/x-python","patch_set":4,"id":"c1356239_b7f61015","line":2728,"range":{"start_line":2728,"start_character":23,"end_line":2728,"end_character":45},"in_reply_to":"62ff137c_f538c9c1","updated":"2023-05-26 06:17:11.000000000","message":"oh no \u003cO\u003e, it\u0027s the object version.\nSorry","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"879a394ba5de0973cef437cd9c7be2be4f9771a5","unresolved":true,"context_lines":[{"line_number":2662,"context_line":"                models.NodeInventory.node_id \u003d\u003d values[\u0027node_id\u0027]"},{"line_number":2663,"context_line":"            ).delete()"},{"line_number":2664,"context_line":"            session.add(inventory)"},{"line_number":2665,"context_line":"            session.flush()"},{"line_number":2666,"context_line":"        return inventory"},{"line_number":2667,"context_line":""},{"line_number":2668,"context_line":"    @oslo_db_api.retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":17,"id":"0e6c11ad_2a7f0ef9","line":2665,"updated":"2023-07-06 21:55:36.000000000","message":"Curious why we need a flush() here but not elsewhere.","commit_id":"dad6724292b57085a5234efba4441c754657e865"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"8037362383127b39be80f0f831237e4a6a6bbf55","unresolved":true,"context_lines":[{"line_number":2662,"context_line":"                models.NodeInventory.node_id \u003d\u003d values[\u0027node_id\u0027]"},{"line_number":2663,"context_line":"            ).delete()"},{"line_number":2664,"context_line":"            session.add(inventory)"},{"line_number":2665,"context_line":"            session.flush()"},{"line_number":2666,"context_line":"        return inventory"},{"line_number":2667,"context_line":""},{"line_number":2668,"context_line":"    @oslo_db_api.retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":17,"id":"b1c290c0_2170ccc8","line":2665,"in_reply_to":"0e6c11ad_2a7f0ef9","updated":"2023-07-06 22:02:41.000000000","message":"I think all create and update functions have flush, not sure what you mean but elsewhere here .-.","commit_id":"dad6724292b57085a5234efba4441c754657e865"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d146109eaf126c0099248be22417d49ede319d00","unresolved":true,"context_lines":[{"line_number":2662,"context_line":"                models.NodeInventory.node_id \u003d\u003d values[\u0027node_id\u0027]"},{"line_number":2663,"context_line":"            ).delete()"},{"line_number":2664,"context_line":"            session.add(inventory)"},{"line_number":2665,"context_line":"            session.flush()"},{"line_number":2666,"context_line":"        return inventory"},{"line_number":2667,"context_line":""},{"line_number":2668,"context_line":"    @oslo_db_api.retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":17,"id":"30094353_e62f8131","line":2665,"in_reply_to":"b1c290c0_2170ccc8","updated":"2023-07-06 22:05:08.000000000","message":"I looked at the whole thing again, my question was just an artifact of the limited patchset-\u003epatchset diff which was rendering weird. My question is moot now 😊","commit_id":"dad6724292b57085a5234efba4441c754657e865"}],"ironic/db/sqlalchemy/models.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f00263c4f203acbef09b1fc195a32820d1b3fce6","unresolved":true,"context_lines":[{"line_number":500,"context_line":"    node_id \u003d Column(Integer, ForeignKey(\u0027nodes.id\u0027), nullable\u003dTrue)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"class FirmwareComponent(Base):"},{"line_number":504,"context_line":"    \"\"\"Represents the firmware information of a bare metal node.\"\"\""},{"line_number":505,"context_line":"    __tablename__ \u003d \"firmware_information\""},{"line_number":506,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"5ab6ac07_5ddaada8","line":503,"updated":"2023-06-28 13:44:14.000000000","message":"eek.\n\nBad news, This is legitimately failing:  From CI:\n\n}}}\n\nTraceback (most recent call last):\n  File \"/home/zuul/src/opendev.org/openstack/ironic/ironic/tests/unit/db/sqlalchemy/test_migrations.py\", line 197, in test_walk_versions\n    self._walk_versions(self.engine, self.config)\n  File \"/home/zuul/src/opendev.org/openstack/ironic/ironic/tests/unit/db/sqlalchemy/test_migrations.py\", line 94, in _walk_versions\n    self._migrate_up(engine, alembic_cfg,\n  File \"/home/zuul/src/opendev.org/openstack/ironic/ironic/tests/unit/db/sqlalchemy/test_migrations.py\", line 119, in _migrate_up\n    check(engine, data)\n  File \"/home/zuul/src/opendev.org/openstack/ironic/ironic/tests/unit/db/sqlalchemy/test_migrations.py\", line 1335, in _check_163040c5513f\n    models.FirmwareInformation\nAttributeError: module \u0027ironic.db.sqlalchemy.models\u0027 has no attribute \u0027FirmwareInformation\u0027","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"354098a6d1a793733fccfa053db9f7693e1704d5","unresolved":false,"context_lines":[{"line_number":500,"context_line":"    node_id \u003d Column(Integer, ForeignKey(\u0027nodes.id\u0027), nullable\u003dTrue)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"class FirmwareComponent(Base):"},{"line_number":504,"context_line":"    \"\"\"Represents the firmware information of a bare metal node.\"\"\""},{"line_number":505,"context_line":"    __tablename__ \u003d \"firmware_information\""},{"line_number":506,"context_line":"    __table_args__ \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"d449bee8_565f087d","line":503,"in_reply_to":"5ab6ac07_5ddaada8","updated":"2023-07-04 13:25:27.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"}],"ironic/objects/firmware.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # NOTE(iurygregory): some fields shouldn\u0027t be updated, like"},{"line_number":67,"context_line":"        # \u0027initial_version\u0027, \u0027id\u0027, \u0027node_id\u0027, \u0027component\u0027"},{"line_number":68,"context_line":"        # filter them out or raise an Error?"},{"line_number":69,"context_line":"        updates \u003d self.do_version_changes_for_db()"},{"line_number":70,"context_line":"        up_fwcmp \u003d self.dbapi.update_firmware_component("},{"line_number":71,"context_line":"            self.node_id, self.component, updates)"}],"source_content_type":"text/x-python","patch_set":16,"id":"23ebfa5f_1b55d5b3","line":68,"updated":"2023-06-22 14:11:59.000000000","message":"How do we handle the same problem elsewhere? I suspect only on the API level.","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # NOTE(iurygregory): some fields shouldn\u0027t be updated, like"},{"line_number":67,"context_line":"        # \u0027initial_version\u0027, \u0027id\u0027, \u0027node_id\u0027, \u0027component\u0027"},{"line_number":68,"context_line":"        # filter them out or raise an Error?"},{"line_number":69,"context_line":"        updates \u003d self.do_version_changes_for_db()"},{"line_number":70,"context_line":"        up_fwcmp \u003d self.dbapi.update_firmware_component("},{"line_number":71,"context_line":"            self.node_id, self.component, updates)"}],"source_content_type":"text/x-python","patch_set":16,"id":"2e8d0b30_d17d80a2","line":68,"in_reply_to":"23ebfa5f_1b55d5b3","updated":"2023-06-29 01:48:49.000000000","message":"yeah I think it makes sense.","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        for cmp in components:"},{"line_number":143,"context_line":"            if cmp[\u0027component\u0027] in current_components_dict:"},{"line_number":144,"context_line":"                values \u003d current_components_dict.get(cmp[\u0027component\u0027])"},{"line_number":145,"context_line":"                keys \u003d [\u0027current_version\u0027, \u0027last_version_flashed\u0027]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                changed \u003d (cmp[keys[0]] !\u003d values.get(keys[0])"}],"source_content_type":"text/x-python","patch_set":16,"id":"06b92f1c_0b351fbd","line":144,"updated":"2023-06-22 14:11:59.000000000","message":"nit: no need for get(), you already know it is there","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cccadaa5247b20472a98f0a50192650755a7901e","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        for cmp in components:"},{"line_number":143,"context_line":"            if cmp[\u0027component\u0027] in current_components_dict:"},{"line_number":144,"context_line":"                values \u003d current_components_dict.get(cmp[\u0027component\u0027])"},{"line_number":145,"context_line":"                keys \u003d [\u0027current_version\u0027, \u0027last_version_flashed\u0027]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                changed \u003d (cmp[keys[0]] !\u003d values.get(keys[0])"}],"source_content_type":"text/x-python","patch_set":16,"id":"e1b449a7_d0e2ed6b","line":144,"in_reply_to":"06b92f1c_0b351fbd","updated":"2023-06-23 10:46:02.000000000","message":"Ack","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                values \u003d current_components_dict.get(cmp[\u0027component\u0027])"},{"line_number":145,"context_line":"                keys \u003d [\u0027current_version\u0027, \u0027last_version_flashed\u0027]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                changed \u003d (cmp[keys[0]] !\u003d values.get(keys[0])"},{"line_number":148,"context_line":"                           or cmp[keys[1]] !\u003d values.get(keys[1]))"},{"line_number":149,"context_line":"                if changed:"},{"line_number":150,"context_line":"                    update_list.append(cmp)"}],"source_content_type":"text/x-python","patch_set":16,"id":"badf0589_08d6bbb3","line":147,"updated":"2023-06-22 14:11:59.000000000","message":"Why having keys here? You could just compare cmp[\u0027current_version\u0027] etc.","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                values \u003d current_components_dict.get(cmp[\u0027component\u0027])"},{"line_number":145,"context_line":"                keys \u003d [\u0027current_version\u0027, \u0027last_version_flashed\u0027]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                changed \u003d (cmp[keys[0]] !\u003d values.get(keys[0])"},{"line_number":148,"context_line":"                           or cmp[keys[1]] !\u003d values.get(keys[1]))"},{"line_number":149,"context_line":"                if changed:"},{"line_number":150,"context_line":"                    update_list.append(cmp)"}],"source_content_type":"text/x-python","patch_set":16,"id":"601b1c1d_86165b39","line":147,"in_reply_to":"badf0589_08d6bbb3","updated":"2023-06-29 01:48:49.000000000","message":"Ack","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"}],"ironic/tests/unit/db/utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a528364cd53176f007e0b50f6a57de7212542237","unresolved":true,"context_lines":[{"line_number":778,"context_line":""},{"line_number":779,"context_line":"def get_test_firmware_component(**kw):"},{"line_number":780,"context_line":"    return {"},{"line_number":781,"context_line":"        \u0027node_id\u0027: kw.get(\u0027node_id\u0027, \u0027123\u0027),"},{"line_number":782,"context_line":"        \u0027component\u0027: kw.get(\u0027component\u0027, \u0027bmc\u0027),"},{"line_number":783,"context_line":"        \u0027initial_version\u0027: kw.get(\u0027initial_version\u0027, \u0027v1.0.0\u0027),"},{"line_number":784,"context_line":"        \u0027current_version\u0027: kw.get(\u0027current_version\u0027, None),"}],"source_content_type":"text/x-python","patch_set":4,"id":"05c6990e_6ea98e17","line":781,"updated":"2023-05-25 12:46:36.000000000","message":"nit: node_id is a number, not a string","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"cdff0f04d8294fe85cc39e1df8726e64376e8a64","unresolved":false,"context_lines":[{"line_number":778,"context_line":""},{"line_number":779,"context_line":"def get_test_firmware_component(**kw):"},{"line_number":780,"context_line":"    return {"},{"line_number":781,"context_line":"        \u0027node_id\u0027: kw.get(\u0027node_id\u0027, \u0027123\u0027),"},{"line_number":782,"context_line":"        \u0027component\u0027: kw.get(\u0027component\u0027, \u0027bmc\u0027),"},{"line_number":783,"context_line":"        \u0027initial_version\u0027: kw.get(\u0027initial_version\u0027, \u0027v1.0.0\u0027),"},{"line_number":784,"context_line":"        \u0027current_version\u0027: kw.get(\u0027current_version\u0027, None),"}],"source_content_type":"text/x-python","patch_set":4,"id":"b7bb74d7_f816c0eb","line":781,"in_reply_to":"05c6990e_6ea98e17","updated":"2023-05-25 14:44:28.000000000","message":"Done","commit_id":"d0e53a2f956d9dafcfd66bc979a7beb43630ec80"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":763,"context_line":"    :param kw: kwargs with overriding values for firmware component"},{"line_number":764,"context_line":"    :returns: Test FirmwareComponent DB object"},{"line_number":765,"context_line":"    \"\"\""},{"line_number":766,"context_line":"    fw_cmp_values \u003d get_test_firmware_component(**kw)"},{"line_number":767,"context_line":"    dbapi \u003d db_api.get_instance()"},{"line_number":768,"context_line":"    return dbapi.create_firmware_component(fw_cmp_values)"},{"line_number":769,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"82a86776_696e176e","line":766,"updated":"2023-06-22 14:11:59.000000000","message":"Please drop \u0027id\u0027 - see line 752","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":763,"context_line":"    :param kw: kwargs with overriding values for firmware component"},{"line_number":764,"context_line":"    :returns: Test FirmwareComponent DB object"},{"line_number":765,"context_line":"    \"\"\""},{"line_number":766,"context_line":"    fw_cmp_values \u003d get_test_firmware_component(**kw)"},{"line_number":767,"context_line":"    dbapi \u003d db_api.get_instance()"},{"line_number":768,"context_line":"    return dbapi.create_firmware_component(fw_cmp_values)"},{"line_number":769,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8dae22_6bbbcde6","line":766,"in_reply_to":"82a86776_696e176e","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":789,"context_line":"        {\u0027component\u0027: \u0027bmc\u0027, \u0027initial_version\u0027: \u0027v1.0.0\u0027,"},{"line_number":790,"context_line":"         \u0027current_version\u0027: None, \u0027last_version_flashed\u0027: None},"},{"line_number":791,"context_line":"        {\u0027component\u0027: \u0027BIOS\u0027, \u0027initial_version\u0027: \u0027v1.5.0\u0027,"},{"line_number":792,"context_line":"         \u0027current_version\u0027: None, \u0027last_version_flashed\u0027: None},"},{"line_number":793,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":16,"id":"6e07971f_dbe218bc","line":792,"updated":"2023-06-22 14:11:59.000000000","message":"nit: I think the list call returns full records, not just these fields?","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":true,"context_lines":[{"line_number":789,"context_line":"        {\u0027component\u0027: \u0027bmc\u0027, \u0027initial_version\u0027: \u0027v1.0.0\u0027,"},{"line_number":790,"context_line":"         \u0027current_version\u0027: None, \u0027last_version_flashed\u0027: None},"},{"line_number":791,"context_line":"        {\u0027component\u0027: \u0027BIOS\u0027, \u0027initial_version\u0027: \u0027v1.5.0\u0027,"},{"line_number":792,"context_line":"         \u0027current_version\u0027: None, \u0027last_version_flashed\u0027: None},"},{"line_number":793,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":16,"id":"17baf630_d681c09b","line":792,"in_reply_to":"6e07971f_dbe218bc","updated":"2023-06-29 01:48:49.000000000","message":"you mean including the id, node_id, created_at, updated_at, version?","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"}],"ironic/tests/unit/objects/test_bios.py":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"bff01236cd35780cd496b8de97f8039881715d15","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        mock_get_setting_list.return_value \u003d [self.bios_setting, bios_setting2]"},{"line_number":60,"context_line":"        bios_obj_list \u003d objects.BIOSSettingList.get_by_node_id("},{"line_number":61,"context_line":"            self.context, self.node_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        mock_get_setting_list.assert_called_once_with(self.node_id)"},{"line_number":64,"context_line":"        self.assertEqual(self.context, bios_obj_list._context)"},{"line_number":65,"context_line":"        self.assertEqual(2, len(bios_obj_list))"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f875b89_038abca9","side":"PARENT","line":62,"updated":"2023-06-19 14:51:36.000000000","message":"nit: unrelated change","commit_id":"8ef69aaa6a3c3e449f870803ac0558fd02225234"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"448fc1fa355b5f4216404687b367ef87a4ecc630","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        mock_get_setting_list.return_value \u003d [self.bios_setting, bios_setting2]"},{"line_number":60,"context_line":"        bios_obj_list \u003d objects.BIOSSettingList.get_by_node_id("},{"line_number":61,"context_line":"            self.context, self.node_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        mock_get_setting_list.assert_called_once_with(self.node_id)"},{"line_number":64,"context_line":"        self.assertEqual(self.context, bios_obj_list._context)"},{"line_number":65,"context_line":"        self.assertEqual(2, len(bios_obj_list))"}],"source_content_type":"text/x-python","patch_set":13,"id":"6f83eb2a_74309067","side":"PARENT","line":62,"in_reply_to":"7f875b89_038abca9","updated":"2023-06-19 19:15:20.000000000","message":"Done","commit_id":"8ef69aaa6a3c3e449f870803ac0558fd02225234"}],"ironic/tests/unit/objects/test_firmware.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        super(TestFirmwareComponentObject, self).setUp()"},{"line_number":31,"context_line":"        self.fake_node \u003d db_utils.get_test_node()"},{"line_number":32,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":33,"context_line":"        self.node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.fake_fw_cmp \u003d db_utils.get_test_firmware_component()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f5b1d2f_79400e1d","line":32,"updated":"2023-06-22 14:11:59.000000000","message":"I think you already have self.context in the base class","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        super(TestFirmwareComponentObject, self).setUp()"},{"line_number":31,"context_line":"        self.fake_node \u003d db_utils.get_test_node()"},{"line_number":32,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":33,"context_line":"        self.node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.fake_fw_cmp \u003d db_utils.get_test_firmware_component()"}],"source_content_type":"text/x-python","patch_set":16,"id":"11c5e8e6_e6f0979a","line":32,"in_reply_to":"1f5b1d2f_79400e1d","updated":"2023-06-29 01:48:49.000000000","message":"Ack","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":30,"context_line":"        super(TestFirmwareComponentObject, self).setUp()"},{"line_number":31,"context_line":"        self.fake_node \u003d db_utils.get_test_node()"},{"line_number":32,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":33,"context_line":"        self.node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.fake_fw_cmp \u003d db_utils.get_test_firmware_component()"},{"line_number":36,"context_line":"        self.firmware_component \u003d obj_utils.get_test_firmware_component("}],"source_content_type":"text/x-python","patch_set":16,"id":"92e5ba61_cf019fda","line":33,"updated":"2023-06-22 14:11:59.000000000","message":"You can even to create_test_node","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        super(TestFirmwareComponentObject, self).setUp()"},{"line_number":31,"context_line":"        self.fake_node \u003d db_utils.get_test_node()"},{"line_number":32,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":33,"context_line":"        self.node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        self.fake_fw_cmp \u003d db_utils.get_test_firmware_component()"},{"line_number":36,"context_line":"        self.firmware_component \u003d obj_utils.get_test_firmware_component("}],"source_content_type":"text/x-python","patch_set":16,"id":"7a77c50c_f2552544","line":33,"in_reply_to":"92e5ba61_cf019fda","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":82,"context_line":"                              self.node_id, self.fake_fw_cmp[\u0027component\u0027])"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_create(self):"},{"line_number":85,"context_line":"        node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":86,"context_line":"        node.create()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.fake_fw_cmp[\u0027node_id\u0027] \u003d node.id"}],"source_content_type":"text/x-python","patch_set":16,"id":"cc6357b9_df690c03","line":85,"updated":"2023-06-22 14:11:59.000000000","message":"nit: use create_test_node (possible in setUp to avoid repeating)","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                              self.node_id, self.fake_fw_cmp[\u0027component\u0027])"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_create(self):"},{"line_number":85,"context_line":"        node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":86,"context_line":"        node.create()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.fake_fw_cmp[\u0027node_id\u0027] \u003d node.id"}],"source_content_type":"text/x-python","patch_set":16,"id":"12399dae_a95f8efb","line":85,"in_reply_to":"cc6357b9_df690c03","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_create(self):"},{"line_number":85,"context_line":"        node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":86,"context_line":"        node.create()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.fake_fw_cmp[\u0027node_id\u0027] \u003d node.id"},{"line_number":89,"context_line":"        fw_cmp \u003d obj_utils.get_test_firmware_component("}],"source_content_type":"text/x-python","patch_set":16,"id":"0aad437a_352eea37","line":86,"updated":"2023-06-22 14:11:59.000000000","message":"Actually, you\u0027re mocking dbapi, why even have a real node?","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_create(self):"},{"line_number":85,"context_line":"        node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":86,"context_line":"        node.create()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.fake_fw_cmp[\u0027node_id\u0027] \u003d node.id"},{"line_number":89,"context_line":"        fw_cmp \u003d obj_utils.get_test_firmware_component("}],"source_content_type":"text/x-python","patch_set":16,"id":"5d95c5b0_548de4da","line":86,"in_reply_to":"0aad437a_352eea37","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":86,"context_line":"        node.create()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.fake_fw_cmp[\u0027node_id\u0027] \u003d node.id"},{"line_number":89,"context_line":"        fw_cmp \u003d obj_utils.get_test_firmware_component("},{"line_number":90,"context_line":"            self.ctxt, **self.fake_fw_cmp)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        with mock.patch.object(self.dbapi, \u0027create_firmware_component\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"190f7f1b_8870c7df","line":89,"updated":"2023-06-22 14:11:59.000000000","message":"Why not use self.firmware_component?","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        node.create()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.fake_fw_cmp[\u0027node_id\u0027] \u003d node.id"},{"line_number":89,"context_line":"        fw_cmp \u003d obj_utils.get_test_firmware_component("},{"line_number":90,"context_line":"            self.ctxt, **self.fake_fw_cmp)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        with mock.patch.object(self.dbapi, \u0027create_firmware_component\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"9e8afc46_2904f8eb","line":89,"in_reply_to":"190f7f1b_8870c7df","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            mock_create_fw_cmp.assert_called_once_with(self.fake_fw_cmp)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"            args, _kwargs \u003d mock_create_fw_cmp.call_args"},{"line_number":102,"context_line":"            self.assertEqual(objects.FirmwareComponent.VERSION,"},{"line_number":103,"context_line":"                             args[0][\u0027version\u0027])"},{"line_number":104,"context_line":"            self.assertEqual(1, mock_create_fw_cmp.call_count)"}],"source_content_type":"text/x-python","patch_set":16,"id":"a7fa87e0_4398b0cc","line":101,"updated":"2023-06-22 14:11:59.000000000","message":"Why not use assert_called_once_with?","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            mock_create_fw_cmp.assert_called_once_with(self.fake_fw_cmp)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"            args, _kwargs \u003d mock_create_fw_cmp.call_args"},{"line_number":102,"context_line":"            self.assertEqual(objects.FirmwareComponent.VERSION,"},{"line_number":103,"context_line":"                             args[0][\u0027version\u0027])"},{"line_number":104,"context_line":"            self.assertEqual(1, mock_create_fw_cmp.call_count)"}],"source_content_type":"text/x-python","patch_set":16,"id":"337e63c8_dbefa9b0","line":101,"in_reply_to":"a7fa87e0_4398b0cc","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":103,"context_line":"                             args[0][\u0027version\u0027])"},{"line_number":104,"context_line":"            self.assertEqual(1, mock_create_fw_cmp.call_count)"},{"line_number":105,"context_line":"            self.assertEqual(self.firmware_component.node_id,"},{"line_number":106,"context_line":"                             fw_cmp.node_id)"},{"line_number":107,"context_line":"            self.assertEqual(self.firmware_component.component,"},{"line_number":108,"context_line":"                             fw_cmp.component)"},{"line_number":109,"context_line":"            self.assertEqual(self.firmware_component.initial_version,"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a2f8235_1cfde502","line":106,"updated":"2023-06-22 14:11:59.000000000","message":"The remaining comparisons check nothing: you created fw_cmp from self.fake_fw_cmp, self.firmware_component is also created from it.","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                             args[0][\u0027version\u0027])"},{"line_number":104,"context_line":"            self.assertEqual(1, mock_create_fw_cmp.call_count)"},{"line_number":105,"context_line":"            self.assertEqual(self.firmware_component.node_id,"},{"line_number":106,"context_line":"                             fw_cmp.node_id)"},{"line_number":107,"context_line":"            self.assertEqual(self.firmware_component.component,"},{"line_number":108,"context_line":"                             fw_cmp.component)"},{"line_number":109,"context_line":"            self.assertEqual(self.firmware_component.initial_version,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fe83e551_7220273d","line":106,"in_reply_to":"5a2f8235_1cfde502","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"be1ca8ed8770e63c755d2a3b01ad167f0ea44fd4","unresolved":true,"context_lines":[{"line_number":113,"context_line":"            self.assertEqual(self.firmware_component.last_version_flashed,"},{"line_number":114,"context_line":"                             fw_cmp.last_version_flashed)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def test_save(self):"},{"line_number":117,"context_line":"        node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":118,"context_line":"        node.create()"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"60e6a508_a060e3f8","line":116,"updated":"2023-06-22 14:11:59.000000000","message":"Similarly here","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ac0aaafa391e242cf1b975d55f905a5bc77b8b7f","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            self.assertEqual(self.firmware_component.last_version_flashed,"},{"line_number":114,"context_line":"                             fw_cmp.last_version_flashed)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def test_save(self):"},{"line_number":117,"context_line":"        node \u003d obj_utils.get_test_node(self.ctxt, **self.fake_node)"},{"line_number":118,"context_line":"        node.create()"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"f9a02ddd_1df30bd9","line":116,"in_reply_to":"60e6a508_a060e3f8","updated":"2023-06-29 01:48:49.000000000","message":"Done","commit_id":"b01a285dee0565bbdea25740f6088eb5c192a752"}]}
