)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed61a6f02282e8098f1063e36dfc6cfb977125d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"29a1229d_d1cf63b9","updated":"2025-06-26 21:15:05.000000000","message":"This would be a *fantastic* opportunity to add some JSON Schema schemas for at least the requests, if you were interested. I would be happy to advise... 😉","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"c428cbf694d4eac5c8b784c123d68b3e64c24009","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ab991df5_30e7d859","in_reply_to":"29a1229d_d1cf63b9","updated":"2025-06-27 05:54:05.000000000","message":"I’m always open to advice :)","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"407b0193623bd58ce1d6be6fedd93ce496348c42","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c5518df9_a15f0aa4","updated":"2025-06-27 15:05:46.000000000","message":"I\u0027m good with this. My ONLY ask would be to add a release note with a bugfix section.","commit_id":"c58326c1438dd6062950e60eb525b2a8aeb554c4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9dd7c159f08b46fafc6e6c3b48f730231be88b6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a8988712_b7de23ed","updated":"2025-07-07 16:37:06.000000000","message":"Could you fix a small issue in the release note (inline) and also add unit tests that show the fixed behavior?","commit_id":"8e3b0c8b4a0b5b999591310416876be50f7be832"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"7f275fa3fc0489b6ba893f0c362eeee20a73ce38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"219befa1_de324e4d","updated":"2025-07-29 12:02:43.000000000","message":"recheck","commit_id":"38b15996c575b0c977c3e53c06e1408cb0f4a988"}],"ironic/common/inspection_rules/actions.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed61a6f02282e8098f1063e36dfc6cfb977125d7","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def get_action(op_name):"},{"line_number":46,"context_line":"    \"\"\"Get operator class by name.\"\"\""},{"line_number":47,"context_line":"    try:"},{"line_number":48,"context_line":"        class_name \u003d ACTIONS[op_name]"},{"line_number":49,"context_line":"        return globals()[class_name]"},{"line_number":50,"context_line":"    except KeyError:"},{"line_number":51,"context_line":"        raise exception.Invalid("},{"line_number":52,"context_line":"            _(\"Unsupported action \u0027%s\u0027.\") % op_name"},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def update_nested_dict(d, key_path, value):"}],"source_content_type":"text/x-python","patch_set":2,"id":"e47ffcdf_939a89f6","line":53,"range":{"start_line":47,"start_character":0,"end_line":53,"end_character":9},"updated":"2025-06-26 21:15:05.000000000","message":"I know EAFFTP is the Python philosophy, but\n\n```suggestion\n    if \u0027op_name\u0027 not in ACTIONS:\n        raise exception.Invalid(\n            _(\"Unsupported action \u0027%s\u0027.\") % op_name\n        )\n\n    class_name \u003d ACTIONS[op_name]\n    return globals()[class_name]\n```","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b15cbc59a7caecedb820a0ca08514782e9bf1261","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def get_action(op_name):"},{"line_number":46,"context_line":"    \"\"\"Get operator class by name.\"\"\""},{"line_number":47,"context_line":"    try:"},{"line_number":48,"context_line":"        class_name \u003d ACTIONS[op_name]"},{"line_number":49,"context_line":"        return globals()[class_name]"},{"line_number":50,"context_line":"    except KeyError:"},{"line_number":51,"context_line":"        raise exception.Invalid("},{"line_number":52,"context_line":"            _(\"Unsupported action \u0027%s\u0027.\") % op_name"},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def update_nested_dict(d, key_path, value):"}],"source_content_type":"text/x-python","patch_set":2,"id":"cb6a2c98_e0c5c2e3","line":53,"range":{"start_line":47,"start_character":0,"end_line":53,"end_character":9},"in_reply_to":"bb206541_5fe11d72","updated":"2025-06-27 13:36:57.000000000","message":"I think it reads better this way ;)","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1fcb971f02e97c178900742f11cefa6b30222374","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def get_action(op_name):"},{"line_number":46,"context_line":"    \"\"\"Get operator class by name.\"\"\""},{"line_number":47,"context_line":"    try:"},{"line_number":48,"context_line":"        class_name \u003d ACTIONS[op_name]"},{"line_number":49,"context_line":"        return globals()[class_name]"},{"line_number":50,"context_line":"    except KeyError:"},{"line_number":51,"context_line":"        raise exception.Invalid("},{"line_number":52,"context_line":"            _(\"Unsupported action \u0027%s\u0027.\") % op_name"},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def update_nested_dict(d, key_path, value):"}],"source_content_type":"text/x-python","patch_set":2,"id":"97e4d468_38ca1ce0","line":53,"range":{"start_line":47,"start_character":0,"end_line":53,"end_character":9},"in_reply_to":"cb6a2c98_e0c5c2e3","updated":"2025-07-28 17:09:26.000000000","message":"Acknowledged","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"c428cbf694d4eac5c8b784c123d68b3e64c24009","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def get_action(op_name):"},{"line_number":46,"context_line":"    \"\"\"Get operator class by name.\"\"\""},{"line_number":47,"context_line":"    try:"},{"line_number":48,"context_line":"        class_name \u003d ACTIONS[op_name]"},{"line_number":49,"context_line":"        return globals()[class_name]"},{"line_number":50,"context_line":"    except KeyError:"},{"line_number":51,"context_line":"        raise exception.Invalid("},{"line_number":52,"context_line":"            _(\"Unsupported action \u0027%s\u0027.\") % op_name"},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def update_nested_dict(d, key_path, value):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb206541_5fe11d72","line":53,"range":{"start_line":47,"start_character":0,"end_line":53,"end_character":9},"in_reply_to":"e47ffcdf_939a89f6","updated":"2025-06-27 05:54:05.000000000","message":"Yep, LBYL works even better :)","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9dd7c159f08b46fafc6e6c3b48f730231be88b6c","unresolved":true,"context_lines":[{"line_number":48,"context_line":"        raise exception.Invalid("},{"line_number":49,"context_line":"            _(\"Unsupported action \u0027%s\u0027.\") % op_name"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"    class_name \u003d ACTIONS[op_name]"},{"line_number":52,"context_line":"    return globals()[class_name]"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"39847d6b_d3b0debb","line":51,"updated":"2025-07-07 16:37:06.000000000","message":"I like the KeyError variant better, but okay :)","commit_id":"8e3b0c8b4a0b5b999591310416876be50f7be832"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1fcb971f02e97c178900742f11cefa6b30222374","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        raise exception.Invalid("},{"line_number":49,"context_line":"            _(\"Unsupported action \u0027%s\u0027.\") % op_name"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"    class_name \u003d ACTIONS[op_name]"},{"line_number":52,"context_line":"    return globals()[class_name]"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"230e56ca_4209a277","line":51,"in_reply_to":"39847d6b_d3b0debb","updated":"2025-07-28 17:09:26.000000000","message":"Acknowledged","commit_id":"8e3b0c8b4a0b5b999591310416876be50f7be832"}],"ironic/common/inspection_rules/operators.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed61a6f02282e8098f1063e36dfc6cfb977125d7","unresolved":true,"context_lines":[{"line_number":47,"context_line":"    except KeyError:"},{"line_number":48,"context_line":"        raise exception.Invalid("},{"line_number":49,"context_line":"            _(\"Unsupported operator \u0027%s\u0027.\") % op_name"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class OperatorBase(base.Base, metaclass\u003dabc.ABCMeta):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5e20627e_9ed1c7ee","line":50,"updated":"2025-06-26 21:15:05.000000000","message":"As with the previous file","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"c428cbf694d4eac5c8b784c123d68b3e64c24009","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    except KeyError:"},{"line_number":48,"context_line":"        raise exception.Invalid("},{"line_number":49,"context_line":"            _(\"Unsupported operator \u0027%s\u0027.\") % op_name"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class OperatorBase(base.Base, metaclass\u003dabc.ABCMeta):"}],"source_content_type":"text/x-python","patch_set":2,"id":"4663d731_d9958fad","line":50,"in_reply_to":"5e20627e_9ed1c7ee","updated":"2025-06-27 05:54:05.000000000","message":"Acknowledged","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ed61a6f02282e8098f1063e36dfc6cfb977125d7","unresolved":true,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class NeOperator(SimpleOperator):"},{"line_number":162,"context_line":"    op \u003d operator.ne"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class EqOperator(SimpleOperator):"}],"source_content_type":"text/x-python","patch_set":2,"id":"e5058e64_a06d11d6","line":162,"updated":"2025-06-26 21:15:05.000000000","message":"Doesn\u0027t this necessitate an API microversion?","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b15cbc59a7caecedb820a0ca08514782e9bf1261","unresolved":true,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class NeOperator(SimpleOperator):"},{"line_number":162,"context_line":"    op \u003d operator.ne"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class EqOperator(SimpleOperator):"}],"source_content_type":"text/x-python","patch_set":2,"id":"d96f8be1_1bae905b","line":162,"in_reply_to":"5f8af900_44d6459d","updated":"2025-06-27 13:36:57.000000000","message":"I view it as a bugfix, since its sort of reasonable that these are there based on prior patterns given we also have less than, and equal to as well as greater than operators.","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"9ab2b9ce55122eacce49d2277cbb7f4793d64728","unresolved":true,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class NeOperator(SimpleOperator):"},{"line_number":162,"context_line":"    op \u003d operator.ne"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class EqOperator(SimpleOperator):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f8af900_44d6459d","line":162,"in_reply_to":"8e084c1b_3ad829b6","updated":"2025-06-27 06:39:34.000000000","message":"I guess we’ll leave this up for consensus.\n\nWe can always split it: drop the new operator classes for now and keep the validation fixes as a backportable bugfix.","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"0826d9e69b50de7dbeabfd2e9d65a07574c1de24","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class NeOperator(SimpleOperator):"},{"line_number":162,"context_line":"    op \u003d operator.ne"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class EqOperator(SimpleOperator):"}],"source_content_type":"text/x-python","patch_set":2,"id":"2fd60e16_55f90016","line":162,"in_reply_to":"d96f8be1_1bae905b","updated":"2025-07-28 17:11:24.000000000","message":"Acknowledged","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"c428cbf694d4eac5c8b784c123d68b3e64c24009","unresolved":true,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class NeOperator(SimpleOperator):"},{"line_number":162,"context_line":"    op \u003d operator.ne"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class EqOperator(SimpleOperator):"}],"source_content_type":"text/x-python","patch_set":2,"id":"8e084c1b_3ad829b6","line":162,"in_reply_to":"e5058e64_a06d11d6","updated":"2025-06-27 05:54:05.000000000","message":"I\u0027m thinking this is more or less a bugfix, so a microversion bump may not be necessary, but it\u0027s a backport candidate for the Epoxy release","commit_id":"b339a41b43647360b9b3788329ea54b94a34b329"}],"releasenotes/notes/fixes-inspection-rules-schema-validation-5cac6058d12ce030.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9dd7c159f08b46fafc6e6c3b48f730231be88b6c","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Fixes schema validation by raising formatting and schema errors"},{"line_number":5,"context_line":"    early during inspection rule creation, updates and execution,"},{"line_number":6,"context_line":"    plus support for standard comparison operators (`le`, `ge`, `ne`)"},{"line_number":7,"context_line":"    to expand rule capabilities."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"e6e5bcef_26d8356e","line":7,"updated":"2025-07-07 16:37:06.000000000","message":"Let us split these into two separate items, they\u0027re only vaguely related","commit_id":"8e3b0c8b4a0b5b999591310416876be50f7be832"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1fcb971f02e97c178900742f11cefa6b30222374","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Fixes schema validation by raising formatting and schema errors"},{"line_number":5,"context_line":"    early during inspection rule creation, updates and execution,"},{"line_number":6,"context_line":"    plus support for standard comparison operators (`le`, `ge`, `ne`)"},{"line_number":7,"context_line":"    to expand rule capabilities."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"25c20c18_420e426d","line":7,"in_reply_to":"e6e5bcef_26d8356e","updated":"2025-07-28 17:09:26.000000000","message":"Acknowledged","commit_id":"8e3b0c8b4a0b5b999591310416876be50f7be832"}]}
