)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"c3083259e471d61d9e2619c4d0052fc55b90b0eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3d90ab46_a8ef1986","updated":"2026-03-10 12:44:16.000000000","message":"Thank you for the patch, Konstantinos. It looks good overall. I\u0027d like to ask for a couple follow-ups:\n\n1) please add unit tests (e.g. all-match/skip, mismatch/proceed, pending-attributes-exist/proceed, and SushyError on pending_attributes)\n2) please add release note\n\n\nIn addition to this one comment inline.","commit_id":"22078772b333e94d37d7fa1483f0696db4d5ea0b"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"356b41b3f0b3e07c42e64d91e123a2bbde728a2c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"73f54e6e_dafc1654","updated":"2026-03-11 05:26:43.000000000","message":"Thank you Konstantinos, LGTM.","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"2cbf4c5997c5116bccee26300032354a7b80334c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cdee4d6e_738da46f","updated":"2026-03-11 11:04:42.000000000","message":"chained the patch on top of the other related two","commit_id":"2256f59c342ee43bd39e83091f5a1ba550c7ba9e"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"f1666f0aad625ca769fe77b38e351c3729b97cc6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"7e8718b5_8ce30359","updated":"2026-03-12 05:39:33.000000000","message":"rebased on top of the previous patch (relationship was lost in the last update)","commit_id":"882a63d7ad1b733ecf299e4e10309253c4ee2573"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"09087f12c3d04394ab5fb130f883ab561ddc6fb1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"53fcea8b_49c8b934","updated":"2026-03-13 00:23:34.000000000","message":"removing +1 till we figure out https://review.opendev.org/c/openstack/ironic/+/979828/comment/be67e48e_92311c3c/","commit_id":"882a63d7ad1b733ecf299e4e10309253c4ee2573"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"4b1e71293ef28291ac2c1e82c5c2d5820756dc89","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"59d09981_d199751c","updated":"2026-03-17 06:02:27.000000000","message":"Thank you Konstantin, noted explanation, LGTM.","commit_id":"961605a9c80226326ad1d2355f9f93e59af9091e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"16b8085d2e508b0808e99fe6f129b780c09a8477","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3d127008_6565de8c","updated":"2026-03-17 15:36:36.000000000","message":"I pushed a patchset just to maintain the patch link w/janders patch when I updated it.","commit_id":"8c65d5f9a3c3ad166df087bdb82bbb5a2db5bd61"}],"ironic/drivers/modules/redfish/bios.py":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"daf09e407f3ecee7bf305806fd201a42a91b4046","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                if name not in current_attrs:"},{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if str(current_attrs[name]) !\u003d str(value):"},{"line_number":237,"context_line":"                    all_match \u003d False"},{"line_number":238,"context_line":"                    break"},{"line_number":239,"context_line":"                if name in pending_attrs:"}],"source_content_type":"text/x-python","patch_set":1,"id":"cb289d2b_2982666f","line":236,"updated":"2026-03-10 12:48:12.000000000","message":"This uses str() coercion. There is a similar comparison in\n\nhttps://opendev.org/openstack/ironic/src/commit/674e56d9517a9c4c9e0606f676c7fe4f81a73159/ironic/drivers/modules/redfish/bios.py#L306\n\nWould it make sense to follow the same convention? This can prevent mismatches in case types differ","commit_id":"22078772b333e94d37d7fa1483f0696db4d5ea0b"},{"author":{"_account_id":38806,"name":"Konstantinos Karampogias","email":"kkarampo@redhat.com","username":"karampok","status":"Red Hat"},"change_message_id":"9e914d2c3cf2b3b51c3b95e276b5ddb792a54ad0","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                if name not in current_attrs:"},{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if str(current_attrs[name]) !\u003d str(value):"},{"line_number":237,"context_line":"                    all_match \u003d False"},{"line_number":238,"context_line":"                    break"},{"line_number":239,"context_line":"                if name in pending_attrs:"}],"source_content_type":"text/x-python","patch_set":1,"id":"34299294_210f9d38","line":236,"in_reply_to":"cb289d2b_2982666f","updated":"2026-03-16 09:13:52.000000000","message":"Done","commit_id":"22078772b333e94d37d7fa1483f0696db4d5ea0b"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"356b41b3f0b3e07c42e64d91e123a2bbde728a2c","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                if name not in current_attrs:"},{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if str(current_attrs[name]) !\u003d str(value):"},{"line_number":237,"context_line":"                    all_match \u003d False"},{"line_number":238,"context_line":"                    break"},{"line_number":239,"context_line":"                if name in pending_attrs:"}],"source_content_type":"text/x-python","patch_set":1,"id":"010a24cc_99dbbed6","line":236,"in_reply_to":"cb289d2b_2982666f","updated":"2026-03-11 05:26:43.000000000","message":"LTGM now, thank you.","commit_id":"22078772b333e94d37d7fa1483f0696db4d5ea0b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"50dda271d1fcaeec2c60012b95bfcc18e21382a9","unresolved":true,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not reboot_requested:"},{"line_number":219,"context_line":"            # Check if all requested settings already match the current"},{"line_number":220,"context_line":"            # BIOS values.  When a declarative caller (e.g. BMO) re-sends"},{"line_number":221,"context_line":"            # the same request after a successful apply, this avoids an"},{"line_number":222,"context_line":"            # unnecessary reboot cycle."},{"line_number":223,"context_line":"            current_attrs \u003d bios.attributes or {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9508ae90_70992900","line":220,"range":{"start_line":220,"start_character":60,"end_line":220,"end_character":63},"updated":"2026-03-11 13:57:10.000000000","message":"FWIW, we should be more detailed about what BMO is. I know what it is, but a brand new ironic contributor likely doesn\u0027t.","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"},{"author":{"_account_id":38806,"name":"Konstantinos Karampogias","email":"kkarampo@redhat.com","username":"karampok","status":"Red Hat"},"change_message_id":"9e914d2c3cf2b3b51c3b95e276b5ddb792a54ad0","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not reboot_requested:"},{"line_number":219,"context_line":"            # Check if all requested settings already match the current"},{"line_number":220,"context_line":"            # BIOS values.  When a declarative caller (e.g. BMO) re-sends"},{"line_number":221,"context_line":"            # the same request after a successful apply, this avoids an"},{"line_number":222,"context_line":"            # unnecessary reboot cycle."},{"line_number":223,"context_line":"            current_attrs \u003d bios.attributes or {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"b9ee4470_ceafcb1b","line":220,"range":{"start_line":220,"start_character":60,"end_line":220,"end_character":63},"in_reply_to":"9508ae90_70992900","updated":"2026-03-16 09:13:52.000000000","message":"that is fair point, I have remove both declarative and BMO as they do not add value. (declarive hints that those client will do call every X seconds until reconcile)","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"50dda271d1fcaeec2c60012b95bfcc18e21382a9","unresolved":true,"context_lines":[{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if name in pending_attrs:"},{"line_number":237,"context_line":"                    if pending_attrs[name] !\u003d value:"},{"line_number":238,"context_line":"                        # A conflicting pending change exists."},{"line_number":239,"context_line":"                        all_match \u003d False"},{"line_number":240,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":2,"id":"be67e48e_92311c3c","line":237,"updated":"2026-03-11 13:57:10.000000000","message":"So a thought here, should we go ahead an reboot anyway if the value is present *and* matches, because a pending value *should* only be in the list. That being said some vendors are misusing future pending fields so maybe not a great idea...","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"4b1e71293ef28291ac2c1e82c5c2d5820756dc89","unresolved":true,"context_lines":[{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if name in pending_attrs:"},{"line_number":237,"context_line":"                    if pending_attrs[name] !\u003d value:"},{"line_number":238,"context_line":"                        # A conflicting pending change exists."},{"line_number":239,"context_line":"                        all_match \u003d False"},{"line_number":240,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":2,"id":"54f7a9d6_aa785c1c","line":237,"in_reply_to":"48f22738_aa5c00d0","updated":"2026-03-17 06:02:27.000000000","message":"So the way I read the code is:\n\nwant\u003dX current\u003dX pending\u003dY \u003e reset pending, reboot\nwant\u003dX current\u003dX pending\u003dX \u003e all good, don\u0027t reboot\nwant\u003dX current\u003dY pending\u003dX \u003e reboot (current code will re-patch which should be fine; perhaps someone run PATCH by hand and didn\u0027t reboot? we don\u0027t want that to break the config)\nwant\u003dX current\u003dY pending\u003dY \u003e PATCH+reboot\n\nLGTM.\n\n@juliaashleykreger@gmail.com do you agree?","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"09087f12c3d04394ab5fb130f883ab561ddc6fb1","unresolved":true,"context_lines":[{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if name in pending_attrs:"},{"line_number":237,"context_line":"                    if pending_attrs[name] !\u003d value:"},{"line_number":238,"context_line":"                        # A conflicting pending change exists."},{"line_number":239,"context_line":"                        all_match \u003d False"},{"line_number":240,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":2,"id":"05a7ec05_e575ce68","line":237,"in_reply_to":"be67e48e_92311c3c","updated":"2026-03-13 00:23:34.000000000","message":"Fair point. @karampok@gmail.com:\n\n1) how does this work on the models you\u0027re testing on\n2) how much of a problem would it be if we defensively apply Julia\u0027s recommendation?","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"},{"author":{"_account_id":38806,"name":"Konstantinos Karampogias","email":"kkarampo@redhat.com","username":"karampok","status":"Red Hat"},"change_message_id":"9e914d2c3cf2b3b51c3b95e276b5ddb792a54ad0","unresolved":true,"context_lines":[{"line_number":234,"context_line":"                    all_match \u003d False"},{"line_number":235,"context_line":"                    break"},{"line_number":236,"context_line":"                if name in pending_attrs:"},{"line_number":237,"context_line":"                    if pending_attrs[name] !\u003d value:"},{"line_number":238,"context_line":"                        # A conflicting pending change exists."},{"line_number":239,"context_line":"                        all_match \u003d False"},{"line_number":240,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":2,"id":"48f22738_aa5c00d0","line":237,"in_reply_to":"be67e48e_92311c3c","updated":"2026-03-16 09:13:52.000000000","message":"If a pending value exists and matches the requested value, it means a previous apply_configuration call already PATCHed the BMC and triggered a\n  reboot. That reboot is responsible for promoting the pending value to current. Rebooting again for a matching pending value would be a wasted POST cycle (AFAIU)","commit_id":"8d2970d459b393a126dd9e96420b295ae5a895f5"}]}
