)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"764acc5be7c222c41fd52e0d829e7ef73930b253","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e46ada1c_fb19e42e","updated":"2025-01-29 15:08:35.000000000","message":"just some questions on required fields","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"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":"d34ab10ae73fd0ffd2b915c0e809df135ebd3bf8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"19de598b_6e21a040","updated":"2025-01-27 00:24:03.000000000","message":"recheck - paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 172.24.5.222","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"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":"e106f9d21a31fb0bb59318fceeeaa57f653fe8d3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"84d8c958_0002e21d","updated":"2025-02-07 18:06:46.000000000","message":"Looks like Dmitry\u0027s concerns were corrected.","commit_id":"bc09f7bdd345072e1d2b1471fdfa0aab351f2fe7"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":239,"context_line":"#   explanation of what changed in the new version"},{"line_number":240,"context_line":"# - common/release_mappings.py, RELEASE_MAPPING[\u0027master\u0027][\u0027api\u0027]"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"MINOR_MAX_VERSION \u003d MINOR_96_INSPECTION_RULES"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"# String representations of the minor and maximum versions"},{"line_number":245,"context_line":"_MIN_VERSION_STRING \u003d \u0027{}.{}\u0027.format(BASE_VERSION, MINOR_1_INITIAL_VERSION)"}],"source_content_type":"text/x-python","patch_set":8,"id":"63a89a41_13512708","line":242,"updated":"2025-02-04 16:58:59.000000000","message":"This change is unrelated to the database and should not be in this patch.","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"}],"ironic/db/sqlalchemy/alembic/versions/21c48150dea9_add_inspection_rules.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"764acc5be7c222c41fd52e0d829e7ef73930b253","unresolved":true,"context_lines":[{"line_number":30,"context_line":"def upgrade():"},{"line_number":31,"context_line":"    op.create_table("},{"line_number":32,"context_line":"        \u0027inspection_rules\u0027,"},{"line_number":33,"context_line":"        sa.Column(\u0027version\u0027, sa.String(length\u003d15), nullable\u003dTrue),"},{"line_number":34,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":35,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3bcf8d0c_1cddc48f","line":33,"updated":"2025-01-29 15:08:35.000000000","message":"should version be nullable or maybe just default to 1?","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b13a5597b3773b51799123246300a8ebd12866e0","unresolved":true,"context_lines":[{"line_number":30,"context_line":"def upgrade():"},{"line_number":31,"context_line":"    op.create_table("},{"line_number":32,"context_line":"        \u0027inspection_rules\u0027,"},{"line_number":33,"context_line":"        sa.Column(\u0027version\u0027, sa.String(length\u003d15), nullable\u003dTrue),"},{"line_number":34,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":35,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":7,"id":"f00a463b_082470df","line":33,"in_reply_to":"3bcf8d0c_1cddc48f","updated":"2025-01-29 15:23:17.000000000","message":"The field is nullable in other tables.","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"639651dfc4b4e2cf172ae465beaa922a702d41b5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"def upgrade():"},{"line_number":31,"context_line":"    op.create_table("},{"line_number":32,"context_line":"        \u0027inspection_rules\u0027,"},{"line_number":33,"context_line":"        sa.Column(\u0027version\u0027, sa.String(length\u003d15), nullable\u003dTrue),"},{"line_number":34,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":35,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":7,"id":"09d7c385_f6e2f20c","line":33,"in_reply_to":"f00a463b_082470df","updated":"2025-01-30 17:37:27.000000000","message":"Acknowledged","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"764acc5be7c222c41fd52e0d829e7ef73930b253","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        \u0027inspection_rules\u0027,"},{"line_number":33,"context_line":"        sa.Column(\u0027version\u0027, sa.String(length\u003d15), nullable\u003dTrue),"},{"line_number":34,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":35,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  autoincrement\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":7,"id":"d3493123_e31879a3","line":35,"updated":"2025-01-29 15:08:35.000000000","message":"should these dates be nullable?","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"639651dfc4b4e2cf172ae465beaa922a702d41b5","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \u0027inspection_rules\u0027,"},{"line_number":33,"context_line":"        sa.Column(\u0027version\u0027, sa.String(length\u003d15), nullable\u003dTrue),"},{"line_number":34,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":35,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  autoincrement\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a593ff2_0afc39c9","line":35,"in_reply_to":"9cce555d_a0276ad4","updated":"2025-01-30 17:37:27.000000000","message":"Acknowledged","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b13a5597b3773b51799123246300a8ebd12866e0","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        \u0027inspection_rules\u0027,"},{"line_number":33,"context_line":"        sa.Column(\u0027version\u0027, sa.String(length\u003d15), nullable\u003dTrue),"},{"line_number":34,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":35,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":36,"context_line":"        sa.Column(\u0027id\u0027, sa.Integer(), nullable\u003dFalse,"},{"line_number":37,"context_line":"                  autoincrement\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":7,"id":"9cce555d_a0276ad4","line":35,"in_reply_to":"d3493123_e31879a3","updated":"2025-01-29 15:23:17.000000000","message":"updated_at only makes *sense* to be nullable just after creation. After that point it is always updated..... I\u0027d mirror existing field modeling for updated_at fields which all support being nulled in the code base.\n\n\n $ grep updated_at *\n0ac0f39bc5aa_add_node_inventory_table.py:                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n163040c5513f_add_firmware_information.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n1a59178ebdf6_add_volume_targets_table.py:                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n21b331f883ef_add_provision_updated_at.py:\"\"\"Add provision_updated_at\n21b331f883ef_add_provision_updated_at.py:    op.add_column(\u0027nodes\u0027, sa.Column(\u0027provision_updated_at\u0027, sa.DateTime(),\n2353895ecfae_add_conductor_hardware_interfaces_table.py:                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n2581ebaf0cb2_initial_migration.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n2581ebaf0cb2_initial_migration.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n2581ebaf0cb2_initial_migration.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n2581ebaf0cb2_initial_migration.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n2aac7e0872f6_add_deploy_templates.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n2aac7e0872f6_add_deploy_templates.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n48d6c242bb9b_add_node_tags.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n5ea1b0d310e_added_port_group_table_and_altered_ports.py:                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n66bd9c5604d5_add_runbook_and_runbook_step.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n66bd9c5604d5_add_runbook_and_runbook_step.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n82c315d60161_add_bios_settings.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\n9ef41f07cb58_add_node_history_table.py:                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\nb4130a7fc904_create_nodetraits_table.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\ndaa1ba02d98_add_volume_connectors_table.py:                    sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),\ndd67b91a1981_add_allocations_table.py:        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"764acc5be7c222c41fd52e0d829e7ef73930b253","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"8061de3f_6a3d96a8","line":41,"updated":"2025-01-29 15:08:35.000000000","message":"aren’t there required scopes? so should it be an enum and not nullable?","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"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":"88f2d212fc0ca7f871d7bda98ebf4fe05c469efe","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"c8ad3a85_0d06f019","line":41,"in_reply_to":"121cfe35_8fff7a66","updated":"2025-01-29 16:22:53.000000000","message":"Well, according to the spec, the `default_scope` is \"the default value for scope for all rules where this field is not set\", which implies (1) the field could be None (2) a rule without a scope may not necessarily apply to all nodes, as I earlier stated.","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b13a5597b3773b51799123246300a8ebd12866e0","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"ae54ccca_bee9f4b9","line":41,"in_reply_to":"8061de3f_6a3d96a8","updated":"2025-01-29 15:23:17.000000000","message":"Is there any time you\u0027d want to be able to create a rule without scope?","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"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":"eef587a406c6d8f622dc3e01524f868c15c44209","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"121cfe35_8fff7a66","line":41,"in_reply_to":"ae54ccca_bee9f4b9","updated":"2025-01-29 16:12:07.000000000","message":"With this changeset, \u0027scope\u0027 is not required to create a rule, it\u0027s in the database to simplify migration. Later on, I believe that should still be the case since a rule without a scope applies to all nodes.","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"370451ddab30e37003ad81321d035516247d4220","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"279c2bf6_78a1e5f6","line":41,"in_reply_to":"c8ad3a85_0d06f019","updated":"2025-01-30 17:39:05.000000000","message":"Acknowledged","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b13a5597b3773b51799123246300a8ebd12866e0","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                  nullable\u003dFalse),"},{"line_number":48,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":49,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_inspection_rules0uuid\u0027),"},{"line_number":50,"context_line":"        sa.Index(\u0027inspection_rule_scope_idx\u0027, \u0027scope\u0027),"},{"line_number":51,"context_line":"        sa.Index(\u0027inspection_rule_phase_idx\u0027, \u0027phase\u0027),"},{"line_number":52,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":53,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"e8be3616_5086cef3","line":51,"range":{"start_line":50,"start_character":0,"end_line":51,"end_character":55},"updated":"2025-01-29 15:23:17.000000000","message":"I guess these are the two primary patterns this table is going to be queried with? Or maybe sorted by?!","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                  nullable\u003dFalse),"},{"line_number":48,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":49,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_inspection_rules0uuid\u0027),"},{"line_number":50,"context_line":"        sa.Index(\u0027inspection_rule_scope_idx\u0027, \u0027scope\u0027),"},{"line_number":51,"context_line":"        sa.Index(\u0027inspection_rule_phase_idx\u0027, \u0027phase\u0027),"},{"line_number":52,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":53,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"660f7133_5d4da182","line":51,"range":{"start_line":50,"start_character":0,"end_line":51,"end_character":55},"in_reply_to":"0aff9f9a_727e4da6","updated":"2025-02-04 16:58:59.000000000","message":"Phase is definitely going to be used in queries. Scope probably too. On the other hand, I\u0027m not sure anyone is going to have enough inspection rules for it to matter (famous last words, I know).","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ccfac18fb5cd83f9795cc19ec569b7d22d98f7a3","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                  nullable\u003dFalse),"},{"line_number":48,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":49,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_inspection_rules0uuid\u0027),"},{"line_number":50,"context_line":"        sa.Index(\u0027inspection_rule_scope_idx\u0027, \u0027scope\u0027),"},{"line_number":51,"context_line":"        sa.Index(\u0027inspection_rule_phase_idx\u0027, \u0027phase\u0027),"},{"line_number":52,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":53,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa00ddf3_f404143a","line":51,"range":{"start_line":50,"start_character":0,"end_line":51,"end_character":55},"in_reply_to":"660f7133_5d4da182","updated":"2025-02-07 21:55:36.000000000","message":"I\u0027ve seen a few with 20+ rules... but.... yeeeaaaah.\n\n\"Famous Last Words\" sounds like a beverage of some sort. :)","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"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":"eef587a406c6d8f622dc3e01524f868c15c44209","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                  nullable\u003dFalse),"},{"line_number":48,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":49,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_inspection_rules0uuid\u0027),"},{"line_number":50,"context_line":"        sa.Index(\u0027inspection_rule_scope_idx\u0027, \u0027scope\u0027),"},{"line_number":51,"context_line":"        sa.Index(\u0027inspection_rule_phase_idx\u0027, \u0027phase\u0027),"},{"line_number":52,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":53,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"0aff9f9a_727e4da6","line":51,"range":{"start_line":50,"start_character":0,"end_line":51,"end_character":55},"in_reply_to":"e8be3616_5086cef3","updated":"2025-01-29 16:12:07.000000000","message":"Yes. I\u0027m even thinking if \u0027scope\u0027 should be there, given the above.","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"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":"7a762bae351a644ce4547ec6471dfe8ca791c298","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":8,"id":"819d9cf8_f8a51820","line":41,"updated":"2025-01-30 19:27:36.000000000","message":"We need to figure out if scope is in or out. It\u0027s super weird to have it here and not at the object layer. This is the only hangup causing me not to +2 here.","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab07e58_5df3bec3","line":41,"in_reply_to":"636712f5_30d2e095","updated":"2025-02-04 16:58:59.000000000","message":"Scope is in the spec, so it\u0027s not terrible to have it here (but then do expose it in the object layer please).","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4002585fcde3588a69be51697e72e13bf6b652c","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027priority\u0027, sa.Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":40,"context_line":"        sa.Column(\u0027description\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":41,"context_line":"        sa.Column(\u0027scope\u0027, sa.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027sensitive\u0027, sa.Boolean(), default\u003dFalse),"},{"line_number":43,"context_line":"        sa.Column(\u0027phase\u0027, sa.String(16), nullable\u003dTrue),"},{"line_number":44,"context_line":"        sa.Column(\u0027conditions\u0027, types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":8,"id":"636712f5_30d2e095","line":41,"in_reply_to":"819d9cf8_f8a51820","updated":"2025-02-04 14:50:34.000000000","message":"Agreed. It is not like it is hard to add later...","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":3199,"context_line":"                raise exception.InspectionRuleNotFound("},{"line_number":3200,"context_line":"                    rule\u003drule_uuid)"},{"line_number":3201,"context_line":"            ref.update(values)"},{"line_number":3202,"context_line":"            session.flush()"},{"line_number":3203,"context_line":"        return ref"},{"line_number":3204,"context_line":""},{"line_number":3205,"context_line":"    def _get_inspection_rule(self, field, value):"}],"source_content_type":"text/x-python","patch_set":8,"id":"f95d5b7e_be154b0c","line":3202,"updated":"2025-02-04 16:58:59.000000000","message":"nit: flush() is not needed, it\u0027s done when the session is over after the \u0027with\u0027 block (it\u0027s different in create_inspection_rule where we want to catch the exception)","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":3225,"context_line":"        query \u003d (sa.select(models.InspectionRule))"},{"line_number":3226,"context_line":"        if filters is None:"},{"line_number":3227,"context_line":"            filters \u003d dict()"},{"line_number":3228,"context_line":"        unsupported_filters \u003d set(filters).difference([\u0027phase\u0027])"},{"line_number":3229,"context_line":"        if unsupported_filters:"},{"line_number":3230,"context_line":"            msg \u003d _(\"SqlAlchemy API does not support \""},{"line_number":3231,"context_line":"                    \"filtering by %s\") % \u0027, \u0027.join(unsupported_filters)"}],"source_content_type":"text/x-python","patch_set":8,"id":"c8d550fd_c46b15ad","line":3228,"updated":"2025-02-04 16:58:59.000000000","message":"nit: better move [\u0027phase\u0027] to a new constant for an easier update.\n\nAlso, if you don\u0027t support filtering by scope, you don\u0027t need an index for it (see the discussion in the alembic file).","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"}],"ironic/db/sqlalchemy/models.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"764acc5be7c222c41fd52e0d829e7ef73930b253","unresolved":true,"context_lines":[{"line_number":574,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":575,"context_line":"    priority \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":576,"context_line":"    description \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":577,"context_line":"    scope \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":578,"context_line":"    sensitive \u003d Column(Boolean, default\u003dFalse)"},{"line_number":579,"context_line":"    phase \u003d Column(String(16), nullable\u003dTrue, default\u003d\u0027main\u0027)"},{"line_number":580,"context_line":"    conditions \u003d Column(db_types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"5e3f2c8b_3f0419a7","line":577,"updated":"2025-01-29 15:08:35.000000000","message":"isn’t this needed and only certain values? so should it be required and an enum?","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b13a5597b3773b51799123246300a8ebd12866e0","unresolved":true,"context_lines":[{"line_number":574,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":575,"context_line":"    priority \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":576,"context_line":"    description \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":577,"context_line":"    scope \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":578,"context_line":"    sensitive \u003d Column(Boolean, default\u003dFalse)"},{"line_number":579,"context_line":"    phase \u003d Column(String(16), nullable\u003dTrue, default\u003d\u0027main\u0027)"},{"line_number":580,"context_line":"    conditions \u003d Column(db_types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"912d749d_19222e51","line":577,"in_reply_to":"5e3f2c8b_3f0419a7","updated":"2025-01-29 15:23:17.000000000","message":"Without having a clear understanding of the field, I personally don\u0027t know. That being said, if there ever could possibly be a different value, then an enum is a table upgrade to add a new.\n\nOn a plus side, enums are basically auto-indexed, but it all goes back to how the field actually gets leveraged.","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e8be2d6f7ddefe3d4367aaaf684a7b2187e245d8","unresolved":true,"context_lines":[{"line_number":574,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":575,"context_line":"    priority \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":576,"context_line":"    description \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":577,"context_line":"    scope \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":578,"context_line":"    sensitive \u003d Column(Boolean, default\u003dFalse)"},{"line_number":579,"context_line":"    phase \u003d Column(String(16), nullable\u003dTrue, default\u003d\u0027main\u0027)"},{"line_number":580,"context_line":"    conditions \u003d Column(db_types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"d3424b7d_0ee8f905","line":577,"in_reply_to":"912d749d_19222e51","updated":"2025-01-29 15:27:34.000000000","message":"Looking at the next path, its default value is None, meaning it has to be nullable under the current model, and I\u0027m unsure you can enum a null being the absence of any value in an enum data model.","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"370451ddab30e37003ad81321d035516247d4220","unresolved":false,"context_lines":[{"line_number":574,"context_line":"    uuid \u003d Column(String(36), nullable\u003dFalse)"},{"line_number":575,"context_line":"    priority \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":576,"context_line":"    description \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":577,"context_line":"    scope \u003d Column(String(255), nullable\u003dTrue)"},{"line_number":578,"context_line":"    sensitive \u003d Column(Boolean, default\u003dFalse)"},{"line_number":579,"context_line":"    phase \u003d Column(String(16), nullable\u003dTrue, default\u003d\u0027main\u0027)"},{"line_number":580,"context_line":"    conditions \u003d Column(db_types.JsonEncodedList(mysql_as_long\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":7,"id":"8a4e99dc_d5126f62","line":577,"in_reply_to":"d3424b7d_0ee8f905","updated":"2025-01-30 17:39:05.000000000","message":"Acknowledged","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"}],"ironic/objects/inspection_rule.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":"dca0a9a62a125de44f92a673c8ff74a50d549750","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        \u0027sensitive\u0027: object_fields.BooleanField(default\u003dFalse),"},{"line_number":33,"context_line":"        \u0027phase\u0027: object_fields.StringField(nullable\u003dTrue, default\u003d\u0027main\u0027),"},{"line_number":34,"context_line":"        \u0027actions\u0027: object_fields.ListOfFlexibleDictsField(nullable\u003dFalse),"},{"line_number":35,"context_line":"        \u0027conditions\u0027: object_fields.ListOfFlexibleDictsField(nullable\u003dTrue),"},{"line_number":36,"context_line":"    }"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    # NOTE(mgoddard): We don\u0027t want to enable RPC on this call just yet."}],"source_content_type":"text/x-python","patch_set":7,"id":"3bd384ac_f9557c3f","line":35,"updated":"2025-01-29 15:37:34.000000000","message":"So we have scope in the DB but not here?!\n\nI\u0027m not sure I understand...","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        \u0027sensitive\u0027: object_fields.BooleanField(default\u003dFalse),"},{"line_number":33,"context_line":"        \u0027phase\u0027: object_fields.StringField(nullable\u003dTrue, default\u003d\u0027main\u0027),"},{"line_number":34,"context_line":"        \u0027actions\u0027: object_fields.ListOfFlexibleDictsField(nullable\u003dFalse),"},{"line_number":35,"context_line":"        \u0027conditions\u0027: object_fields.ListOfFlexibleDictsField(nullable\u003dTrue),"},{"line_number":36,"context_line":"    }"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    # NOTE(mgoddard): We don\u0027t want to enable RPC on this call just yet."}],"source_content_type":"text/x-python","patch_set":7,"id":"a5ca605c_bf9deff1","line":35,"in_reply_to":"3bd384ac_f9557c3f","updated":"2025-02-04 16:58:59.000000000","message":"++ let\u0027s have these in sync","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"250a60dcd4de414914879544779fd85778f68777","unresolved":true,"context_lines":[{"line_number":92,"context_line":"        self.obj_reset_changes()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @classmethod"},{"line_number":95,"context_line":"    def destroy_all(cls):"},{"line_number":96,"context_line":"        \"\"\"Delete all rules from the DB.\"\"\""},{"line_number":97,"context_line":"        cls.dbapi.destroy_all_inspection_rules()"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"92706fdf_f004eb4d","line":95,"updated":"2025-02-04 16:58:59.000000000","message":"This is in the spec but I now have second thoughts about this feature. We don\u0027t have \"delete all\" for any other API resources, maybe we should not have it for inspection rules.\n\n(We can reopen this discussion in the API patch if you wish)","commit_id":"0a72fa80526f7ac7401009d2ffe01b9ad83848ad"}],"ironic/tests/unit/common/test_release_mappings.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":"b13a5597b3773b51799123246300a8ebd12866e0","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        # NodeBase is also excluded as it is covered by Node."},{"line_number":102,"context_line":"        exceptions \u003d set([\u0027NodeTag\u0027, \u0027ConductorHardwareInterfaces\u0027,"},{"line_number":103,"context_line":"                          \u0027NodeTrait\u0027, \u0027DeployTemplateStep\u0027, \u0027NodeBase\u0027,"},{"line_number":104,"context_line":"                          \u0027RunbookStep\u0027])"},{"line_number":105,"context_line":"        model_names -\u003d exceptions"},{"line_number":106,"context_line":"        # NodeTrait maps to two objects"},{"line_number":107,"context_line":"        model_names |\u003d set([\u0027Trait\u0027, \u0027TraitList\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"8aa8c782_accfd883","line":104,"updated":"2025-01-29 15:23:17.000000000","message":"nit: unrelated","commit_id":"d1b2be53cfbba97c20b369bc1c0782e5368a5a7b"}]}
