)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"7d92c43150969dd730536f7ec9dd47eea6f07b9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"61524790_1132a827","updated":"2026-02-24 05:54:04.000000000","message":"Thank you for your change Nidhi. Overall looks good, minor suggestions in-line.\nI recommend adding a release note.","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"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":"b8405432d6fbf3bfdf0b39230299539cd98c35cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"fd52a6a8_ae9d4dd1","updated":"2026-02-26 04:54:05.000000000","message":"LGTM, thanks Nidhi \\o/.","commit_id":"2d053a879d81ca905d597ba87daffabc4a9cd8a1"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6ce3bab4b89acdbc58a153fc4e0fa175f417162e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"baf289e8_401cbc03","updated":"2026-02-25 09:44:36.000000000","message":"Thank you for the revision Nidhi, looks even better now. LGTM","commit_id":"2d053a879d81ca905d597ba87daffabc4a9cd8a1"}],"ironic/drivers/modules/redfish/inspect.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":"e2bef914af00fb40aa0223da3484fe89037b18f9","unresolved":true,"context_lines":[{"line_number":411,"context_line":"                        rt.value for rt in"},{"line_number":412,"context_line":"                        (getattr(sc, \u0027raid_types\u0027, None) or [])],"},{"line_number":413,"context_line":"                })"},{"line_number":414,"context_line":"        except (sushy.exceptions.SushyError, TypeError):"},{"line_number":415,"context_line":"            pass"},{"line_number":416,"context_line":"        controller[\u0027storage_controllers\u0027] \u003d sub_controllers"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        # Collect drives"}],"source_content_type":"text/x-python","patch_set":8,"id":"da018d4b_86a0269d","line":415,"range":{"start_line":414,"start_character":2,"end_line":415,"end_character":16},"updated":"2026-02-17 15:26:16.000000000","message":"Is the pass for an issue in the loop starting on line 406? If so, likely need to start the try block inside of the loop.","commit_id":"4a1d76b331c6ccb2613227600abf41ac96fd82fc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ffd89360d23b220eaeb0bbea44a4c9c03a95af6e","unresolved":true,"context_lines":[{"line_number":415,"context_line":"                        rt.value for rt in"},{"line_number":416,"context_line":"                        (getattr(sc, \u0027raid_types\u0027, None) or [])],"},{"line_number":417,"context_line":"                })"},{"line_number":418,"context_line":"            except Exception:"},{"line_number":419,"context_line":"                LOG.debug(\u0027Failed to parse sub-controller on node \u0027"},{"line_number":420,"context_line":"                          \u0027%(node)s\u0027, {\u0027node\u0027: task.node.uuid})"},{"line_number":421,"context_line":"        controller[\u0027storage_controllers\u0027] \u003d sub_controllers"}],"source_content_type":"text/x-python","patch_set":9,"id":"ee29ed0b_586da2fa","line":418,"updated":"2026-02-17 16:15:38.000000000","message":"same as below.","commit_id":"7cd6c1e4e7836bfb47183f4b41e06b1b00f0c83e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ffd89360d23b220eaeb0bbea44a4c9c03a95af6e","unresolved":true,"context_lines":[{"line_number":429,"context_line":"                        \u0027name\u0027: drive.name,"},{"line_number":430,"context_line":"                        \u0027size\u0027: drive.capacity_bytes,"},{"line_number":431,"context_line":"                    })"},{"line_number":432,"context_line":"                except Exception:"},{"line_number":433,"context_line":"                    LOG.debug(\u0027Failed to parse drive on node %(node)s\u0027,"},{"line_number":434,"context_line":"                              {\u0027node\u0027: task.node.uuid})"},{"line_number":435,"context_line":"        controller[\u0027drives\u0027] \u003d drives"}],"source_content_type":"text/x-python","patch_set":9,"id":"693ff522_4c350eb3","line":432,"range":{"start_line":432,"start_character":23,"end_line":432,"end_character":32},"updated":"2026-02-17 16:15:38.000000000","message":"Can we be a little more specific on just Exception?","commit_id":"7cd6c1e4e7836bfb47183f4b41e06b1b00f0c83e"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"7d92c43150969dd730536f7ec9dd47eea6f07b9b","unresolved":true,"context_lines":[{"line_number":376,"context_line":"            return controllers"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        try:"},{"line_number":379,"context_line":"            storages \u003d system.storage.get_members()"},{"line_number":380,"context_line":"        except sushy.exceptions.SushyError as ex:"},{"line_number":381,"context_line":"            LOG.debug(\u0027Failed to get storage members for node %(node)s: \u0027"},{"line_number":382,"context_line":"                      \u0027%(error)s\u0027, {\u0027node\u0027: task.node.uuid, \u0027error\u0027: ex})"}],"source_content_type":"text/x-python","patch_set":11,"id":"b3f37db6_be145bde","line":379,"range":{"start_line":379,"start_character":12,"end_line":379,"end_character":20},"updated":"2026-02-24 05:54:04.000000000","message":"nit: storages sounds a bit odd, it\u0027s typically an uncountable noun. Maybe consider using members (since we\u0027re calling .get_members())\nHaving said that I see it used in this file outside this change so will leave it up to you.","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6ce3bab4b89acdbc58a153fc4e0fa175f417162e","unresolved":false,"context_lines":[{"line_number":376,"context_line":"            return controllers"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        try:"},{"line_number":379,"context_line":"            storages \u003d system.storage.get_members()"},{"line_number":380,"context_line":"        except sushy.exceptions.SushyError as ex:"},{"line_number":381,"context_line":"            LOG.debug(\u0027Failed to get storage members for node %(node)s: \u0027"},{"line_number":382,"context_line":"                      \u0027%(error)s\u0027, {\u0027node\u0027: task.node.uuid, \u0027error\u0027: ex})"}],"source_content_type":"text/x-python","patch_set":11,"id":"4318cad2_ed838d9c","line":379,"range":{"start_line":379,"start_character":12,"end_line":379,"end_character":20},"in_reply_to":"b3f37db6_be145bde","updated":"2026-02-25 09:44:36.000000000","message":"Done","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"7d92c43150969dd730536f7ec9dd47eea6f07b9b","unresolved":true,"context_lines":[{"line_number":382,"context_line":"                      \u0027%(error)s\u0027, {\u0027node\u0027: task.node.uuid, \u0027error\u0027: ex})"},{"line_number":383,"context_line":"            return controllers"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        for storage in storages:"},{"line_number":386,"context_line":"            controller \u003d self._parse_storage_controller(task, storage)"},{"line_number":387,"context_line":"            controllers.append(controller)"},{"line_number":388,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"10931be2_a6ea9589","line":385,"range":{"start_line":385,"start_character":23,"end_line":385,"end_character":31},"updated":"2026-02-24 05:54:04.000000000","message":"as above","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6ce3bab4b89acdbc58a153fc4e0fa175f417162e","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                      \u0027%(error)s\u0027, {\u0027node\u0027: task.node.uuid, \u0027error\u0027: ex})"},{"line_number":383,"context_line":"            return controllers"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        for storage in storages:"},{"line_number":386,"context_line":"            controller \u003d self._parse_storage_controller(task, storage)"},{"line_number":387,"context_line":"            controllers.append(controller)"},{"line_number":388,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"af64df74_d8c70c6d","line":385,"range":{"start_line":385,"start_character":23,"end_line":385,"end_character":31},"in_reply_to":"10931be2_a6ea9589","updated":"2026-02-25 09:44:36.000000000","message":"Done","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"7d92c43150969dd730536f7ec9dd47eea6f07b9b","unresolved":true,"context_lines":[{"line_number":403,"context_line":"            result[\u0027health\u0027] \u003d RedfishInspect._enum_to_str(status.health)"},{"line_number":404,"context_line":"        if hasattr(status, \u0027state\u0027) and status.state is not None:"},{"line_number":405,"context_line":"            result[\u0027state\u0027] \u003d RedfishInspect._enum_to_str(status.state)"},{"line_number":406,"context_line":"        if hasattr(status, \u0027health_rollup\u0027) and \\"},{"line_number":407,"context_line":"                status.health_rollup is not None:"},{"line_number":408,"context_line":"            result[\u0027health_rollup\u0027] \u003d RedfishInspect._enum_to_str("},{"line_number":409,"context_line":"                status.health_rollup)"},{"line_number":410,"context_line":"        return result or None"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _parse_storage_controller(self, task, storage):"}],"source_content_type":"text/x-python","patch_set":11,"id":"d9df5544_faa03255","line":409,"range":{"start_line":406,"start_character":0,"end_line":409,"end_character":37},"updated":"2026-02-24 05:54:04.000000000","message":"nit: parentheses continuation may be better than backslash, maybe something like this?\n\nif (hasattr(status, \u0027health_rollup\u0027)\n        and status.health_rollup is not None):\n    result[\u0027health_rollup\u0027] \u003d RedfishInspect._enum_to_str(\n        status.health_rollup)","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6ce3bab4b89acdbc58a153fc4e0fa175f417162e","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            result[\u0027health\u0027] \u003d RedfishInspect._enum_to_str(status.health)"},{"line_number":404,"context_line":"        if hasattr(status, \u0027state\u0027) and status.state is not None:"},{"line_number":405,"context_line":"            result[\u0027state\u0027] \u003d RedfishInspect._enum_to_str(status.state)"},{"line_number":406,"context_line":"        if hasattr(status, \u0027health_rollup\u0027) and \\"},{"line_number":407,"context_line":"                status.health_rollup is not None:"},{"line_number":408,"context_line":"            result[\u0027health_rollup\u0027] \u003d RedfishInspect._enum_to_str("},{"line_number":409,"context_line":"                status.health_rollup)"},{"line_number":410,"context_line":"        return result or None"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _parse_storage_controller(self, task, storage):"}],"source_content_type":"text/x-python","patch_set":11,"id":"2da078a7_b1520480","line":409,"range":{"start_line":406,"start_character":0,"end_line":409,"end_character":37},"in_reply_to":"d9df5544_faa03255","updated":"2026-02-25 09:44:36.000000000","message":"Done","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"7d92c43150969dd730536f7ec9dd47eea6f07b9b","unresolved":true,"context_lines":[{"line_number":482,"context_line":"                        drive_info[\u0027status\u0027] \u003d self._status_to_dict("},{"line_number":483,"context_line":"                            status)"},{"line_number":484,"context_line":"                    drives.append(drive_info)"},{"line_number":485,"context_line":"                except (AttributeError, sushy.exceptions.SushyError):"},{"line_number":486,"context_line":"                    LOG.debug(\u0027Failed to parse drive on node %(node)s\u0027,"},{"line_number":487,"context_line":"                              {\u0027node\u0027: task.node.uuid})"},{"line_number":488,"context_line":"        controller[\u0027drives\u0027] \u003d drives"}],"source_content_type":"text/x-python","patch_set":11,"id":"bcce1297_32a52efd","line":485,"range":{"start_line":485,"start_character":0,"end_line":485,"end_character":69},"updated":"2026-02-24 05:54:04.000000000","message":"drive controller also catches TypeError - is it worth catching here as well?","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6ce3bab4b89acdbc58a153fc4e0fa175f417162e","unresolved":false,"context_lines":[{"line_number":482,"context_line":"                        drive_info[\u0027status\u0027] \u003d self._status_to_dict("},{"line_number":483,"context_line":"                            status)"},{"line_number":484,"context_line":"                    drives.append(drive_info)"},{"line_number":485,"context_line":"                except (AttributeError, sushy.exceptions.SushyError):"},{"line_number":486,"context_line":"                    LOG.debug(\u0027Failed to parse drive on node %(node)s\u0027,"},{"line_number":487,"context_line":"                              {\u0027node\u0027: task.node.uuid})"},{"line_number":488,"context_line":"        controller[\u0027drives\u0027] \u003d drives"}],"source_content_type":"text/x-python","patch_set":11,"id":"a7583ec7_d5aa660c","line":485,"range":{"start_line":485,"start_character":0,"end_line":485,"end_character":69},"in_reply_to":"bcce1297_32a52efd","updated":"2026-02-25 09:44:36.000000000","message":"Done","commit_id":"83eab5817e03936d74be5b30b64b1970ec186991"},{"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":"b8405432d6fbf3bfdf0b39230299539cd98c35cd","unresolved":true,"context_lines":[{"line_number":417,"context_line":"        :returns: Dictionary with storage controller info."},{"line_number":418,"context_line":"        \"\"\""},{"line_number":419,"context_line":"        controller \u003d {"},{"line_number":420,"context_line":"            \u0027id\u0027: str(storage.identity) if storage.identity else \u0027\u0027,"},{"line_number":421,"context_line":"            \u0027name\u0027: storage.name if hasattr(storage, \u0027name\u0027) else None,"},{"line_number":422,"context_line":"        }"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        # Collect sub-controllers from deprecated StorageControllers list"}],"source_content_type":"text/x-python","patch_set":12,"id":"7f079514_eea3e17d","line":421,"range":{"start_line":420,"start_character":11,"end_line":421,"end_character":58},"updated":"2026-02-26 04:54:05.000000000","message":"This is totally out of curiosity.\n\nI see that we return, with a level of intentionality, an empty string in the absence of a value for `id` but `None` in the same case for the `name` field. Why not empty strings all the way :-)","commit_id":"2d053a879d81ca905d597ba87daffabc4a9cd8a1"},{"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":"b8405432d6fbf3bfdf0b39230299539cd98c35cd","unresolved":true,"context_lines":[{"line_number":449,"context_line":"                if status:"},{"line_number":450,"context_line":"                    sc_info[\u0027status\u0027] \u003d self._status_to_dict(status)"},{"line_number":451,"context_line":"                sub_controllers.append(sc_info)"},{"line_number":452,"context_line":"            except (AttributeError, TypeError,"},{"line_number":453,"context_line":"                    sushy.exceptions.SushyError):"},{"line_number":454,"context_line":"                LOG.debug(\u0027Failed to parse sub-controller on node \u0027"},{"line_number":455,"context_line":"                          \u0027%(node)s\u0027, {\u0027node\u0027: task.node.uuid})"},{"line_number":456,"context_line":"        controller[\u0027storage_controllers\u0027] \u003d sub_controllers"}],"source_content_type":"text/x-python","patch_set":12,"id":"60ba86e7_3677764a","line":453,"range":{"start_line":452,"start_character":13,"end_line":453,"end_character":32},"updated":"2026-02-26 04:54:05.000000000","message":"nit: I learnt recently to not handle unexpected exceptions (KeyError/AttributeError) the same way as expected exceptions. But, SushyError is a base error class, so I think it\u0027s just fine as-is.","commit_id":"2d053a879d81ca905d597ba87daffabc4a9cd8a1"}]}
