)]}'
{"/PATCHSET_LEVEL":[{"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":"f95794fd280a91baab9e98f6782d011c66e8af37","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f311f9e6_91e98a31","updated":"2025-12-17 18:21:32.000000000","message":"I don\u0027t fully understand this change, so limiting to +1. Happy to upgrade to a +2 with a sync review.","commit_id":"62aac13cf6472ca9b7212715a969dba311da49af"},{"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":"3d6e52693abecbce8ec194fb3c38e0c0eb27df4c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"25ead1f6_280493dc","updated":"2025-12-17 20:53:09.000000000","message":"My suggestion to add to this patch or do as a followup:\n- no longer allow rules yamls to be mutable\n- validate rules yamls at load time using a pattern like https://opendev.org/openstack/ironic/src/commit/1fecbce5155d43f5264efa0e9b5fc647208b8497/ironic/conf/types.py","commit_id":"62aac13cf6472ca9b7212715a969dba311da49af"},{"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":"1e5a54e22d15da4c9a33506e48f70463ff0b6d67","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"67d68837_d5451829","updated":"2025-12-17 20:50:16.000000000","message":"This is a bad enough bug we probably should\u0027ve documented it in launchpad, especially since you want it backported.","commit_id":"62aac13cf6472ca9b7212715a969dba311da49af"}],"ironic/common/inspection_rules/engine.py":[{"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":"71db3b438878a8bdf08ce9c811e9c19ae579c9e5","unresolved":true,"context_lines":[{"line_number":27,"context_line":"SENSITIVE_FIELDS \u003d [\u0027password\u0027, \u0027auth_token\u0027, \u0027bmc_password\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_built_in_rules(rules_file\u003dNone):"},{"line_number":31,"context_line":"    \"\"\"Load built-in inspection rules.\"\"\""},{"line_number":32,"context_line":"    built_in_rules \u003d []"},{"line_number":33,"context_line":"    if rules_file:"}],"source_content_type":"text/x-python","patch_set":1,"id":"daaef3d7_34e8c014","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":40},"updated":"2025-12-17 08:56:28.000000000","message":"So, this is more or less adding support for supplying an inspection rules file, not just via configs?","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"63ce4d7af318712a66d4946e33aa65c981975902","unresolved":false,"context_lines":[{"line_number":27,"context_line":"SENSITIVE_FIELDS \u003d [\u0027password\u0027, \u0027auth_token\u0027, \u0027bmc_password\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_built_in_rules(rules_file\u003dNone):"},{"line_number":31,"context_line":"    \"\"\"Load built-in inspection rules.\"\"\""},{"line_number":32,"context_line":"    built_in_rules \u003d []"},{"line_number":33,"context_line":"    if rules_file:"}],"source_content_type":"text/x-python","patch_set":1,"id":"87b25c7f_d7c15d9d","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":40},"in_reply_to":"1beb52d5_164cf119","updated":"2025-12-17 16:25:52.000000000","message":"Done","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f246ca3472d96d44610261d512ffdc0774167861","unresolved":true,"context_lines":[{"line_number":27,"context_line":"SENSITIVE_FIELDS \u003d [\u0027password\u0027, \u0027auth_token\u0027, \u0027bmc_password\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def get_built_in_rules(rules_file\u003dNone):"},{"line_number":31,"context_line":"    \"\"\"Load built-in inspection rules.\"\"\""},{"line_number":32,"context_line":"    built_in_rules \u003d []"},{"line_number":33,"context_line":"    if rules_file:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1beb52d5_164cf119","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":40},"in_reply_to":"daaef3d7_34e8c014","updated":"2025-12-17 13:15:16.000000000","message":"Yeah. I’m using that with my CLI helper for testing rules which is to come.","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"},{"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":"71db3b438878a8bdf08ce9c811e9c19ae579c9e5","unresolved":true,"context_lines":[{"line_number":43,"context_line":"            rules_data \u003d yaml.safe_load(f)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        if not isinstance(rules_data, list):"},{"line_number":46,"context_line":"            msg \u003d (_(\"Built-in rules file (%s) is not a list of rules\") %"},{"line_number":47,"context_line":"                  built_in_rules_file)"},{"line_number":48,"context_line":"            LOG.error(msg)"},{"line_number":49,"context_line":"            raise exception.IronicException(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"0abe38c1_382b07ff","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":73},"updated":"2025-12-17 08:56:28.000000000","message":"Awkward wording? Maybe, \"...does not/should contain a list of rules\".","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"63ce4d7af318712a66d4946e33aa65c981975902","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            rules_data \u003d yaml.safe_load(f)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        if not isinstance(rules_data, list):"},{"line_number":46,"context_line":"            msg \u003d (_(\"Built-in rules file (%s) is not a list of rules\") %"},{"line_number":47,"context_line":"                  built_in_rules_file)"},{"line_number":48,"context_line":"            LOG.error(msg)"},{"line_number":49,"context_line":"            raise exception.IronicException(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"76051570_392d4e3c","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":73},"in_reply_to":"0abe38c1_382b07ff","updated":"2025-12-17 16:25:52.000000000","message":"Done","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"}],"ironic/common/inspection_rules/validation.py":[{"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":"71db3b438878a8bdf08ce9c811e9c19ae579c9e5","unresolved":true,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# TODO(stephenfin): Everything here can and should be moved to the jsonschema"},{"line_number":30,"context_line":"# schemas, but doing so will change responses."},{"line_number":31,"context_line":"def validate_rule(rule, built_in\u003dFalse):"},{"line_number":32,"context_line":"    \"\"\"Validate an inspection rule using the JSON schema."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :param rule: The inspection rule to validate."}],"source_content_type":"text/x-python","patch_set":1,"id":"3ace130f_9da03c81","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":40},"updated":"2025-12-17 08:56:28.000000000","message":"Update docstring.","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"63ce4d7af318712a66d4946e33aa65c981975902","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# TODO(stephenfin): Everything here can and should be moved to the jsonschema"},{"line_number":30,"context_line":"# schemas, but doing so will change responses."},{"line_number":31,"context_line":"def validate_rule(rule, built_in\u003dFalse):"},{"line_number":32,"context_line":"    \"\"\"Validate an inspection rule using the JSON schema."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :param rule: The inspection rule to validate."}],"source_content_type":"text/x-python","patch_set":1,"id":"451f40e9_b029cba9","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":40},"in_reply_to":"3ace130f_9da03c81","updated":"2025-12-17 16:25:52.000000000","message":"Done","commit_id":"b06f982e15000ecf337d0a32656f527d300d7f6e"}]}
