)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35929,"name":"Mahnoor Asghar","display_name":"Mahnoor Asghar","email":"masghar@redhat.com","username":"mahnoorasghar"},"change_message_id":"4bbdca74ad498e4aa21c5791e724e6c69076e6bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e3c822af_a808a162","updated":"2024-10-24 10:54:37.000000000","message":"Other than the comments and concern around exactly when we should call the pre and post hooks, this looks good!","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":35929,"name":"Mahnoor Asghar","display_name":"Mahnoor Asghar","email":"masghar@redhat.com","username":"mahnoorasghar"},"change_message_id":"2033324d7a5bf4e57eb687af1b57763df8a26cd5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b1a2940f_74e4685a","updated":"2024-10-24 10:59:42.000000000","message":"You may want to remove the reference to the ramdisk in the parameter descriptions for inventory and plugin_data in the preprocess and __call__ function descriptions: \nhttps://github.com/openstack/ironic/blob/1f740c8a90e1c9bcdd2fb7ee589a5b38d16f8e1e/ironic/drivers/modules/inspector/hooks/base.py#L39-L40","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"}],"ironic/conf/redfish.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"afc4a2c2b6d4897ad66eac717817f11586bdc4f5","unresolved":true,"context_lines":[{"line_number":121,"context_line":"               help\u003d_(\u0027Number of seconds to wait for boot mode or secure \u0027"},{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"a425d2d7_1c02d5f9","line":124,"updated":"2025-03-04 17:06:36.000000000","message":"nit: inspection_hooks probably (to match the term we use in the documentation)","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"39563e151b46aff7d14ae2506379d26a67722e70","unresolved":false,"context_lines":[{"line_number":121,"context_line":"               help\u003d_(\u0027Number of seconds to wait for boot mode or secure \u0027"},{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"ac90c815_8abba145","line":124,"in_reply_to":"a425d2d7_1c02d5f9","updated":"2025-07-21 20:18:21.000000000","message":"Done","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"afc4a2c2b6d4897ad66eac717817f11586bdc4f5","unresolved":true,"context_lines":[{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"},{"line_number":128,"context_line":"                      \u0027interface.\u0027)),"}],"source_content_type":"text/x-python","patch_set":10,"id":"a14b3b62_8301327f","line":125,"updated":"2025-03-04 17:06:36.000000000","message":"I assume you don\u0027t want to have default_hooks and use it here?\n\nThe reason I introduced this peculiar arrangement was to support append-only configurations. So, an admin could set `inspection_hooks \u003d $default_inspection_hooks,foo` without copying the default list (which may change later).","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"f1bb67952f539c583a2a7810d150c776deeccce6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"},{"line_number":128,"context_line":"                      \u0027interface.\u0027)),"}],"source_content_type":"text/x-python","patch_set":10,"id":"c2cdd160_3c1c654f","line":125,"in_reply_to":"2d49eb1d_34bc6b73","updated":"2025-07-30 20:12:46.000000000","message":"Done","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"6202df933e993b84b3f1a4d30faa74646c6c1454","unresolved":true,"context_lines":[{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"},{"line_number":128,"context_line":"                      \u0027interface.\u0027)),"}],"source_content_type":"text/x-python","patch_set":10,"id":"f7f184aa_b4ef85ee","line":125,"in_reply_to":"a14b3b62_8301327f","updated":"2025-03-07 02:54:38.000000000","message":"Maybe I don\u0027t understand the goal of it. Cause then why wouldn\u0027t we do the same for enabled interfaces by having a default?","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2a0f691825d9cbd9a2a8ee342b316034a4ead08b","unresolved":true,"context_lines":[{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"},{"line_number":128,"context_line":"                      \u0027interface.\u0027)),"}],"source_content_type":"text/x-python","patch_set":10,"id":"2d49eb1d_34bc6b73","line":125,"in_reply_to":"c770e156_f73ec2ca","updated":"2025-07-22 09:46:35.000000000","message":"Enabled interfaces depends very much on the hardware you have, it\u0027s not something we as upstream have a say in.\n\nThe goal of default_hooks was to make sure we can change the default hooks without having a reno saying \"you must update your hooks list or else\".\n\nI\u0027m not sure what you mean by \"inherit\". You can have one option refer to another, see how it\u0027s already done: https://opendev.org/openstack/ironic/src/commit/82122d6298c103c811d2fe6487800b473dd6e76f/ironic/conf/inspector.py#L88-L98","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"39563e151b46aff7d14ae2506379d26a67722e70","unresolved":true,"context_lines":[{"line_number":122,"context_line":"                      \u0027boot status change to take effect after a reboot. \u0027"},{"line_number":123,"context_line":"                      \u0027Set to 0 to disable waiting.\u0027)),"},{"line_number":124,"context_line":"    cfg.StrOpt(\u0027inspect_hooks\u0027,"},{"line_number":125,"context_line":"               default\u003d\u0027validate-interfaces,ports,architecture\u0027,"},{"line_number":126,"context_line":"               help\u003d_(\u0027Comma-separated list of enabled hooks for processing \u0027"},{"line_number":127,"context_line":"                      \u0027pipeline when using the \"redfish\" inspection \u0027"},{"line_number":128,"context_line":"                      \u0027interface.\u0027)),"}],"source_content_type":"text/x-python","patch_set":10,"id":"c770e156_f73ec2ca","line":125,"in_reply_to":"f7f184aa_b4ef85ee","updated":"2025-07-21 20:18:21.000000000","message":"Can I inherit from the main default_hooks so they\u0027re the same?","commit_id":"8ffd0088c4acda7df8a69d8e7813a903daeb4294"}],"ironic/drivers/modules/redfish/inspect.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6968f1d94d83e20de3f7567a0eed04fec50ca3bb","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self):"},{"line_number":62,"context_line":"        super().__init__()"},{"line_number":63,"context_line":"        self.hooks \u003d hooks_base.validate_inspection_hooks()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def get_properties(self):"},{"line_number":66,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":1,"id":"b418acce_2df0bb63","line":63,"updated":"2024-10-23 14:38:56.000000000","message":"I think we should have a different set of enabled hooks for different drivers. Some simply don\u0027t make sense for Redfish (extra-hardware or logs, for instance). So let\u0027s add an option like [redfish]inspection_hooks (and default_inspection_hooks).","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"43472581cbd9efd802afddbd06c067da3fea1bfe","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self):"},{"line_number":62,"context_line":"        super().__init__()"},{"line_number":63,"context_line":"        self.hooks \u003d hooks_base.validate_inspection_hooks()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def get_properties(self):"},{"line_number":66,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":1,"id":"cce78de9_185c4bec","line":63,"in_reply_to":"6fb889b9_13b55311","updated":"2025-01-26 21:37:34.000000000","message":"So I dislike having options spread between sections when they apply to the same thing. So I\u0027ve added \"redfish_hooks\" and \"redfish_default_hooks\". Honestly the whole \"default_hooks\" thing is weird to me. It\u0027s like we\u0027re trying to recommend people use those but if I don\u0027t want to there\u0027s two places to change. But besides the point, I could see renaming the existing ones to \"agent_hooks\" and \"agent_default_hooks\".","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":35929,"name":"Mahnoor Asghar","display_name":"Mahnoor Asghar","email":"masghar@redhat.com","username":"mahnoorasghar"},"change_message_id":"4bbdca74ad498e4aa21c5791e724e6c69076e6bd","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self):"},{"line_number":62,"context_line":"        super().__init__()"},{"line_number":63,"context_line":"        self.hooks \u003d hooks_base.validate_inspection_hooks()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def get_properties(self):"},{"line_number":66,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":1,"id":"6fb889b9_13b55311","line":63,"in_reply_to":"b418acce_2df0bb63","updated":"2024-10-24 10:54:37.000000000","message":"That does make sense.","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"39563e151b46aff7d14ae2506379d26a67722e70","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self):"},{"line_number":62,"context_line":"        super().__init__()"},{"line_number":63,"context_line":"        self.hooks \u003d hooks_base.validate_inspection_hooks()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def get_properties(self):"},{"line_number":66,"context_line":"        \"\"\"Return the properties of the interface."}],"source_content_type":"text/x-python","patch_set":1,"id":"37c7478c_b27d0dc0","line":63,"in_reply_to":"cce78de9_185c4bec","updated":"2025-07-21 20:18:21.000000000","message":"Done","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":35929,"name":"Mahnoor Asghar","display_name":"Mahnoor Asghar","email":"masghar@redhat.com","username":"mahnoorasghar"},"change_message_id":"4bbdca74ad498e4aa21c5791e724e6c69076e6bd","unresolved":true,"context_lines":[{"line_number":214,"context_line":"                                            inventory, None, task.context)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        plugin_data \u003d {}"},{"line_number":217,"context_line":"        hooks_base.run_preprocess_hooks(task, inventory, plugin_data,"},{"line_number":218,"context_line":"                                        self.hooks)"},{"line_number":219,"context_line":"        hooks_base.run_post_hooks(task, inventory, plugin_data, self.hooks)"},{"line_number":220,"context_line":"        return states.MANAGEABLE"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ca04229_3e40e6c6","line":217,"updated":"2024-10-24 10:54:37.000000000","message":"I think the preprocess hooks are to be called before ports are created.","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"39563e151b46aff7d14ae2506379d26a67722e70","unresolved":true,"context_lines":[{"line_number":214,"context_line":"                                            inventory, None, task.context)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        plugin_data \u003d {}"},{"line_number":217,"context_line":"        hooks_base.run_preprocess_hooks(task, inventory, plugin_data,"},{"line_number":218,"context_line":"                                        self.hooks)"},{"line_number":219,"context_line":"        hooks_base.run_post_hooks(task, inventory, plugin_data, self.hooks)"},{"line_number":220,"context_line":"        return states.MANAGEABLE"}],"source_content_type":"text/x-python","patch_set":1,"id":"930b0a13_16941d77","line":217,"in_reply_to":"01f54afd_e6408eca","updated":"2025-07-21 20:18:21.000000000","message":"They\u0027re not. preprocess_hooks are called in continue_inspection() which is called after the agent posts its payload back to the conductor while the ports are created in the inspect_hardware() call which is the call that sets up the agent to be booted.","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a3c73ae14f8844a0d16bf496ff31de264767da44","unresolved":true,"context_lines":[{"line_number":214,"context_line":"                                            inventory, None, task.context)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        plugin_data \u003d {}"},{"line_number":217,"context_line":"        hooks_base.run_preprocess_hooks(task, inventory, plugin_data,"},{"line_number":218,"context_line":"                                        self.hooks)"},{"line_number":219,"context_line":"        hooks_base.run_post_hooks(task, inventory, plugin_data, self.hooks)"},{"line_number":220,"context_line":"        return states.MANAGEABLE"}],"source_content_type":"text/x-python","patch_set":1,"id":"01f54afd_e6408eca","line":217,"in_reply_to":"5ca04229_3e40e6c6","updated":"2024-10-25 13:16:59.000000000","message":"Good catch. Furthermore, ports will be created as part of the hooks now. We\u0027ll need to reconcile the _get_pxe_port_macs logic here and the logic used there.","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"3353ab4f3da303e92f8b694ed645317162b8907b","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                            inventory, None, task.context)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        plugin_data \u003d {}"},{"line_number":217,"context_line":"        hooks_base.run_preprocess_hooks(task, inventory, plugin_data,"},{"line_number":218,"context_line":"                                        self.hooks)"},{"line_number":219,"context_line":"        hooks_base.run_post_hooks(task, inventory, plugin_data, self.hooks)"},{"line_number":220,"context_line":"        return states.MANAGEABLE"}],"source_content_type":"text/x-python","patch_set":1,"id":"7d8f16c7_8a46511d","line":217,"in_reply_to":"930b0a13_16941d77","updated":"2025-08-01 21:00:15.000000000","message":"Done","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":35929,"name":"Mahnoor Asghar","display_name":"Mahnoor Asghar","email":"masghar@redhat.com","username":"mahnoorasghar"},"change_message_id":"4bbdca74ad498e4aa21c5791e724e6c69076e6bd","unresolved":true,"context_lines":[{"line_number":216,"context_line":"        plugin_data \u003d {}"},{"line_number":217,"context_line":"        hooks_base.run_preprocess_hooks(task, inventory, plugin_data,"},{"line_number":218,"context_line":"                                        self.hooks)"},{"line_number":219,"context_line":"        hooks_base.run_post_hooks(task, inventory, plugin_data, self.hooks)"},{"line_number":220,"context_line":"        return states.MANAGEABLE"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _create_ports(self, task, system):"}],"source_content_type":"text/x-python","patch_set":1,"id":"2784ad1f_2c14d734","line":219,"updated":"2024-10-24 10:54:37.000000000","message":"The post-hooks are to be run after ports are created, and just before the node is updated with the data, and probably before inspect_utils.store_inspection_data is called. (so line 212)","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"39563e151b46aff7d14ae2506379d26a67722e70","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        plugin_data \u003d {}"},{"line_number":217,"context_line":"        hooks_base.run_preprocess_hooks(task, inventory, plugin_data,"},{"line_number":218,"context_line":"                                        self.hooks)"},{"line_number":219,"context_line":"        hooks_base.run_post_hooks(task, inventory, plugin_data, self.hooks)"},{"line_number":220,"context_line":"        return states.MANAGEABLE"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _create_ports(self, task, system):"}],"source_content_type":"text/x-python","patch_set":1,"id":"68302b24_b02fde6d","line":219,"in_reply_to":"2784ad1f_2c14d734","updated":"2025-07-21 20:18:21.000000000","message":"Done","commit_id":"9204a223eece7b7b21959bb475e1d63080366749"}]}
