)]}'
{"/COMMIT_MSG":[{"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":"77bd38b2b53d73fec455f22d913a9a618523c2bd","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Partial-Bug: #2100556"},{"line_number":12,"context_line":"Change-Id: I53d5a4f112fbed455d5574840611ef6ea2db3eae"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"09202f18_f0bf2541","line":11,"updated":"2025-03-19 00:54:42.000000000","message":"Can you add, just above the bug line here:\n\nDepends-On: https://review.opendev.org/c/openstack/ironic-python-agent-builder/+/943348\n\nThis should load in your change to install podman.","commit_id":"3e1825f205f21f642bd92185f2502c3e33018686"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"24123a4bd4678a8b3337d52068cca63ba6212d89","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Partial-Bug: #2100556"},{"line_number":12,"context_line":"Change-Id: I53d5a4f112fbed455d5574840611ef6ea2db3eae"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"d2b9a363_21b42640","line":11,"in_reply_to":"09202f18_f0bf2541","updated":"2025-03-21 11:35:58.000000000","message":"Done","commit_id":"3e1825f205f21f642bd92185f2502c3e33018686"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e4cde1f6abbf6dc92acabb674e93ca6da1536e86","unresolved":true,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2025-02-14 18:45:42 +0000"},{"line_number":4,"context_line":"Commit:     satoshi-sh \u003csatoss1108@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-03-26 19:18:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP Ironic Config Intergration for IPA"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"f2cdc541_b46484b4","line":7,"range":{"start_line":6,"start_character":0,"end_line":7,"end_character":4},"updated":"2025-03-26 21:46:51.000000000","message":"Is this really a WIP?","commit_id":"f6339166bc260ad3be82017980964e3a6d503326"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"9b7648eddf089f48a5240ccf7d0f61ffe26c3477","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2025-02-14 18:45:42 +0000"},{"line_number":4,"context_line":"Commit:     satoshi-sh \u003csatoss1108@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-03-26 19:18:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP Ironic Config Intergration for IPA"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1f26b5da_f7fad84c","line":7,"range":{"start_line":6,"start_character":0,"end_line":7,"end_character":4},"in_reply_to":"f2cdc541_b46484b4","updated":"2025-03-26 22:58:09.000000000","message":"I took off WIP.","commit_id":"f6339166bc260ad3be82017980964e3a6d503326"},{"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":"4c521cef43993dd8bad8debbb42bd5c6d98c3a26","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note:"},{"line_number":12,"context_line":"- Moved conf variables from _init_ and evaluate_hardwar_support as the config overwritten after those process"},{"line_number":13,"context_line":"- Utilized getattr instead of making methods beforehand. The methods created don\u0027t stick for a new instance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Depends-On: https://review.opendev.org/c/openstack/ironic-python-agent-builder/+/943348"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"0de12d6c_fcf22340","line":12,"updated":"2025-03-27 18:53:14.000000000","message":"nit: spelling (missing one _ on each side of init + hardware)","commit_id":"dad7b5e160a6c4b10daf2dbae4fe7dd4e36d4aa8"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"79574217be475060460032e1e0dc90bf1d29da85","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note:"},{"line_number":12,"context_line":"- Moved conf variables from _init_ and evaluate_hardwar_support as the config overwritten after those process"},{"line_number":13,"context_line":"- Utilized getattr instead of making methods beforehand. The methods created don\u0027t stick for a new instance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Depends-On: https://review.opendev.org/c/openstack/ironic-python-agent-builder/+/943348"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"60247e8d_f04f9b9a","line":12,"in_reply_to":"0de12d6c_fcf22340","updated":"2025-03-27 21:31:36.000000000","message":"Done","commit_id":"dad7b5e160a6c4b10daf2dbae4fe7dd4e36d4aa8"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"58a6e111c75e1416a398ac731d0149412ccd339d","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Ironic Config Intergration for IPA"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note:"},{"line_number":12,"context_line":"- Moved conf variables from __init__ and evaluate_hardware_support as the config overwritten after those process"},{"line_number":13,"context_line":"- Utilized getattr instead of making methods beforehand. The methods created don\u0027t stick for a new instance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partial-Bug: #2100556"},{"line_number":16,"context_line":"Change-Id: I53d5a4f112fbed455d5574840611ef6ea2db3eae"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"604ffdd8_0e580495","line":13,"range":{"start_line":9,"start_character":0,"end_line":13,"end_character":108},"updated":"2025-04-06 13:57:24.000000000","message":"This might be trivial but wrapping each lines at 72 chars is a good recommended practice.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure\n\nSubsequent lines should be wrapped at 72 characters.","commit_id":"fbcfa6973c82ca5a5e1d8b4a26cf27497c9c4538"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"f863804d945dd213de8c6c0d0f0595b2d31526db","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Ironic Config Intergration for IPA"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update container-based cleaning hardware manager to use ironic conductor config."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Note:"},{"line_number":12,"context_line":"- Moved conf variables from __init__ and evaluate_hardware_support as the config overwritten after those process"},{"line_number":13,"context_line":"- Utilized getattr instead of making methods beforehand. The methods created don\u0027t stick for a new instance."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partial-Bug: #2100556"},{"line_number":16,"context_line":"Change-Id: I53d5a4f112fbed455d5574840611ef6ea2db3eae"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"32097361_1b0f009a","line":13,"range":{"start_line":9,"start_character":0,"end_line":13,"end_character":108},"in_reply_to":"604ffdd8_0e580495","updated":"2025-04-06 19:26:23.000000000","message":"Done","commit_id":"fbcfa6973c82ca5a5e1d8b4a26cf27497c9c4538"}],"/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":"baa36a7181b1aff5f65fb7ac078bf2527c251da1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"f686b375_4a141aa1","updated":"2025-04-02 19:13:13.000000000","message":"https://opendev.org/openstack/ironic-python-agent/src/branch/master/ironic_python_agent/hardware.py#L3662 is what actually calls get_clean_steps (and most other hardware manager methods) -- can we update this to give a higher quality error message to the log when this case happens? (Reraising the exception afterwards is still the right thing to do)","commit_id":"e796aac9b44dd93150db29d5057e6900f36c1b79"}],"ironic_python_agent/config.py":[{"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":"4c521cef43993dd8bad8debbb42bd5c6d98c3a26","unresolved":true,"context_lines":[{"line_number":466,"context_line":"                help\u003d\u0027Options to use when running containers.\u0027),"},{"line_number":467,"context_line":"    cfg.StrOpt(\u0027podman_conf_file\u0027,"},{"line_number":468,"context_line":"               default\u003d\u0027/etc/containers/containers.conf\u0027,"},{"line_number":469,"context_line":"               help\u003d\u0027Path to the configuration file created in the RAM\u0027),"},{"line_number":470,"context_line":"    cfg.StrOpt(\u0027steps_file_path\u0027,"},{"line_number":471,"context_line":"               default\u003d\u0027/etc/mysteps.yaml\u0027,"},{"line_number":472,"context_line":"               help\u003d\u0027Path to the local stepfile to be copied to the RAM\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"0b3b43d7_3962e328","line":469,"updated":"2025-03-27 18:53:14.000000000","message":"If this means what I think it means; I\u0027d reword this to \"Path to the container configuration file in the IPA ramdisk\" or similar.\n\nIt\u0027s also a little weird that this is *podman* conf file when we allow other runners.","commit_id":"dad7b5e160a6c4b10daf2dbae4fe7dd4e36d4aa8"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"79574217be475060460032e1e0dc90bf1d29da85","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                help\u003d\u0027Options to use when running containers.\u0027),"},{"line_number":467,"context_line":"    cfg.StrOpt(\u0027podman_conf_file\u0027,"},{"line_number":468,"context_line":"               default\u003d\u0027/etc/containers/containers.conf\u0027,"},{"line_number":469,"context_line":"               help\u003d\u0027Path to the configuration file created in the RAM\u0027),"},{"line_number":470,"context_line":"    cfg.StrOpt(\u0027steps_file_path\u0027,"},{"line_number":471,"context_line":"               default\u003d\u0027/etc/mysteps.yaml\u0027,"},{"line_number":472,"context_line":"               help\u003d\u0027Path to the local stepfile to be copied to the RAM\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"38dff6ed_0d25fd38","line":469,"in_reply_to":"0b3b43d7_3962e328","updated":"2025-03-27 21:31:36.000000000","message":"Done","commit_id":"dad7b5e160a6c4b10daf2dbae4fe7dd4e36d4aa8"},{"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":"4c521cef43993dd8bad8debbb42bd5c6d98c3a26","unresolved":true,"context_lines":[{"line_number":469,"context_line":"               help\u003d\u0027Path to the configuration file created in the RAM\u0027),"},{"line_number":470,"context_line":"    cfg.StrOpt(\u0027steps_file_path\u0027,"},{"line_number":471,"context_line":"               default\u003d\u0027/etc/mysteps.yaml\u0027,"},{"line_number":472,"context_line":"               help\u003d\u0027Path to the local stepfile to be copied to the RAM\u0027)"},{"line_number":473,"context_line":"]"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"0286522c_0f48ed71","line":472,"updated":"2025-03-27 18:53:14.000000000","message":"This is also already existing in the ramdisk, yeah?","commit_id":"dad7b5e160a6c4b10daf2dbae4fe7dd4e36d4aa8"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"79574217be475060460032e1e0dc90bf1d29da85","unresolved":false,"context_lines":[{"line_number":469,"context_line":"               help\u003d\u0027Path to the configuration file created in the RAM\u0027),"},{"line_number":470,"context_line":"    cfg.StrOpt(\u0027steps_file_path\u0027,"},{"line_number":471,"context_line":"               default\u003d\u0027/etc/mysteps.yaml\u0027,"},{"line_number":472,"context_line":"               help\u003d\u0027Path to the local stepfile to be copied to the RAM\u0027)"},{"line_number":473,"context_line":"]"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"81e11115_33472773","line":472,"in_reply_to":"0286522c_0f48ed71","updated":"2025-03-27 21:31:36.000000000","message":"I think I copied the variables from IPA-B without thinking much. Thanks for checking.","commit_id":"dad7b5e160a6c4b10daf2dbae4fe7dd4e36d4aa8"}],"ironic_python_agent/hardware.py":[{"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":"760453ae721216c0f8575d4707df5fedde396ec2","unresolved":true,"context_lines":[{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"    :returns: result of successful dispatch of method"},{"line_number":3655,"context_line":"    :raises HardwareManagerConfigurationError: if a cleaning step"},{"line_number":3656,"context_line":"        is missing required keys"},{"line_number":3657,"context_line":"    :raises HardwareManagerMethodNotFound: if all managers failed the method"},{"line_number":3658,"context_line":"    :raises HardwareManagerNotFound: if no valid hardware managers found"},{"line_number":3659,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"425d7ff0_cf14ab2f","line":3656,"updated":"2025-04-02 23:01:43.000000000","message":"nit: this would ideally be more generic; e.g. \u0027if a hardware manager is misconfigured\u0027","commit_id":"23c38e7f7932375992c729d08a8c8bcd6a6d46c0"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"7f068f4ce097a680c06820d818bac0b2d83a7707","unresolved":false,"context_lines":[{"line_number":3653,"context_line":""},{"line_number":3654,"context_line":"    :returns: result of successful dispatch of method"},{"line_number":3655,"context_line":"    :raises HardwareManagerConfigurationError: if a cleaning step"},{"line_number":3656,"context_line":"        is missing required keys"},{"line_number":3657,"context_line":"    :raises HardwareManagerMethodNotFound: if all managers failed the method"},{"line_number":3658,"context_line":"    :raises HardwareManagerNotFound: if no valid hardware managers found"},{"line_number":3659,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"b8bbf1b3_edc200d1","line":3656,"in_reply_to":"425d7ff0_cf14ab2f","updated":"2025-04-03 00:51:55.000000000","message":"Done","commit_id":"23c38e7f7932375992c729d08a8c8bcd6a6d46c0"}],"ironic_python_agent/hardware_managers/container.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":"6f962facae3562507e2d6c71923b2753cbe99206","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def evaluate_hardware_support(self):"},{"line_number":45,"context_line":"        \"\"\"Determine if container runner exists and return support level.\"\"\""},{"line_number":46,"context_line":"        containers_runners \u003d [\"podman\", \"docker\"]"},{"line_number":47,"context_line":"        for runner in containers_runners:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                stdout, _ \u003d utils.execute(\"which\", runner)"},{"line_number":50,"context_line":"                if stdout.strip():"}],"source_content_type":"text/x-python","patch_set":9,"id":"d47b12a6_a66c85c5","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":41},"updated":"2025-04-02 10:37:41.000000000","message":"niit: could be simplief to `for runner in [\"podman\", \"docker\"]`.","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"983bcb7165809ddfca31ec05c486fb11d80db58c","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def evaluate_hardware_support(self):"},{"line_number":45,"context_line":"        \"\"\"Determine if container runner exists and return support level.\"\"\""},{"line_number":46,"context_line":"        containers_runners \u003d [\"podman\", \"docker\"]"},{"line_number":47,"context_line":"        for runner in containers_runners:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                stdout, _ \u003d utils.execute(\"which\", runner)"},{"line_number":50,"context_line":"                if stdout.strip():"}],"source_content_type":"text/x-python","patch_set":9,"id":"3bba2ab7_5a3acd4a","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":41},"in_reply_to":"d47b12a6_a66c85c5","updated":"2025-04-02 14:22:25.000000000","message":"I think it is better to keep it this way in case someone wants to add new runners in the future. I also used this variable in a test on the next PR.","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"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":"6f962facae3562507e2d6c71923b2753cbe99206","unresolved":true,"context_lines":[{"line_number":52,"context_line":"                              runner)"},{"line_number":53,"context_line":"                    return hardware.HardwareSupport.MAINLINE"},{"line_number":54,"context_line":"            except Exception as e:"},{"line_number":55,"context_line":"                LOG.debug(\"Error checking container runner: %s\", str(e))"},{"line_number":56,"context_line":"        LOG.debug(\"No container runner found, returning NONE\")"},{"line_number":57,"context_line":"        return hardware.HardwareSupport.NONE"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9c391c21_2cc442d5","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":72},"updated":"2025-04-02 10:37:41.000000000","message":"niit: `s/... runner: %s\", str(e))`/`... runner: %s\", e)`/.\nI learned `%s` implicitly calls `str()`, so you don\u0027t need an additional string casting.","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"983bcb7165809ddfca31ec05c486fb11d80db58c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                              runner)"},{"line_number":53,"context_line":"                    return hardware.HardwareSupport.MAINLINE"},{"line_number":54,"context_line":"            except Exception as e:"},{"line_number":55,"context_line":"                LOG.debug(\"Error checking container runner: %s\", str(e))"},{"line_number":56,"context_line":"        LOG.debug(\"No container runner found, returning NONE\")"},{"line_number":57,"context_line":"        return hardware.HardwareSupport.NONE"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"d25cb9f1_a3e93147","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":72},"in_reply_to":"9c391c21_2cc442d5","updated":"2025-04-02 14:22:25.000000000","message":"Done","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"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":"6f962facae3562507e2d6c71923b2753cbe99206","unresolved":true,"context_lines":[{"line_number":62,"context_line":"            CONF.container[\u0027container_steps_file\u0027])"},{"line_number":63,"context_line":"        steps \u003d []"},{"line_number":64,"context_line":"        for step in self.STEPS:"},{"line_number":65,"context_line":"            steps.append("},{"line_number":66,"context_line":"                {"},{"line_number":67,"context_line":"                    \"step\": step[\"name\"],"},{"line_number":68,"context_line":"                    \"priority\": step[\"priority\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"16115ec3_c60eacaa","line":65,"range":{"start_line":65,"start_character":0,"end_line":65,"end_character":25},"updated":"2025-04-02 10:37:41.000000000","message":"Unless there\u0027s a validation schema we\u0027re running the loaded steps by, maybe we use a .get() to avoid attribute errors. Here and other places.","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"983bcb7165809ddfca31ec05c486fb11d80db58c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            CONF.container[\u0027container_steps_file\u0027])"},{"line_number":63,"context_line":"        steps \u003d []"},{"line_number":64,"context_line":"        for step in self.STEPS:"},{"line_number":65,"context_line":"            steps.append("},{"line_number":66,"context_line":"                {"},{"line_number":67,"context_line":"                    \"step\": step[\"name\"],"},{"line_number":68,"context_line":"                    \"priority\": step[\"priority\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"c0b82f4c_6bacb236","line":65,"range":{"start_line":65,"start_character":0,"end_line":65,"end_character":25},"in_reply_to":"16115ec3_c60eacaa","updated":"2025-04-02 14:22:25.000000000","message":"Nice catch. I replaced step[\"key\"] with get(\"key\").","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"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":"dfdff7fc973b8445476b971e2458f979dcd5d546","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            CONF.container[\u0027container_steps_file\u0027])"},{"line_number":63,"context_line":"        steps \u003d []"},{"line_number":64,"context_line":"        for step in self.STEPS:"},{"line_number":65,"context_line":"            steps.append("},{"line_number":66,"context_line":"                {"},{"line_number":67,"context_line":"                    \"step\": step[\"name\"],"},{"line_number":68,"context_line":"                    \"priority\": step[\"priority\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"0b678b48_b76bb679","line":65,"range":{"start_line":65,"start_character":0,"end_line":65,"end_character":25},"in_reply_to":"c0b82f4c_6bacb236","updated":"2025-04-02 14:58:57.000000000","message":"This is a case where I think we\u0027d rather error early, actually -- if a step is malformed, do we know what Ironic will do when it\u0027s returned? I do know that Ironic can properly error-handle if IPA fails...\n\nmaybe the better approach could be try: except KeyError: raise errors.WhateverCleaningErrorIsCalled?","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"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":"6f962facae3562507e2d6c71923b2753cbe99206","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                        raise"},{"line_number":113,"context_line":"                return run_container_steps"},{"line_number":114,"context_line":"        raise AttributeError("},{"line_number":115,"context_line":"            f\"\u0027{self.__class__.__name__}\u0027 object has no attribute \u0027{name}\u0027\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ca20808_a24fe5ab","line":115,"range":{"start_line":115,"start_character":0,"end_line":115,"end_character":76},"updated":"2025-04-02 10:37:41.000000000","message":"I think this is okay since the IPA codebase is mixing F-strings and Percent Formatting.","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"983bcb7165809ddfca31ec05c486fb11d80db58c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                        raise"},{"line_number":113,"context_line":"                return run_container_steps"},{"line_number":114,"context_line":"        raise AttributeError("},{"line_number":115,"context_line":"            f\"\u0027{self.__class__.__name__}\u0027 object has no attribute \u0027{name}\u0027\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"83dcaaa0_efa8851b","line":115,"range":{"start_line":115,"start_character":0,"end_line":115,"end_character":76},"in_reply_to":"9ca20808_a24fe5ab","updated":"2025-04-02 14:22:25.000000000","message":"I changed this since other codes use %s.","commit_id":"1c10e14736ac5a72063422c4d917b4332b80ba27"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b06f2c2b5f94b5d543a0f9e1928a353d4c6e7008","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        containers_runners \u003d [\"podman\", \"docker\"]"},{"line_number":47,"context_line":"        for runner in containers_runners:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                stdout, _ \u003d utils.execute(\"which\", runner)"},{"line_number":50,"context_line":"                if stdout.strip():"},{"line_number":51,"context_line":"                    LOG.debug(\"Found %s, returning MAINLINE\","},{"line_number":52,"context_line":"                              runner)"}],"source_content_type":"text/x-python","patch_set":11,"id":"c2ee3417_04e68431","line":49,"updated":"2025-04-02 16:38:24.000000000","message":"This worries me, specifically utils.execute will execute, but the command not found in the $PATH is a return code of 1 as compared to a return code of 0 if found.\n\nAre we sure utils.execute will not error if the return code is 1?\n\nHint: I looked at the code, we need to provide an \"ignore_exit_code\" or \"check_exit_code\" kwarg to align with oslo.processutils behavior. If the exit code is not 0, by default it raises an exception.","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"1625317518c2014ddae97f998c93a65886a391b4","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        containers_runners \u003d [\"podman\", \"docker\"]"},{"line_number":47,"context_line":"        for runner in containers_runners:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                stdout, _ \u003d utils.execute(\"which\", runner)"},{"line_number":50,"context_line":"                if stdout.strip():"},{"line_number":51,"context_line":"                    LOG.debug(\"Found %s, returning MAINLINE\","},{"line_number":52,"context_line":"                              runner)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ee9aadcf_0c4efdef","line":49,"in_reply_to":"c2ee3417_04e68431","updated":"2025-04-02 19:42:15.000000000","message":"Done","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b06f2c2b5f94b5d543a0f9e1928a353d4c6e7008","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        for runner in containers_runners:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                stdout, _ \u003d utils.execute(\"which\", runner)"},{"line_number":50,"context_line":"                if stdout.strip():"},{"line_number":51,"context_line":"                    LOG.debug(\"Found %s, returning MAINLINE\","},{"line_number":52,"context_line":"                              runner)"},{"line_number":53,"context_line":"                    return hardware.HardwareSupport.MAINLINE"}],"source_content_type":"text/x-python","patch_set":11,"id":"8b08a096_3a5faa6a","line":50,"updated":"2025-04-02 16:38:24.000000000","message":"Ultimately, the code for the exec *could* remain unchanged and the conditional can be removed because under the current model of the code as-written, the conditional is *always* true and the debug is always returned if the item exists, if not it gets kicked back out to None.\n\nIn other words, there is no case of False rendering the conditional not necessary.","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"1625317518c2014ddae97f998c93a65886a391b4","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        for runner in containers_runners:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                stdout, _ \u003d utils.execute(\"which\", runner)"},{"line_number":50,"context_line":"                if stdout.strip():"},{"line_number":51,"context_line":"                    LOG.debug(\"Found %s, returning MAINLINE\","},{"line_number":52,"context_line":"                              runner)"},{"line_number":53,"context_line":"                    return hardware.HardwareSupport.MAINLINE"}],"source_content_type":"text/x-python","patch_set":11,"id":"5273e569_29127a85","line":50,"in_reply_to":"8b08a096_3a5faa6a","updated":"2025-04-02 19:42:15.000000000","message":"Done","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"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":"1fbd9d69be15894b57b0154eb9e3b953af4bd9bc","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            except KeyError as e:"},{"line_number":76,"context_line":"                LOG.exception(\"Missing key \u0027%s\u0027 in cleaning step: %s\", e,"},{"line_number":77,"context_line":"                              step.get(\"name\", \"unknown\"))"},{"line_number":78,"context_line":"                raise"},{"line_number":79,"context_line":"        return steps"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __getattr__(self, name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"24372360_024ce119","line":78,"updated":"2025-04-02 16:08:31.000000000","message":"I think raising here will lead to a 500 internal server error, because the keyerror bubbles up to dispatch_to_managers, which raises it as an unknown exception, which AFAICT never bubbles up to the API properly.\n\nThe other option is to raise HardwareMethodIncompatibleError which would make it skip this HWM, which would effectively silence any error and make this fail quietly, which is also bad.\n\nUnsure the best behavior, asking in IRC.","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b06f2c2b5f94b5d543a0f9e1928a353d4c6e7008","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            except KeyError as e:"},{"line_number":76,"context_line":"                LOG.exception(\"Missing key \u0027%s\u0027 in cleaning step: %s\", e,"},{"line_number":77,"context_line":"                              step.get(\"name\", \"unknown\"))"},{"line_number":78,"context_line":"                raise"},{"line_number":79,"context_line":"        return steps"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __getattr__(self, name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"f3b2a080_3519f96c","line":78,"in_reply_to":"24372360_024ce119","updated":"2025-04-02 16:38:24.000000000","message":"I think the right path here is to add a new exception because there is a line here which we\u0027re walking in between suppressing an error and highlighting the error. A formatting error or even just a missing value in the yaml loaded from container_steps_file (i.e. any imprefection) with the state of the code is a hard error, it will functionaly brick the agent.\n\nWhere as, raising the HardwareMethodIncompatibleError is sort of dismissive in the error state. It hides it, allows the agent to run, but we only log if the agent is in debug.\n\nReally, we need to highlight there is a configuration or some *other* error under the hood in the hardware manager which may, or may not break the overall flow and state.","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"1625317518c2014ddae97f998c93a65886a391b4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            except KeyError as e:"},{"line_number":76,"context_line":"                LOG.exception(\"Missing key \u0027%s\u0027 in cleaning step: %s\", e,"},{"line_number":77,"context_line":"                              step.get(\"name\", \"unknown\"))"},{"line_number":78,"context_line":"                raise"},{"line_number":79,"context_line":"        return steps"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __getattr__(self, name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"91046dc3_906faa6e","line":78,"in_reply_to":"ac30354e_3286ac09","updated":"2025-04-02 19:42:15.000000000","message":"Done","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"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":"4cbc3b9ce1a06793dbe28995c9e0659828f95430","unresolved":true,"context_lines":[{"line_number":75,"context_line":"            except KeyError as e:"},{"line_number":76,"context_line":"                LOG.exception(\"Missing key \u0027%s\u0027 in cleaning step: %s\", e,"},{"line_number":77,"context_line":"                              step.get(\"name\", \"unknown\"))"},{"line_number":78,"context_line":"                raise"},{"line_number":79,"context_line":"        return steps"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __getattr__(self, name):"}],"source_content_type":"text/x-python","patch_set":11,"id":"ac30354e_3286ac09","line":78,"in_reply_to":"f3b2a080_3519f96c","updated":"2025-04-02 16:48:16.000000000","message":"HardwareManagerConfigurationError() and maybe have dispatch_to_managers raise on that, but with a better error?","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b06f2c2b5f94b5d543a0f9e1928a353d4c6e7008","unresolved":true,"context_lines":[{"line_number":104,"context_line":"                            *step.get(\"pull_options\","},{"line_number":105,"context_line":"                                      CONF.container.pull_options),"},{"line_number":106,"context_line":"                            step.get(\"image\"),"},{"line_number":107,"context_line":"                        )"},{"line_number":108,"context_line":"                        utils.execute("},{"line_number":109,"context_line":"                            CONF.container.runner,"},{"line_number":110,"context_line":"                            \"run\","}],"source_content_type":"text/x-python","patch_set":11,"id":"b7ff29a0_5c6fc6b1","line":107,"updated":"2025-04-02 16:38:24.000000000","message":"honestly, I\u0027d log in between these actions. To help clearly show state.","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"},{"author":{"_account_id":37707,"name":"Satoshi Shirosaka","display_name":"Satoshi S.","email":"satoss1108@gmail.com","username":"satoshi-sh"},"change_message_id":"1625317518c2014ddae97f998c93a65886a391b4","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                            *step.get(\"pull_options\","},{"line_number":105,"context_line":"                                      CONF.container.pull_options),"},{"line_number":106,"context_line":"                            step.get(\"image\"),"},{"line_number":107,"context_line":"                        )"},{"line_number":108,"context_line":"                        utils.execute("},{"line_number":109,"context_line":"                            CONF.container.runner,"},{"line_number":110,"context_line":"                            \"run\","}],"source_content_type":"text/x-python","patch_set":11,"id":"4fa12f6a_6281cd1c","line":107,"in_reply_to":"b7ff29a0_5c6fc6b1","updated":"2025-04-02 19:42:15.000000000","message":"Done","commit_id":"f7ff004926fb474198643a93107a1b6492e9852a"}]}
