)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d8b9f3f260b16c820311f47be87dd9570d604fd1","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Redfish driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Aija Jaunteva \u003caija.jaunteva@dell.com\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ie8f3f68c4a771121ec0ee13ce9349c7cd2b1e567"},{"line_number":15,"context_line":"Depends-On: https://review.opendev.org/#/c/745950"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_9d2311a8","line":13,"updated":"2020-09-14 22:49:36.000000000","message":"story/task?","commit_id":"933693ff77fb8cff57a079b8e3bcf364481fcc00"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8b5cf5e71928d1c2ac2344c3ce8d0048fce9d2b5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Redfish driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Aija Jaunteva \u003caija.jaunteva@dell.com\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ie8f3f68c4a771121ec0ee13ce9349c7cd2b1e567"},{"line_number":15,"context_line":"Depends-On: https://review.opendev.org/#/c/745950"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9f560f44_b81ee35c","line":13,"in_reply_to":"9f560f44_9d2311a8","updated":"2020-09-15 00:48:14.000000000","message":"Done","commit_id":"933693ff77fb8cff57a079b8e3bcf364481fcc00"}],"doc/source/admin/drivers/redfish.rst":[{"author":{"_account_id":7160,"name":"arkady kanevsky","email":"akanevsk@redhat.com","username":"arkady"},"change_message_id":"1b1eb34bc06c1263ae31b819b45b93fffd1b2cb9","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                    \"sleep\" \u003cnumber_of_seconds_to_sleep\u003e"},{"line_number":292,"context_line":"                },"},{"line_number":293,"context_line":"                {"},{"line_number":294,"context_line":"                    \"url\": \"\u003curl_to_firmware_image2\u003e\""},{"line_number":295,"context_line":"                },"},{"line_number":296,"context_line":"                ..."},{"line_number":297,"context_line":"            ]"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_792f2388","line":294,"range":{"start_line":294,"start_character":0,"end_line":294,"end_character":53},"updated":"2020-09-15 17:24:24.000000000","message":"If optional sleep argument is not specified is it equivalent to sleep 0?","commit_id":"f157845cbf844d61920a3fed929b6e526508cbd7"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"e85caa5eba8449f41f341b3e2185c5290034e945","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                    \"sleep\" \u003cnumber_of_seconds_to_sleep\u003e"},{"line_number":292,"context_line":"                },"},{"line_number":293,"context_line":"                {"},{"line_number":294,"context_line":"                    \"url\": \"\u003curl_to_firmware_image2\u003e\""},{"line_number":295,"context_line":"                },"},{"line_number":296,"context_line":"                ..."},{"line_number":297,"context_line":"            ]"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_7c53913a","line":294,"range":{"start_line":294,"start_character":0,"end_line":294,"end_character":53},"in_reply_to":"9f560f44_792f2388","updated":"2020-09-15 19:27:05.000000000","message":"Yes, it means that it won\u0027t sleep following the update. I added this to the doc.","commit_id":"f157845cbf844d61920a3fed929b6e526508cbd7"},{"author":{"_account_id":7160,"name":"arkady kanevsky","email":"akanevsk@redhat.com","username":"arkady"},"change_message_id":"1b1eb34bc06c1263ae31b819b45b93fffd1b2cb9","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    \"``args``\", \"Keyword-argument entry (\u003cname\u003e: \u003cvalue\u003e) being passed to cleaning step\""},{"line_number":310,"context_line":"    \"``args.firmware_images``\", \"Ordered list of dictionaries of firmware images to be applied\""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Each firmware image dictionary, is of the form::"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    {"},{"line_number":315,"context_line":"      \"url\": \"\u003cURL of firmware image file\u003e\","}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_1643566e","line":312,"range":{"start_line":312,"start_character":47,"end_line":312,"end_character":48},"updated":"2020-09-15 17:24:24.000000000","message":"extra \":\"","commit_id":"f157845cbf844d61920a3fed929b6e526508cbd7"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"e85caa5eba8449f41f341b3e2185c5290034e945","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    \"``args``\", \"Keyword-argument entry (\u003cname\u003e: \u003cvalue\u003e) being passed to cleaning step\""},{"line_number":310,"context_line":"    \"``args.firmware_images``\", \"Ordered list of dictionaries of firmware images to be applied\""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"Each firmware image dictionary, is of the form::"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    {"},{"line_number":315,"context_line":"      \"url\": \"\u003cURL of firmware image file\u003e\","}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_7c01d106","line":312,"range":{"start_line":312,"start_character":47,"end_line":312,"end_character":48},"in_reply_to":"9f560f44_1643566e","updated":"2020-09-15 19:27:05.000000000","message":"The double colon is part of the formatting. It makes the indented text below show up as a literal code block.","commit_id":"f157845cbf844d61920a3fed929b6e526508cbd7"},{"author":{"_account_id":7160,"name":"arkady kanevsky","email":"akanevsk@redhat.com","username":"arkady"},"change_message_id":"1b1eb34bc06c1263ae31b819b45b93fffd1b2cb9","unresolved":false,"context_lines":[{"line_number":325,"context_line":"   argument."},{"line_number":326,"context_line":""},{"line_number":327,"context_line":".. note::"},{"line_number":328,"context_line":"   At the present time, targets for the firmware update cannot be specified."},{"line_number":329,"context_line":"   In testing, the BMC applied the update to all applicable targets on the"},{"line_number":330,"context_line":"   node."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"To perform a firmware update, first download the firmware to a web server that"},{"line_number":333,"context_line":"the BMC has network access to. This could be the ironic conductor web server"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_7653b23a","line":330,"range":{"start_line":328,"start_character":0,"end_line":330,"end_character":8},"updated":"2020-09-15 17:24:24.000000000","message":"Should we document that assumption is that FW image includes what component it is applicable to?","commit_id":"f157845cbf844d61920a3fed929b6e526508cbd7"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"e85caa5eba8449f41f341b3e2185c5290034e945","unresolved":false,"context_lines":[{"line_number":325,"context_line":"   argument."},{"line_number":326,"context_line":""},{"line_number":327,"context_line":".. note::"},{"line_number":328,"context_line":"   At the present time, targets for the firmware update cannot be specified."},{"line_number":329,"context_line":"   In testing, the BMC applied the update to all applicable targets on the"},{"line_number":330,"context_line":"   node."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"To perform a firmware update, first download the firmware to a web server that"},{"line_number":333,"context_line":"the BMC has network access to. This could be the ironic conductor web server"}],"source_content_type":"text/x-rst","patch_set":12,"id":"9f560f44_22af347e","line":330,"range":{"start_line":328,"start_character":0,"end_line":330,"end_character":8},"in_reply_to":"9f560f44_7653b23a","updated":"2020-09-15 19:27:05.000000000","message":"Done","commit_id":"f157845cbf844d61920a3fed929b6e526508cbd7"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"7cbb0882a7ad87b9e9639c40e50bfdd1d1d4a8f5","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        \"args\": {"},{"line_number":358,"context_line":"            \"firmware_images\":["},{"line_number":359,"context_line":"                {"},{"line_number":360,"context_line":"                    \"url\": \"http://192.168.110.10/BMC_4_22_00_00.EXE\","},{"line_number":361,"context_line":"                    \"sleep\" 300"},{"line_number":362,"context_line":"                },"},{"line_number":363,"context_line":"                {"}],"source_content_type":"text/x-rst","patch_set":14,"id":"9f560f44_f00fbd85","line":360,"updated":"2020-09-16 04:44:26.000000000","message":"nit, I\u0027d prefer docs and tests use IP address from one of the TEST-NET ranges, like 192.0.2.0/24\n\nhttps://en.wikipedia.org/wiki/Reserved_IP_addresses","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"0ca36d97448b8ed4ade50a4c8b5e790d581b5843","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        \"args\": {"},{"line_number":358,"context_line":"            \"firmware_images\":["},{"line_number":359,"context_line":"                {"},{"line_number":360,"context_line":"                    \"url\": \"http://192.168.110.10/BMC_4_22_00_00.EXE\","},{"line_number":361,"context_line":"                    \"sleep\" 300"},{"line_number":362,"context_line":"                },"},{"line_number":363,"context_line":"                {"}],"source_content_type":"text/x-rst","patch_set":14,"id":"9f560f44_b4bff0a8","line":360,"in_reply_to":"9f560f44_f00fbd85","updated":"2020-09-16 22:47:56.000000000","message":"Done","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"7cbb0882a7ad87b9e9639c40e50bfdd1d1d4a8f5","unresolved":false,"context_lines":[{"line_number":375,"context_line":""},{"line_number":376,"context_line":"In the following example, the JSON is specified directly on the command line::"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    openstack baremetal node clean \u003cironic_node_uuid\u003e --clean-steps \u0027[{\"interface\": \"management\", \"step\": \"update_firmware\", \"args\": {\"firmware_images\":[{\"url\": \"http://my_address/BMC_4_22_00_00.EXE\", \"sleep\" 300}, {\"url\": \"https://my_secure_address/NIC_19.0.12_A00.EXE\"}]}}]\u0027"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":".. note::"},{"line_number":381,"context_line":"   Firmware updates may take some time to complete. If a firmware update"}],"source_content_type":"text/x-rst","patch_set":14,"id":"9f560f44_5024a90e","line":378,"range":{"start_line":378,"start_character":169,"end_line":378,"end_character":179},"updated":"2020-09-16 04:44:26.000000000","message":"I guess use the same test-net here for consistency?","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"0ca36d97448b8ed4ade50a4c8b5e790d581b5843","unresolved":false,"context_lines":[{"line_number":375,"context_line":""},{"line_number":376,"context_line":"In the following example, the JSON is specified directly on the command line::"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    openstack baremetal node clean \u003cironic_node_uuid\u003e --clean-steps \u0027[{\"interface\": \"management\", \"step\": \"update_firmware\", \"args\": {\"firmware_images\":[{\"url\": \"http://my_address/BMC_4_22_00_00.EXE\", \"sleep\" 300}, {\"url\": \"https://my_secure_address/NIC_19.0.12_A00.EXE\"}]}}]\u0027"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":".. note::"},{"line_number":381,"context_line":"   Firmware updates may take some time to complete. If a firmware update"}],"source_content_type":"text/x-rst","patch_set":14,"id":"9f560f44_14da1c1c","line":378,"range":{"start_line":378,"start_character":169,"end_line":378,"end_character":179},"in_reply_to":"9f560f44_5024a90e","updated":"2020-09-16 22:47:56.000000000","message":"Done","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"  Make sure to use add the simple-init_ element when building the IPA ramdisk."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":".. _Redfish: http://redfish.dmtf.org/"},{"line_number":253,"context_line":".. _Sushy: https://opendev.org/openstack/sushy"},{"line_number":254,"context_line":".. _TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security"},{"line_number":255,"context_line":".. _ESP: https://wiki.ubuntu.com/EFIBootLoaders#Booting_from_EFI"},{"line_number":256,"context_line":".. _network_data: https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/metadata-service-network-info.html"},{"line_number":257,"context_line":".. _config-drive: https://docs.openstack.org/nova/queens/user/config-drive.html"},{"line_number":258,"context_line":".. _Glean: https://docs.openstack.org/infra/glean/"},{"line_number":259,"context_line":".. _simple-init: https://docs.openstack.org/diskimage-builder/latest/elements/simple-init/README.html"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"Firmware update using manual cleaning step"},{"line_number":262,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":17,"id":"9f560f44_3310df00","line":259,"range":{"start_line":252,"start_character":0,"end_line":259,"end_character":101},"updated":"2020-09-18 21:48:19.000000000","message":"Generally we want this stuff at the end of the file","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"  Make sure to use add the simple-init_ element when building the IPA ramdisk."},{"line_number":251,"context_line":""},{"line_number":252,"context_line":".. _Redfish: http://redfish.dmtf.org/"},{"line_number":253,"context_line":".. _Sushy: https://opendev.org/openstack/sushy"},{"line_number":254,"context_line":".. _TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security"},{"line_number":255,"context_line":".. _ESP: https://wiki.ubuntu.com/EFIBootLoaders#Booting_from_EFI"},{"line_number":256,"context_line":".. _network_data: https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/metadata-service-network-info.html"},{"line_number":257,"context_line":".. _config-drive: https://docs.openstack.org/nova/queens/user/config-drive.html"},{"line_number":258,"context_line":".. _Glean: https://docs.openstack.org/infra/glean/"},{"line_number":259,"context_line":".. _simple-init: https://docs.openstack.org/diskimage-builder/latest/elements/simple-init/README.html"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"Firmware update using manual cleaning step"},{"line_number":262,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":17,"id":"9f560f44_4734a8df","line":259,"range":{"start_line":252,"start_character":0,"end_line":259,"end_character":101},"in_reply_to":"9f560f44_3310df00","updated":"2020-09-20 22:09:57.000000000","message":"Done","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":279,"context_line":"wait after the update has been applied before indicating that the"},{"line_number":280,"context_line":"update was successful. This allows the BMC time to fully reset before further"},{"line_number":281,"context_line":"operations are carried out against it. To cause the cleaning step to wait after"},{"line_number":282,"context_line":"applying an update, an optional ``sleep`` argument may be specified in the"},{"line_number":283,"context_line":"firmware image dictionary. The value of this argument indicates the number of"},{"line_number":284,"context_line":"seconds to sleep following the update. If the ``sleep`` argument is not"},{"line_number":285,"context_line":"specified, then this is equivalent to ``sleep 0``, meaning that it will not"},{"line_number":286,"context_line":"sleep and immediately proceed with the next firmware update if there is one,"},{"line_number":287,"context_line":"or complete the cleaning step if not."},{"line_number":288,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"9f560f44_d30083ae","line":285,"range":{"start_line":282,"start_character":0,"end_line":285,"end_character":75},"updated":"2020-09-18 21:48:19.000000000","message":"Nit: One thing regarding sleep, and this is likely a nit. I suspect only super technical folks that either know python time.sleep() or use bash sleep are goign to think in the terms conveyed. Maybe wait? I dunno.","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":279,"context_line":"wait after the update has been applied before indicating that the"},{"line_number":280,"context_line":"update was successful. This allows the BMC time to fully reset before further"},{"line_number":281,"context_line":"operations are carried out against it. To cause the cleaning step to wait after"},{"line_number":282,"context_line":"applying an update, an optional ``sleep`` argument may be specified in the"},{"line_number":283,"context_line":"firmware image dictionary. The value of this argument indicates the number of"},{"line_number":284,"context_line":"seconds to sleep following the update. If the ``sleep`` argument is not"},{"line_number":285,"context_line":"specified, then this is equivalent to ``sleep 0``, meaning that it will not"},{"line_number":286,"context_line":"sleep and immediately proceed with the next firmware update if there is one,"},{"line_number":287,"context_line":"or complete the cleaning step if not."},{"line_number":288,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"9f560f44_c74d5872","line":285,"range":{"start_line":282,"start_character":0,"end_line":285,"end_character":75},"in_reply_to":"9f560f44_d30083ae","updated":"2020-09-20 22:09:57.000000000","message":"Done","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"852a389a05404c61105d879009aca4a931f0a7ac","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            \"firmware_images\":["},{"line_number":287,"context_line":"                {"},{"line_number":288,"context_line":"                    \"url\": \"\u003curl_to_firmware_image1\u003e\","},{"line_number":289,"context_line":"                    \"wait\" \u003cnumber_of_seconds_to_wait\u003e"},{"line_number":290,"context_line":"                },"},{"line_number":291,"context_line":"                {"},{"line_number":292,"context_line":"                    \"url\": \"\u003curl_to_firmware_image2\u003e\""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_605ca87d","line":289,"range":{"start_line":289,"start_character":20,"end_line":289,"end_character":54},"updated":"2020-09-28 16:28:45.000000000","message":"Nit: missing \u0027:\u0027","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"82e675dc3d52631f4dd819fb3147ae5dc8c33028","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            \"firmware_images\":["},{"line_number":287,"context_line":"                {"},{"line_number":288,"context_line":"                    \"url\": \"\u003curl_to_firmware_image1\u003e\","},{"line_number":289,"context_line":"                    \"wait\" \u003cnumber_of_seconds_to_wait\u003e"},{"line_number":290,"context_line":"                },"},{"line_number":291,"context_line":"                {"},{"line_number":292,"context_line":"                    \"url\": \"\u003curl_to_firmware_image2\u003e\""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_51e4d442","line":289,"range":{"start_line":289,"start_character":20,"end_line":289,"end_character":54},"in_reply_to":"9f560f44_605ca87d","updated":"2020-09-28 19:14:12.000000000","message":"Done","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a94f878c70e3410ddbc2338e0c7c09cc3c642eb0","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            \"firmware_images\":["},{"line_number":287,"context_line":"                {"},{"line_number":288,"context_line":"                    \"url\": \"\u003curl_to_firmware_image1\u003e\","},{"line_number":289,"context_line":"                    \"wait\" \u003cnumber_of_seconds_to_wait\u003e"},{"line_number":290,"context_line":"                },"},{"line_number":291,"context_line":"                {"},{"line_number":292,"context_line":"                    \"url\": \"\u003curl_to_firmware_image2\u003e\""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_ac0a371b","line":289,"range":{"start_line":289,"start_character":20,"end_line":289,"end_character":54},"in_reply_to":"9f560f44_605ca87d","updated":"2020-09-28 19:09:36.000000000","message":"Good catch to fix since people will copy/paste this block of text.","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"852a389a05404c61105d879009aca4a931f0a7ac","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            \"firmware_images\":["},{"line_number":350,"context_line":"                {"},{"line_number":351,"context_line":"                    \"url\": \"http://192.0.2.10/BMC_4_22_00_00.EXE\","},{"line_number":352,"context_line":"                    \"wait\" 300"},{"line_number":353,"context_line":"                },"},{"line_number":354,"context_line":"                {"},{"line_number":355,"context_line":"                    \"url\": \"https://192.0.2.10/NIC_19.0.12_A00.EXE\""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_7d7e0fe4","line":352,"range":{"start_line":352,"start_character":20,"end_line":352,"end_character":30},"updated":"2020-09-28 16:28:45.000000000","message":"Nit: missing \u0027:\u0027","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"82e675dc3d52631f4dd819fb3147ae5dc8c33028","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            \"firmware_images\":["},{"line_number":350,"context_line":"                {"},{"line_number":351,"context_line":"                    \"url\": \"http://192.0.2.10/BMC_4_22_00_00.EXE\","},{"line_number":352,"context_line":"                    \"wait\" 300"},{"line_number":353,"context_line":"                },"},{"line_number":354,"context_line":"                {"},{"line_number":355,"context_line":"                    \"url\": \"https://192.0.2.10/NIC_19.0.12_A00.EXE\""}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_31e96019","line":352,"range":{"start_line":352,"start_character":20,"end_line":352,"end_character":30},"in_reply_to":"9f560f44_7d7e0fe4","updated":"2020-09-28 19:14:12.000000000","message":"Done","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"852a389a05404c61105d879009aca4a931f0a7ac","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":"In the following example, the JSON is specified directly on the command line::"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    openstack baremetal node clean \u003cironic_node_uuid\u003e --clean-steps \u0027[{\"interface\": \"management\", \"step\": \"update_firmware\", \"args\": {\"firmware_images\":[{\"url\": \"http://192.0.2.10/BMC_4_22_00_00.EXE\", \"wait\" 300}, {\"url\": \"https://192.0.2.10/NIC_19.0.12_A00.EXE\"}]}}]\u0027"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":".. note::"},{"line_number":372,"context_line":"   Firmware updates may take some time to complete. If a firmware update"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_9d64c34f","line":369,"range":{"start_line":369,"start_character":201,"end_line":369,"end_character":211},"updated":"2020-09-28 16:28:45.000000000","message":"Nit: missing \u0027:\u0027","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"82e675dc3d52631f4dd819fb3147ae5dc8c33028","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":"In the following example, the JSON is specified directly on the command line::"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    openstack baremetal node clean \u003cironic_node_uuid\u003e --clean-steps \u0027[{\"interface\": \"management\", \"step\": \"update_firmware\", \"args\": {\"firmware_images\":[{\"url\": \"http://192.0.2.10/BMC_4_22_00_00.EXE\", \"wait\" 300}, {\"url\": \"https://192.0.2.10/NIC_19.0.12_A00.EXE\"}]}}]\u0027"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":".. note::"},{"line_number":372,"context_line":"   Firmware updates may take some time to complete. If a firmware update"}],"source_content_type":"text/x-rst","patch_set":23,"id":"9f560f44_91ee6c1f","line":369,"range":{"start_line":369,"start_character":201,"end_line":369,"end_character":211},"in_reply_to":"9f560f44_9d64c34f","updated":"2020-09-28 19:14:12.000000000","message":"Done","commit_id":"801234287853c760d11830750981a8930b1f4b49"}],"ironic/conf/redfish.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":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      \u0027This setting must be set to the octal number \u0027"},{"line_number":82,"context_line":"                      \u0027representation, meaning starting with ``0o``.\u0027)),"},{"line_number":83,"context_line":"    cfg.IntOpt(\u0027firmware_update_status_interval\u0027,"},{"line_number":84,"context_line":"               min\u003d1,"},{"line_number":85,"context_line":"               default\u003d20,"},{"line_number":86,"context_line":"               help\u003d_(\u0027Number of seconds to wait between checking for \u0027"},{"line_number":87,"context_line":"                      \u0027completed firmware update tasks\u0027)),"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_b2e49ba9","line":84,"updated":"2020-09-23 23:48:00.000000000","message":"We need to support 0 to be used as a mechanism to disable the periodic task, I\u0027ll explain why at the decorator.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                      \u0027This setting must be set to the octal number \u0027"},{"line_number":82,"context_line":"                      \u0027representation, meaning starting with ``0o``.\u0027)),"},{"line_number":83,"context_line":"    cfg.IntOpt(\u0027firmware_update_status_interval\u0027,"},{"line_number":84,"context_line":"               min\u003d1,"},{"line_number":85,"context_line":"               default\u003d20,"},{"line_number":86,"context_line":"               help\u003d_(\u0027Number of seconds to wait between checking for \u0027"},{"line_number":87,"context_line":"                      \u0027completed firmware update tasks\u0027)),"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_0e63961b","line":84,"in_reply_to":"9f560f44_b2e49ba9","updated":"2020-09-24 21:33:03.000000000","message":"Done","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"}],"ironic/drivers/modules/redfish/management.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"7cbb0882a7ad87b9e9639c40e50bfdd1d1d4a8f5","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        firmware_update \u003d firmware_updates[0]"},{"line_number":735,"context_line":"        sleep_interval \u003d firmware_update.get(\u0027sleep\u0027)"},{"line_number":736,"context_line":"        if sleep_interval:"},{"line_number":737,"context_line":"            time_now \u003d datetime.datetime.utcnow().strftime(TIME_FORMAT)"},{"line_number":738,"context_line":"            firmware_update[\u0027sleep_start_time\u0027] \u003d time_now"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"            LOG.debug(\u0027Starting to sleep at %(time)s for %(seconds)s after \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f560f44_108071bf","line":737,"updated":"2020-09-16 04:44:26.000000000","message":"Any datetimes that go over the wire really should be in ISO 8601. If there is no specific reason for the custom TIME_FORMAT I\u0027d suggest using isoformat()","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"0ca36d97448b8ed4ade50a4c8b5e790d581b5843","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        firmware_update \u003d firmware_updates[0]"},{"line_number":735,"context_line":"        sleep_interval \u003d firmware_update.get(\u0027sleep\u0027)"},{"line_number":736,"context_line":"        if sleep_interval:"},{"line_number":737,"context_line":"            time_now \u003d datetime.datetime.utcnow().strftime(TIME_FORMAT)"},{"line_number":738,"context_line":"            firmware_update[\u0027sleep_start_time\u0027] \u003d time_now"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"            LOG.debug(\u0027Starting to sleep at %(time)s for %(seconds)s after \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f560f44_df327df2","line":737,"in_reply_to":"9f560f44_108071bf","updated":"2020-09-16 22:47:56.000000000","message":"Done","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"7cbb0882a7ad87b9e9639c40e50bfdd1d1d4a8f5","unresolved":false,"context_lines":[{"line_number":851,"context_line":"        sleep_start_time \u003d firmware_update.get(\u0027sleep_start_time\u0027)"},{"line_number":852,"context_line":"        if sleep_start_time:"},{"line_number":853,"context_line":"            sleep_start \u003d datetime.datetime.strptime("},{"line_number":854,"context_line":"                sleep_start_time, TIME_FORMAT)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"            elapsed_time \u003d datetime.datetime.utcnow() - sleep_start"},{"line_number":857,"context_line":"            if elapsed_time.seconds \u003e\u003d firmware_update[\u0027sleep\u0027]:"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f560f44_70f72d5b","line":854,"updated":"2020-09-16 04:44:26.000000000","message":"for parsing iso format datetimes, you can use oslo_utils.timeutils.parse_isotime","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"0ca36d97448b8ed4ade50a4c8b5e790d581b5843","unresolved":false,"context_lines":[{"line_number":851,"context_line":"        sleep_start_time \u003d firmware_update.get(\u0027sleep_start_time\u0027)"},{"line_number":852,"context_line":"        if sleep_start_time:"},{"line_number":853,"context_line":"            sleep_start \u003d datetime.datetime.strptime("},{"line_number":854,"context_line":"                sleep_start_time, TIME_FORMAT)"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"            elapsed_time \u003d datetime.datetime.utcnow() - sleep_start"},{"line_number":857,"context_line":"            if elapsed_time.seconds \u003e\u003d firmware_update[\u0027sleep\u0027]:"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f560f44_5fa2edfd","line":854,"in_reply_to":"9f560f44_70f72d5b","updated":"2020-09-16 22:47:56.000000000","message":"Done","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        firmware_update \u003d firmware_updates[0]"},{"line_number":716,"context_line":"        firmware_url \u003d firmware_update[\u0027url\u0027]"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        LOG.debug(\u0027Applying firmware %(firmware_image)s to node \u0027"},{"line_number":719,"context_line":"                  \u0027%(node_uuid)s\u0027,"},{"line_number":720,"context_line":"                  {\u0027firmware_image\u0027: firmware_url,"},{"line_number":721,"context_line":"                   \u0027node_uuid\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_5830e255","line":718,"updated":"2020-09-22 15:59:11.000000000","message":"nit: Duplicates logging on line 693","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        firmware_update \u003d firmware_updates[0]"},{"line_number":716,"context_line":"        firmware_url \u003d firmware_update[\u0027url\u0027]"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        LOG.debug(\u0027Applying firmware %(firmware_image)s to node \u0027"},{"line_number":719,"context_line":"                  \u0027%(node_uuid)s\u0027,"},{"line_number":720,"context_line":"                  {\u0027firmware_image\u0027: firmware_url,"},{"line_number":721,"context_line":"                   \u0027node_uuid\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_2784eb0a","line":718,"in_reply_to":"9f560f44_5830e255","updated":"2020-09-22 21:35:56.000000000","message":"Well, the logging on line 693 logs all of the firmware updates that will be processed during the cleaning step. It\u0027s executed 1 time when the cleaning step is first kicked off. This logging statement logs when each update is being applied, so it is executed once per firmware update in the cleaning step. I think both have some value, since it would be a good idea to know when successive updates are starting to be applied, though you are right that in the case where there is only 1 firmware update to be applied in the cleaning step, there will be 2 messages logged.","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":738,"context_line":"            time_now \u003d str(timeutils.utcnow().isoformat())"},{"line_number":739,"context_line":"            firmware_update[\u0027wait_start_time\u0027] \u003d time_now"},{"line_number":740,"context_line":""},{"line_number":741,"context_line":"            LOG.debug(\u0027Starting to wait at %(time)s for %(seconds)s seconds \u0027"},{"line_number":742,"context_line":"                      \u0027after firmware update %(firmware_image)s on node \u0027"},{"line_number":743,"context_line":"                      \u0027%(node)s\u0027,"},{"line_number":744,"context_line":"                      {\u0027time\u0027: time_now,"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_38352e46","line":741,"updated":"2020-09-22 15:59:11.000000000","message":"\"Starting\" may be misleading here, the function is also called for finished updates","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":738,"context_line":"            time_now \u003d str(timeutils.utcnow().isoformat())"},{"line_number":739,"context_line":"            firmware_update[\u0027wait_start_time\u0027] \u003d time_now"},{"line_number":740,"context_line":""},{"line_number":741,"context_line":"            LOG.debug(\u0027Starting to wait at %(time)s for %(seconds)s seconds \u0027"},{"line_number":742,"context_line":"                      \u0027after firmware update %(firmware_image)s on node \u0027"},{"line_number":743,"context_line":"                      \u0027%(node)s\u0027,"},{"line_number":744,"context_line":"                      {\u0027time\u0027: time_now,"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_67c70347","line":741,"in_reply_to":"9f560f44_38352e46","updated":"2020-09-22 21:35:56.000000000","message":"This logging statement will only be executed after a firmware update was successful and the user has requested a wait time, so it will be executed at most one per firmware update. I\u0027ve removed the \"Starting\". Let me know if there are further changes you think should be made.","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":765,"context_line":"                                        update_service,"},{"line_number":766,"context_line":"                                        firmware_updates)"},{"line_number":767,"context_line":"            node.save()"},{"line_number":768,"context_line":"            manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"    def _clear_firmware_updates(self, node):"},{"line_number":771,"context_line":"        driver_internal_info \u003d node.driver_internal_info"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_983d5a2e","line":768,"updated":"2020-09-22 15:59:11.000000000","message":"do you need to repeat set_async_step_flags? I don\u0027t remember for sure, but we might clear some of them on successful reboot..","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":765,"context_line":"                                        update_service,"},{"line_number":766,"context_line":"                                        firmware_updates)"},{"line_number":767,"context_line":"            node.save()"},{"line_number":768,"context_line":"            manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"    def _clear_firmware_updates(self, node):"},{"line_number":771,"context_line":"        driver_internal_info \u003d node.driver_internal_info"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_87f8577c","line":768,"in_reply_to":"9f560f44_983d5a2e","updated":"2020-09-22 21:35:56.000000000","message":"I did some poking around and found wipe_internal_info_on_power_off() here:\nhttps://github.com/openstack/ironic/blob/master/ironic/conductor/utils.py#L293\nThis method nukes agent_secret_token, agent_cached_deploy_steps, and agent_cached_clean_steps and is called on reboot. set_async_step_flags doesn\u0027t set any of those:\nhttps://github.com/openstack/ironic/blob/master/ironic/drivers/modules/deploy_utils.py#L1280\nI\u0027ve tested this pretty extensively and haven\u0027t hit any issues. Given all of the above I\u0027m thinking that the answer is no. My knowledge in this area could be better though. I would appreciate it if you could verify.","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":838,"context_line":"            return"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"        firmware_updates \u003d node.driver_internal_info[\u0027firmware_updates\u0027]"},{"line_number":841,"context_line":"        firmware_update \u003d firmware_updates[0]"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        try:"},{"line_number":844,"context_line":"            update_service \u003d redfish_utils.get_update_service(node)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_783a0634","line":841,"updated":"2020-09-22 15:59:11.000000000","message":"nit: call the variable current_update to avoid confusion","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":838,"context_line":"            return"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"        firmware_updates \u003d node.driver_internal_info[\u0027firmware_updates\u0027]"},{"line_number":841,"context_line":"        firmware_update \u003d firmware_updates[0]"},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        try:"},{"line_number":844,"context_line":"            update_service \u003d redfish_utils.get_update_service(node)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_873df72d","line":841,"in_reply_to":"9f560f44_783a0634","updated":"2020-09-22 21:35:56.000000000","message":"Done","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            # If the BMC firmware is being updated, the BMC will be"},{"line_number":847,"context_line":"            # unavailable for some amount of time."},{"line_number":848,"context_line":"            LOG.warning(\u0027Unable to communicate with firmware update service \u0027"},{"line_number":849,"context_line":"                        \u0027on node %(node)s. Will try again on the next poll.\u0027,"},{"line_number":850,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":851,"context_line":"            return"},{"line_number":852,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_d84352af","line":849,"updated":"2020-09-22 15:59:11.000000000","message":"nit: log the error","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            # If the BMC firmware is being updated, the BMC will be"},{"line_number":847,"context_line":"            # unavailable for some amount of time."},{"line_number":848,"context_line":"            LOG.warning(\u0027Unable to communicate with firmware update service \u0027"},{"line_number":849,"context_line":"                        \u0027on node %(node)s. Will try again on the next poll.\u0027,"},{"line_number":850,"context_line":"                        {\u0027node\u0027: node.uuid})"},{"line_number":851,"context_line":"            return"},{"line_number":852,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_27834bcd","line":849,"in_reply_to":"9f560f44_d84352af","updated":"2020-09-22 21:35:56.000000000","message":"Done","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            node.save()"},{"line_number":767,"context_line":"            manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"    def _clear_firmware_updates(self, node):"},{"line_number":770,"context_line":"        driver_internal_info \u003d node.driver_internal_info"},{"line_number":771,"context_line":"        driver_internal_info.pop(\u0027firmware_updates\u0027, None)"},{"line_number":772,"context_line":"        node.driver_internal_info \u003d driver_internal_info"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_cd0d3236","line":769,"updated":"2020-09-23 23:48:00.000000000","message":"This method likely ought to upgrade the lock before trying to modify the node object. The lock upgrade refreshes the node object to the latest representation which _CAN_ change between the time the entry is returned by the periodic\u0027s database query and by the time the conductor iterates to it.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            node.save()"},{"line_number":767,"context_line":"            manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"    def _clear_firmware_updates(self, node):"},{"line_number":770,"context_line":"        driver_internal_info \u003d node.driver_internal_info"},{"line_number":771,"context_line":"        driver_internal_info.pop(\u0027firmware_updates\u0027, None)"},{"line_number":772,"context_line":"        node.driver_internal_info \u003d driver_internal_info"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_e75005d8","line":769,"in_reply_to":"9f560f44_cd0d3236","updated":"2020-09-24 21:33:03.000000000","message":"Corrected locking by performing all locks in _check_node_firmware_update() to make all the locking occur in one place.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":773,"context_line":"        node.save()"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"    @METRICS.timer(\u0027RedfishManagement._query_firmware_update_status\u0027)"},{"line_number":776,"context_line":"    @periodics.periodic("},{"line_number":777,"context_line":"        spacing\u003dCONF.redfish.firmware_update_status_interval)"},{"line_number":778,"context_line":"    def _query_firmware_update_status(self, manager, context):"},{"line_number":779,"context_line":"        \"\"\"Periodic job to check firmware update tasks.\"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_12f58751","line":776,"updated":"2020-09-23 23:48:00.000000000","message":"This periodic needs to be able to be disabled. I know this seems weird, but the super large deployments don\u0027t need nor want periodics running every x seconds. Returning and then iterating the conductor through a thread with 10,000 nodes is just not a great idea.\n\nI believe the parameter is enabled, and if you pass it a compare to 0 that should work to disable it. A number of the other periodic decorators have this sort of setup.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":773,"context_line":"        node.save()"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"    @METRICS.timer(\u0027RedfishManagement._query_firmware_update_status\u0027)"},{"line_number":776,"context_line":"    @periodics.periodic("},{"line_number":777,"context_line":"        spacing\u003dCONF.redfish.firmware_update_status_interval)"},{"line_number":778,"context_line":"    def _query_firmware_update_status(self, manager, context):"},{"line_number":779,"context_line":"        \"\"\"Periodic job to check firmware update tasks.\"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_f18c4336","line":776,"in_reply_to":"9f560f44_12f58751","updated":"2020-09-24 21:33:03.000000000","message":"Makes sense. Done.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":774,"context_line":""},{"line_number":775,"context_line":"    @METRICS.timer(\u0027RedfishManagement._query_firmware_update_status\u0027)"},{"line_number":776,"context_line":"    @periodics.periodic("},{"line_number":777,"context_line":"        spacing\u003dCONF.redfish.firmware_update_status_interval)"},{"line_number":778,"context_line":"    def _query_firmware_update_status(self, manager, context):"},{"line_number":779,"context_line":"        \"\"\"Periodic job to check firmware update tasks.\"\"\""},{"line_number":780,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_32dfebd7","line":777,"updated":"2020-09-23 23:48:00.000000000","message":"So the default is 20 seconds. If we feel the need to be _that_ aggressive, then we need to likely try to somehow tune down the set of nodes returned from the DB.\n\nAlternatively I think if we tuned the default to 30 seconds, that would reduce the spread. If we made it an even larger default say 45 may be better.\n\nI guess with a thousand redfish machines, we\u0027re going to be hitting the DB quite a bit and iterating through a number of records, which may be quickly somewhat problematic if we\u0027re doing it too often.\n\nLook at it this way. If someone has an average node record size of 4kB, and they have 1000 nodes, we\u0027re effectively asking for a database cursor and records to be returned of 4 Megabytes.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":774,"context_line":""},{"line_number":775,"context_line":"    @METRICS.timer(\u0027RedfishManagement._query_firmware_update_status\u0027)"},{"line_number":776,"context_line":"    @periodics.periodic("},{"line_number":777,"context_line":"        spacing\u003dCONF.redfish.firmware_update_status_interval)"},{"line_number":778,"context_line":"    def _query_firmware_update_status(self, manager, context):"},{"line_number":779,"context_line":"        \"\"\"Periodic job to check firmware update tasks.\"\"\""},{"line_number":780,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_d1b49f38","line":777,"in_reply_to":"9f560f44_32dfebd7","updated":"2020-09-24 21:33:03.000000000","message":"The reason why I made it 20 seconds is because the iDRAC deletes the Task object a fairly short period of time after the update completes - something less than 1 minute. As a result, if the polling interval is too big, when we go to check the Task object to determine if the upgrade was successful, the Task object is already gone and we can\u0027t determine success or failure.\n\nI\u0027ve written the code so that it emits a warning in this case, assumes the update was successful, and continues with the next update. Even with the 20 second polling interval, I have seen rare cases where the Task has been deleted when we go to check it.\n\nI completely agree that 20 seconds is very aggressive. I also think that it\u0027s a bug that the Task is deleted so quickly. The Task should be available for a minimum of 2x the amount of time it took to do the firmware update. I\u0027ll file a bug with the firmware team on this.\n\nI\u0027ve increased the polling time to 60 seconds, since that is by far a more reasonable interval, though that means we will almost never be able to validate that the update was successful and just have to assume that it was (at least until the bug is fixed). The worst thing that will happen is that we will apply all of the updates, and whatever succeeds, succeeds and whatever doesn\u0027t, doesn\u0027t\n\nJust wanted you to know there was a reason for this madness.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":778,"context_line":"    def _query_firmware_update_status(self, manager, context):"},{"line_number":779,"context_line":"        \"\"\"Periodic job to check firmware update tasks.\"\"\""},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        filters \u003d {\u0027reserved\u0027: False}"},{"line_number":782,"context_line":"        fields \u003d [\u0027driver_internal_info\u0027]"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        node_list \u003d manager.iter_nodes(fields\u003dfields, filters\u003dfilters)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_122627cc","line":781,"updated":"2020-09-23 23:48:00.000000000","message":"what may be good, and I\u0027m not immediately sure if there is a clean way to do this off the top of my head, is to only query for nodes in cleaning or deploying. That way we ask the database to slice down the number of nodes we iterate upon possibly by a substantial number.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":778,"context_line":"    def _query_firmware_update_status(self, manager, context):"},{"line_number":779,"context_line":"        \"\"\"Periodic job to check firmware update tasks.\"\"\""},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        filters \u003d {\u0027reserved\u0027: False}"},{"line_number":782,"context_line":"        fields \u003d [\u0027driver_internal_info\u0027]"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        node_list \u003d manager.iter_nodes(fields\u003dfields, filters\u003dfilters)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_27d5d8b7","line":781,"in_reply_to":"9f560f44_122627cc","updated":"2020-09-24 21:33:03.000000000","message":"since this is just a clean step for now, added filtering on provisioning_state: CLEANWAIT to increase scalability","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        fields \u003d [\u0027driver_internal_info\u0027]"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        node_list \u003d manager.iter_nodes(fields\u003dfields, filters\u003dfilters)"},{"line_number":785,"context_line":"        for (node_uuid, driver, conductor_group,"},{"line_number":786,"context_line":"             driver_internal_info) in node_list:"},{"line_number":787,"context_line":"            try:"},{"line_number":788,"context_line":"                lock_purpose \u003d \u0027checking async firmware update tasks.\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_926cf707","line":785,"range":{"start_line":785,"start_character":32,"end_line":785,"end_character":47},"updated":"2020-09-23 23:48:00.000000000","message":"aside: We might want to check the conductor group. I think the manager.iter_nodes should only be giving back the lsit of nodes that this conductor presently manages, but we definitely don\u0027t want to be in a situation where we\u0027re trying to reconcile a node that is in another conductor group and vice-versa.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        fields \u003d [\u0027driver_internal_info\u0027]"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        node_list \u003d manager.iter_nodes(fields\u003dfields, filters\u003dfilters)"},{"line_number":785,"context_line":"        for (node_uuid, driver, conductor_group,"},{"line_number":786,"context_line":"             driver_internal_info) in node_list:"},{"line_number":787,"context_line":"            try:"},{"line_number":788,"context_line":"                lock_purpose \u003d \u0027checking async firmware update tasks.\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_276e7895","line":785,"range":{"start_line":785,"start_character":32,"end_line":785,"end_character":47},"in_reply_to":"9f560f44_926cf707","updated":"2020-09-24 21:33:03.000000000","message":"As we discussed, conductor filters the results from the DB by conductor group, so nothing for me to do here.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":794,"context_line":"                        continue"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"                    firmware_updates \u003d driver_internal_info.get("},{"line_number":797,"context_line":"                        \u0027firmware_updates\u0027)"},{"line_number":798,"context_line":"                    if not firmware_updates:"},{"line_number":799,"context_line":"                        continue"},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_524fff90","line":797,"updated":"2020-09-23 23:48:00.000000000","message":"One day the database interface will enable us to query on this directly... One day. :)  For now, it is likely fine.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":794,"context_line":"                        continue"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"                    firmware_updates \u003d driver_internal_info.get("},{"line_number":797,"context_line":"                        \u0027firmware_updates\u0027)"},{"line_number":798,"context_line":"                    if not firmware_updates:"},{"line_number":799,"context_line":"                        continue"},{"line_number":800,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_f101e305","line":797,"in_reply_to":"9f560f44_524fff90","updated":"2020-09-24 21:33:03.000000000","message":"aok","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":821,"context_line":"            # failed state then discard any remaining firmware updates. This"},{"line_number":822,"context_line":"            # makes it so when the user takes the node out of maintenance"},{"line_number":823,"context_line":"            # mode, pending firmware updates do not automatically continue."},{"line_number":824,"context_line":"            if node.provision_state \u003d\u003d states.CLEANFAIL:"},{"line_number":825,"context_line":"                LOG.warning(\u0027Node is in maintenance mode and an error has \u0027"},{"line_number":826,"context_line":"                            \u0027occurred.  Discarding remaining firmware updates \u0027"},{"line_number":827,"context_line":"                            \u0027for node %(node)s\u0027, {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_cd36d2e7","line":824,"updated":"2020-09-23 23:48:00.000000000","message":"note: if you do query on state, you\u0027ll likely need a separate periodic to clean up or clean_up the firmware update flags upon entry into cleanfail.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":821,"context_line":"            # failed state then discard any remaining firmware updates. This"},{"line_number":822,"context_line":"            # makes it so when the user takes the node out of maintenance"},{"line_number":823,"context_line":"            # mode, pending firmware updates do not automatically continue."},{"line_number":824,"context_line":"            if node.provision_state \u003d\u003d states.CLEANFAIL:"},{"line_number":825,"context_line":"                LOG.warning(\u0027Node is in maintenance mode and an error has \u0027"},{"line_number":826,"context_line":"                            \u0027occurred.  Discarding remaining firmware updates \u0027"},{"line_number":827,"context_line":"                            \u0027for node %(node)s\u0027, {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_a70728c9","line":824,"in_reply_to":"9f560f44_cd36d2e7","updated":"2020-09-24 21:33:03.000000000","message":"Added 2nd periodic to handle this case \u0026 unit tests for it.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":823,"context_line":"            # mode, pending firmware updates do not automatically continue."},{"line_number":824,"context_line":"            if node.provision_state \u003d\u003d states.CLEANFAIL:"},{"line_number":825,"context_line":"                LOG.warning(\u0027Node is in maintenance mode and an error has \u0027"},{"line_number":826,"context_line":"                            \u0027occurred.  Discarding remaining firmware updates \u0027"},{"line_number":827,"context_line":"                            \u0027for node %(node)s\u0027, {\u0027node\u0027: node.uuid})"},{"line_number":828,"context_line":"                self._clear_firmware_updates(node)"},{"line_number":829,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_722fa3a6","line":826,"range":{"start_line":826,"start_character":38,"end_line":826,"end_character":39},"updated":"2020-09-23 23:48:00.000000000","message":"nit: excess space :)","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":823,"context_line":"            # mode, pending firmware updates do not automatically continue."},{"line_number":824,"context_line":"            if node.provision_state \u003d\u003d states.CLEANFAIL:"},{"line_number":825,"context_line":"                LOG.warning(\u0027Node is in maintenance mode and an error has \u0027"},{"line_number":826,"context_line":"                            \u0027occurred.  Discarding remaining firmware updates \u0027"},{"line_number":827,"context_line":"                            \u0027for node %(node)s\u0027, {\u0027node\u0027: node.uuid})"},{"line_number":828,"context_line":"                self._clear_firmware_updates(node)"},{"line_number":829,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_6e5a1250","line":826,"range":{"start_line":826,"start_character":38,"end_line":826,"end_character":39},"in_reply_to":"9f560f44_722fa3a6","updated":"2020-09-24 21:33:03.000000000","message":"Done","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"68e8b7140c3ef8c315842fca77abd90984765a5b","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                LOG.warning(\u0027Node is in maintenance mode and an error has \u0027"},{"line_number":826,"context_line":"                            \u0027occurred.  Discarding remaining firmware updates \u0027"},{"line_number":827,"context_line":"                            \u0027for node %(node)s\u0027, {\u0027node\u0027: node.uuid})"},{"line_number":828,"context_line":"                self._clear_firmware_updates(node)"},{"line_number":829,"context_line":"            else:"},{"line_number":830,"context_line":"                LOG.debug(\u0027Firmware updates are paused on node %(node)s since \u0027"},{"line_number":831,"context_line":"                          \u0027it is in maintenance mode\u0027, {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_b20e5b3a","line":828,"updated":"2020-09-23 23:48:00.000000000","message":"Your getting here with a shared lock. If the other method doesn\u0027t make the lock exclusive, it likely needs to be done here. task.upgrade_lock if memory serves.","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"ca8767afa5da78c208bdac13bbcfd0003feaed53","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                LOG.warning(\u0027Node is in maintenance mode and an error has \u0027"},{"line_number":826,"context_line":"                            \u0027occurred.  Discarding remaining firmware updates \u0027"},{"line_number":827,"context_line":"                            \u0027for node %(node)s\u0027, {\u0027node\u0027: node.uuid})"},{"line_number":828,"context_line":"                self._clear_firmware_updates(node)"},{"line_number":829,"context_line":"            else:"},{"line_number":830,"context_line":"                LOG.debug(\u0027Firmware updates are paused on node %(node)s since \u0027"},{"line_number":831,"context_line":"                          \u0027it is in maintenance mode\u0027, {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_8769448d","line":828,"in_reply_to":"9f560f44_b20e5b3a","updated":"2020-09-24 21:33:03.000000000","message":"Taken care of with lock upgrade overhaul","commit_id":"f93b32d278966dc1130197103f248c4251c9efdc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a3e33617b159631e45556419a23239dc37eb3e1c","unresolved":false,"context_lines":[{"line_number":715,"context_line":"    def _apply_firmware_update(self, node, update_service, firmware_updates):"},{"line_number":716,"context_line":"        \"\"\"Applies the next firmware update to the node"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"           Note that the caller must have an exclusive lock on the node and"},{"line_number":719,"context_line":"           the caller must ensure node.save() is called after making this"},{"line_number":720,"context_line":"           call."},{"line_number":721,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_9b019907","line":718,"updated":"2020-09-24 23:20:59.000000000","message":"note: it would be good to have a full doc string on this.","commit_id":"d9bfc3c504552d5870a3583e762c66fdd9289a98"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"078511ee3c6fb45dddbeec98b86951867cf8243a","unresolved":false,"context_lines":[{"line_number":715,"context_line":"    def _apply_firmware_update(self, node, update_service, firmware_updates):"},{"line_number":716,"context_line":"        \"\"\"Applies the next firmware update to the node"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"           Note that the caller must have an exclusive lock on the node and"},{"line_number":719,"context_line":"           the caller must ensure node.save() is called after making this"},{"line_number":720,"context_line":"           call."},{"line_number":721,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_5f46bf51","line":718,"in_reply_to":"9f560f44_9b019907","updated":"2020-09-25 17:42:42.000000000","message":"Done","commit_id":"d9bfc3c504552d5870a3583e762c66fdd9289a98"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a3e33617b159631e45556419a23239dc37eb3e1c","unresolved":false,"context_lines":[{"line_number":738,"context_line":"    def _continue_firmware_updates(self, task, update_service,"},{"line_number":739,"context_line":"                                   firmware_updates):"},{"line_number":740,"context_line":"        \"\"\"Continues processing the firmware updates"},{"line_number":741,"context_line":""},{"line_number":742,"context_line":"           Note that the caller must have an exclusive lock on the node."},{"line_number":743,"context_line":"        \"\"\""},{"line_number":744,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_db079116","line":741,"updated":"2020-09-24 23:20:59.000000000","message":"Same docstring comment as above.","commit_id":"d9bfc3c504552d5870a3583e762c66fdd9289a98"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"078511ee3c6fb45dddbeec98b86951867cf8243a","unresolved":false,"context_lines":[{"line_number":738,"context_line":"    def _continue_firmware_updates(self, task, update_service,"},{"line_number":739,"context_line":"                                   firmware_updates):"},{"line_number":740,"context_line":"        \"\"\"Continues processing the firmware updates"},{"line_number":741,"context_line":""},{"line_number":742,"context_line":"           Note that the caller must have an exclusive lock on the node."},{"line_number":743,"context_line":"        \"\"\""},{"line_number":744,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_1f40c734","line":741,"in_reply_to":"9f560f44_db079116","updated":"2020-09-25 17:42:42.000000000","message":"Done","commit_id":"d9bfc3c504552d5870a3583e762c66fdd9289a98"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a3e33617b159631e45556419a23239dc37eb3e1c","unresolved":false,"context_lines":[{"line_number":779,"context_line":""},{"line_number":780,"context_line":"    def _clear_firmware_updates(self, node):"},{"line_number":781,"context_line":"        \"\"\"Clears firmware updates from driver_internal_info"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"           Note that the caller must have an exclusive lock on the node."},{"line_number":784,"context_line":"        \"\"\""},{"line_number":785,"context_line":"        driver_internal_info \u003d node.driver_internal_info"}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_db20319d","line":782,"updated":"2020-09-24 23:20:59.000000000","message":"same docsring comment as above.","commit_id":"d9bfc3c504552d5870a3583e762c66fdd9289a98"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"078511ee3c6fb45dddbeec98b86951867cf8243a","unresolved":false,"context_lines":[{"line_number":779,"context_line":""},{"line_number":780,"context_line":"    def _clear_firmware_updates(self, node):"},{"line_number":781,"context_line":"        \"\"\"Clears firmware updates from driver_internal_info"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"           Note that the caller must have an exclusive lock on the node."},{"line_number":784,"context_line":"        \"\"\""},{"line_number":785,"context_line":"        driver_internal_info \u003d node.driver_internal_info"}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_ff3a33c1","line":782,"in_reply_to":"9f560f44_db20319d","updated":"2020-09-25 17:42:42.000000000","message":"Done","commit_id":"d9bfc3c504552d5870a3583e762c66fdd9289a98"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"852a389a05404c61105d879009aca4a931f0a7ac","unresolved":false,"context_lines":[{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        return deploy_utils.get_async_step_return_state(task.node)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def _apply_firmware_update(self, node, update_service, firmware_updates):"},{"line_number":716,"context_line":"        \"\"\"Applies the next firmware update to the node"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        Applies the first firmware update in the firmware_updates list to"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f560f44_e026f8cb","line":715,"range":{"start_line":715,"start_character":75,"end_line":715,"end_character":76},"updated":"2020-09-28 16:28:45.000000000","message":"As this list is shrinking, you named it _updates rather than _images?","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"d8e548bbccaa8f28a3ad8ef2b986c56ca5584fda","unresolved":false,"context_lines":[{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        return deploy_utils.get_async_step_return_state(task.node)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def _apply_firmware_update(self, node, update_service, firmware_updates):"},{"line_number":716,"context_line":"        \"\"\"Applies the next firmware update to the node"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        Applies the first firmware update in the firmware_updates list to"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f560f44_cc396b41","line":715,"range":{"start_line":715,"start_character":75,"end_line":715,"end_character":76},"in_reply_to":"9f560f44_717e386b","updated":"2020-09-28 19:55:10.000000000","message":"Yeah, this is what I meant: I was confused why _images are passed in and when I followed the list, they became _updates. No big deal :)","commit_id":"801234287853c760d11830750981a8930b1f4b49"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"82e675dc3d52631f4dd819fb3147ae5dc8c33028","unresolved":false,"context_lines":[{"line_number":712,"context_line":""},{"line_number":713,"context_line":"        return deploy_utils.get_async_step_return_state(task.node)"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def _apply_firmware_update(self, node, update_service, firmware_updates):"},{"line_number":716,"context_line":"        \"\"\"Applies the next firmware update to the node"},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"        Applies the first firmware update in the firmware_updates list to"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f560f44_717e386b","line":715,"range":{"start_line":715,"start_character":75,"end_line":715,"end_character":76},"in_reply_to":"9f560f44_e026f8cb","updated":"2020-09-28 19:14:12.000000000","message":"Hey Arne,\n\ncan you clarify your comment here? Since redfish has an UpdateService, I tried to stick with \"update\" everywhere. I think the only place I used \"images\" is in the update_firmware() method and that\u0027s because in my spec I used \"firmware_images\", in the cleaning step json, and I didn\u0027t want to deviate from that.","commit_id":"801234287853c760d11830750981a8930b1f4b49"}],"ironic/drivers/modules/redfish/utils.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":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        raise exception.RedfishError(error\u003de)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _get_connection(node, lambda_fun, *args):"},{"line_number":289,"context_line":"    \"\"\"Get a Redfish connection to a node."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    :param node: an Ironic node object"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f560f44_33cd7fb7","line":288,"updated":"2020-09-18 21:48:19.000000000","message":"I\u0027m a little concerned about the lambda usage. It is not typically used outside of our unit tests so need during runtime might be good to understand. I guess I\u0027m lacking that context.","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        raise exception.RedfishError(error\u003de)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _get_connection(node, lambda_fun, *args):"},{"line_number":289,"context_line":"    \"\"\"Get a Redfish connection to a node."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    :param node: an Ironic node object"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f560f44_87b88011","line":288,"in_reply_to":"9f560f44_33cd7fb7","updated":"2020-09-20 22:09:57.000000000","message":"The reason for using a lambda function is that retrying is built into _get_cached_connection(). Inside that method, we either need to call conn.get_update_service() for firmware update or conn.get_system() for retrieving the system object. As a result, a method needs to be passed into _get_cached_connection(). I chose to make it a lambda method for brevity, but I could define 2 more named methods that make the calls above and pass them in instead. Thoughts?","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _get_connection(node, lambda_fun, *args):"},{"line_number":289,"context_line":"    \"\"\"Get a Redfish connection to a node."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    :param node: an Ironic node object"},{"line_number":292,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_b8401ea4","line":289,"updated":"2020-09-22 15:59:11.000000000","message":"nit: needs updating","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"def _get_connection(node, lambda_fun, *args):"},{"line_number":289,"context_line":"    \"\"\"Get a Redfish connection to a node."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    :param node: an Ironic node object"},{"line_number":292,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_e7a4b3bb","line":289,"in_reply_to":"9f560f44_b8401ea4","updated":"2020-09-22 21:35:56.000000000","message":"Done","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3ec7548cfc8f5215401f33e3be11fbfc587d88b","unresolved":false,"context_lines":[{"line_number":288,"context_line":"def _get_connection(node, lambda_fun, *args):"},{"line_number":289,"context_line":"    \"\"\"Get a Redfish connection to a node."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    :param node: an Ironic node object"},{"line_number":292,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":293,"context_line":"    \"\"\""},{"line_number":294,"context_line":"    driver_info \u003d parse_driver_info(node)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_18130aba","line":291,"updated":"2020-09-22 15:59:11.000000000","message":"nit: document lambda_fun","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"8297c43a5689d2e21df8512f14396c5d5fb62e46","unresolved":false,"context_lines":[{"line_number":288,"context_line":"def _get_connection(node, lambda_fun, *args):"},{"line_number":289,"context_line":"    \"\"\"Get a Redfish connection to a node."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    :param node: an Ironic node object"},{"line_number":292,"context_line":"    :raises: RedfishConnectionError when it fails to connect to Redfish"},{"line_number":293,"context_line":"    \"\"\""},{"line_number":294,"context_line":"    driver_info \u003d parse_driver_info(node)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_e7bf93cd","line":291,"in_reply_to":"9f560f44_18130aba","updated":"2020-09-22 21:35:56.000000000","message":"Done","commit_id":"2c4362a9bdc484c5eea9d82be7f4eb705f1968b3"}],"releasenotes/notes/redfish-firmware-update-a06d0624325a66ca.yaml":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"7cbb0882a7ad87b9e9639c40e50bfdd1d1d4a8f5","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for performing firmware updates using the ``redfish``"},{"line_number":5,"context_line":"    hardware type."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9f560f44_f0a05d45","line":5,"updated":"2020-09-16 04:44:26.000000000","message":"This could probably be fleshed out a little because its a cool feature that we should draw attention to in our release notes :)","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"0ca36d97448b8ed4ade50a4c8b5e790d581b5843","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for performing firmware updates using the ``redfish``"},{"line_number":5,"context_line":"    hardware type."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9f560f44_7f9c115b","line":5,"in_reply_to":"9f560f44_f0a05d45","updated":"2020-09-16 22:47:56.000000000","message":"Done","commit_id":"94aee82af95285a9cdd8bc88964fe42ad1be4379"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for performing firmware updates using the ``redfish``"},{"line_number":5,"context_line":"    and ``idrac`` hardware types via a manual cleaning step."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    A new firmware update cleaning step has been added to the ``redfish``"},{"line_number":8,"context_line":"    hardware type. The ``idrac`` hardware type also automatically gains this"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_f3ff87fd","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":60},"updated":"2020-09-18 21:48:19.000000000","message":"This may be excess, in just thinking from the operator context this is manual for all hardware types. The only time it is not is when someone builds their own hardware manager.","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for performing firmware updates using the ``redfish``"},{"line_number":5,"context_line":"    and ``idrac`` hardware types via a manual cleaning step."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    A new firmware update cleaning step has been added to the ``redfish``"},{"line_number":8,"context_line":"    hardware type. The ``idrac`` hardware type also automatically gains this"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_586bf0ef","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":60},"updated":"2020-09-18 21:48:19.000000000","message":"nit: this may be excess detail, kind of implied as manual everywhere else.","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for performing firmware updates using the ``redfish``"},{"line_number":5,"context_line":"    and ``idrac`` hardware types via a manual cleaning step."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    A new firmware update cleaning step has been added to the ``redfish``"},{"line_number":8,"context_line":"    hardware type. The ``idrac`` hardware type also automatically gains this"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_0723d0a8","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":60},"in_reply_to":"9f560f44_586bf0ef","updated":"2020-09-20 22:09:57.000000000","message":"Done","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for performing firmware updates using the ``redfish``"},{"line_number":5,"context_line":"    and ``idrac`` hardware types via a manual cleaning step."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    A new firmware update cleaning step has been added to the ``redfish``"},{"line_number":8,"context_line":"    hardware type. The ``idrac`` hardware type also automatically gains this"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_6739ecd6","line":5,"range":{"start_line":5,"start_character":32,"end_line":5,"end_character":60},"in_reply_to":"9f560f44_f3ff87fd","updated":"2020-09-20 22:09:57.000000000","message":"Done","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    A new firmware update cleaning step has been added to the ``redfish``"},{"line_number":8,"context_line":"    hardware type. The ``idrac`` hardware type also automatically gains this"},{"line_number":9,"context_line":"    capability through inheritance. The firmware update cleaning step allows"},{"line_number":10,"context_line":"    one or more firmware updates to be applied to a node. If multiple updates"},{"line_number":11,"context_line":"    are specified, then they are applied sequentially in the order given. The"},{"line_number":12,"context_line":"    server is rebooted once per update. If a failure occurs, the cleaning step"},{"line_number":13,"context_line":"    immediately fails which may result in some updates not being applied. If"},{"line_number":14,"context_line":"    the node is placed into maintenance mode while a firmware update cleaning"},{"line_number":15,"context_line":"    step is running that is performing multiple firmware updates, the update in"},{"line_number":16,"context_line":"    progress will complete, and processing of the remaining updates will pause."},{"line_number":17,"context_line":"    When the node is taken out of maintenance mode, processing of the"},{"line_number":18,"context_line":"    remaining updates will resume."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    When updating the BMC firmware, the BMC may become unavailable for a period"},{"line_number":21,"context_line":"    of time as it resets. An optional ``sleep`` argument may be specified in"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_b3150f40","line":18,"range":{"start_line":9,"start_character":36,"end_line":18,"end_character":34},"updated":"2020-09-18 21:48:19.000000000","message":"This seems most suitable for formal documentation and not a release note that will be scanned for people to conceptually understand that a feature or bug has been fixed.","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    A new firmware update cleaning step has been added to the ``redfish``"},{"line_number":8,"context_line":"    hardware type. The ``idrac`` hardware type also automatically gains this"},{"line_number":9,"context_line":"    capability through inheritance. The firmware update cleaning step allows"},{"line_number":10,"context_line":"    one or more firmware updates to be applied to a node. If multiple updates"},{"line_number":11,"context_line":"    are specified, then they are applied sequentially in the order given. The"},{"line_number":12,"context_line":"    server is rebooted once per update. If a failure occurs, the cleaning step"},{"line_number":13,"context_line":"    immediately fails which may result in some updates not being applied. If"},{"line_number":14,"context_line":"    the node is placed into maintenance mode while a firmware update cleaning"},{"line_number":15,"context_line":"    step is running that is performing multiple firmware updates, the update in"},{"line_number":16,"context_line":"    progress will complete, and processing of the remaining updates will pause."},{"line_number":17,"context_line":"    When the node is taken out of maintenance mode, processing of the"},{"line_number":18,"context_line":"    remaining updates will resume."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    When updating the BMC firmware, the BMC may become unavailable for a period"},{"line_number":21,"context_line":"    of time as it resets. An optional ``sleep`` argument may be specified in"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_c728b886","line":18,"range":{"start_line":9,"start_character":36,"end_line":18,"end_character":34},"in_reply_to":"9f560f44_b3150f40","updated":"2020-09-20 22:09:57.000000000","message":"Done","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d4f2291d314565f406ee8cde29734ac3bb6e6710","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    When the node is taken out of maintenance mode, processing of the"},{"line_number":18,"context_line":"    remaining updates will resume."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    When updating the BMC firmware, the BMC may become unavailable for a period"},{"line_number":21,"context_line":"    of time as it resets. An optional ``sleep`` argument may be specified in"},{"line_number":22,"context_line":"    each firmware image dictionary indicating the amount of time to sleep in"},{"line_number":23,"context_line":"    seconds after the firmware update has completed and before indicating"},{"line_number":24,"context_line":"    success of the update. This allows the BMC time to come back up following"},{"line_number":25,"context_line":"    a firmware update."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_13267bbb","line":25,"range":{"start_line":20,"start_character":0,"end_line":25,"end_character":22},"updated":"2020-09-18 21:48:19.000000000","message":"Also documentation oriented...","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"},{"author":{"_account_id":10250,"name":"Christopher Dearborn","email":"Christopher.Dearborn@dell.com","username":"cdearbor"},"change_message_id":"b55dc6f8292beb28c646babbd43cbc1947c5840a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    When the node is taken out of maintenance mode, processing of the"},{"line_number":18,"context_line":"    remaining updates will resume."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    When updating the BMC firmware, the BMC may become unavailable for a period"},{"line_number":21,"context_line":"    of time as it resets. An optional ``sleep`` argument may be specified in"},{"line_number":22,"context_line":"    each firmware image dictionary indicating the amount of time to sleep in"},{"line_number":23,"context_line":"    seconds after the firmware update has completed and before indicating"},{"line_number":24,"context_line":"    success of the update. This allows the BMC time to come back up following"},{"line_number":25,"context_line":"    a firmware update."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9f560f44_2720949b","line":25,"range":{"start_line":20,"start_character":0,"end_line":25,"end_character":22},"in_reply_to":"9f560f44_13267bbb","updated":"2020-09-20 22:09:57.000000000","message":"Done","commit_id":"9842ff5ce40ce6dca02af25aa7778a6e5d4619c6"}]}
