)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"caa5ba4c1613c3c193f9f516780a78eeff2b6a2d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"14c58db2_72d7cb44","updated":"2025-07-25 16:24:41.000000000","message":"so, in general this is expected to fail, because we still haven\u0027t landed the sushy change, after that we will also need a sushi release upstream if I remember correctly","commit_id":"1f3542410225c1fa4d34671fd6b29999d4df3c8b"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"c0f68f6718df963b59dc96af79f8272a7e6a4e79","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"fa821c03_28e310c0","updated":"2025-11-22 01:34:24.000000000","message":"Overall this would be good.","commit_id":"e50466c9d848da933d52a501517983eaca9b68e3"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a742287b277c799909839816e4e6a43afc2217d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3cb3d44a_13047a8e","in_reply_to":"fa821c03_28e310c0","updated":"2026-01-05 14:33:52.000000000","message":"Done","commit_id":"e50466c9d848da933d52a501517983eaca9b68e3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"d7122aed_022345ab","updated":"2025-12-10 16:42:40.000000000","message":"Requirements have already been updated, but a few comments inline","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"65f897602059d94172960ab91e385bc4cfb3e051","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"c920e8ed_ac25b236","updated":"2025-11-26 18:35:41.000000000","message":"| I suspect we need a new version of sushy + bump the version in requirements.txt before we can actually land this?\n\nyes","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3c9c4cf68ba9de5338192c1a474a36db0da8853d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"c708d7b6_3b4d7a6d","updated":"2025-12-16 18:15:07.000000000","message":"Some questions","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"577661ecb85e49f6111d1e4f2fd0f591385df89a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"f3cdae33_2efef02b","updated":"2025-12-19 22:11:36.000000000","message":"Created another PR to fix the missing state issue in drives https://review.opendev.org/c/openstack/ironic/+/971572 instead of including this here","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c9aefcdb97e8a131447b52ca309720709bfe7649","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"72f35371_5d19ed8a","updated":"2026-01-05 21:11:09.000000000","message":"LGTM","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"d0d57db0ce5aa34ef5ab7858e087f9b2944b932e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"923ab439_545f4fad","updated":"2026-01-22 19:04:54.000000000","message":"Please re-add ironic-week-prio once this is rebased and updated.","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"d9b9d1cb3a1a909b6dc9c37fec224b74f3f7ec1e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"6950b805_6bf4db88","updated":"2026-01-22 17:43:51.000000000","message":"Please rebase this on top of https://review.opendev.org/c/openstack/ironic/+/966946 and we\u0027ll be able to get this in.","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"1c48416241a445790ffafc7b372f4af1fcbed406","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"4d4e3eb4_508411d0","updated":"2025-12-24 10:09:42.000000000","message":"Thank you for the patch, Nahian. I see there is ongoing discussions and outstanding comments so will leave these with those involved, yet I wanted to say I agree with the general direction and think this will be very useful in both reducing API load but also improving health reporting.","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"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":"b8647a67d5e95f06be7c34e6337095dfef253d61","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"57ed21fc_09cca2e5","updated":"2026-01-15 21:46:23.000000000","message":"This will also need a release note, especially if we change use of endpoints as proposed in the management.py comment.","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"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":"566013867dfd38a2e6c82d03ea6570f651720a57","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"5dc890e7_d0c0c3d7","updated":"2026-01-15 21:45:49.000000000","message":"You\u0027re saying we\u0027re relying on new sushy features, but there\u0027s no requirements.txt bump -- won\u0027t we need a newer sushy?","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"44853a6410ddf69c1f50358685f8a9350d3e4cb5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"4eeaca6d_a7cab9df","in_reply_to":"57ed21fc_09cca2e5","updated":"2026-01-27 23:12:38.000000000","message":"Added","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"3fc06e4508aebd6639cb2e3ca230fb3d38954748","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":14,"id":"a93cafbd_5ba9c4c3","in_reply_to":"5dc890e7_d0c0c3d7","updated":"2026-01-15 21:59:24.000000000","message":"The bump was already done for the LLDP support.","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"d0951750ded2217025a92a6acee3ea2d11db95c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"210a668a_5e99a56a","in_reply_to":"6950b805_6bf4db88","updated":"2026-01-27 20:18:39.000000000","message":"Done","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"4eb5366d430c6f399c15bb03bc1cc26090d75e5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"807c4c37_c5307976","in_reply_to":"923ab439_545f4fad","updated":"2026-01-27 20:18:14.000000000","message":"Done","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"4eb5366d430c6f399c15bb03bc1cc26090d75e5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"bd28f327_aeac85ae","in_reply_to":"a93cafbd_5ba9c4c3","updated":"2026-01-27 20:18:14.000000000","message":"Done","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"4eb5366d430c6f399c15bb03bc1cc26090d75e5a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":15,"id":"5a99111e_395348b5","updated":"2026-01-27 20:18:14.000000000","message":"This still needs a release note that @jay@jvf.cc asked for.","commit_id":"aef19302b1d5d24e2c7bd7b45290249836037b55"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"91c5a696c077b0054831d2f023757d4f55168253","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"7887b857_94466689","in_reply_to":"5a99111e_395348b5","updated":"2026-01-27 23:12:02.000000000","message":"Added!","commit_id":"aef19302b1d5d24e2c7bd7b45290249836037b55"},{"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":"62b8abac3495a7ab15ec68d78020c3fcfffc4ab3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":16,"id":"1774e928_54d4bc3e","updated":"2026-01-28 19:19:27.000000000","message":"Despite a GR-OSS group review with me, CID, Clif, there\u0027s not enough comfort with the hardware details baked into this change for a +2.\n\nIf you get desperate, ping me in IRC and let\u0027s talk.","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"5abe3e40e189c0db668af78c94858c99b8029d7a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"57a62979_e2d5238c","updated":"2026-02-04 05:32:15.000000000","message":"+2 based on the authors commitment to follow up","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"4a851f82b9622676e7eacb2071e272046d31b093","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"990ee016_b79ac858","updated":"2026-02-13 17:30:20.000000000","message":"Hi team, thanks for the merge. As promised, removed all the extra logs in https://review.opendev.org/c/openstack/ironic/+/976767 (adding most of as reviewers there)","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b0d0bd3dc8768729ae13381a36d1751d7f7bdda2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"db4ffc89_ea101ec1","updated":"2026-01-29 19:06:11.000000000","message":"I\u0027m overall good with the code, but as noted by Dmitry, the logging is a bit much. I\u0027d be +2 if we have a commitment to, or even a proposed start of a follow-up patch to dial back the logging. Debug logging where things are normally okay is just not the most helpful of patterns when someone may have a 500-1000 nodes being managed by the conductor process and trying to collect sensor data every minute.","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"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":"3d6e924575b829604bc6c54a0c27c8c4a5cdaff9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"ee52055f_003f1772","updated":"2026-02-10 18:42:47.000000000","message":"Please follow up with fixes for outstanding comments as promised. Thanks!","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1b3b646cb6a84620726bb554d7d27183c46db3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"2b37b522_805c650f","updated":"2026-01-29 17:03:02.000000000","message":"Some nits inline, can be fixed in a follow-up","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a6f5e51d980670ac50925c06e210b67711589760","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"24a5a903_3c8645ea","in_reply_to":"db4ffc89_ea101ec1","updated":"2026-01-29 20:47:43.000000000","message":"I\u0027ll get on that clean up right after this is merged. Keeping the rest of the comments unresolved till then. Maybe a ticket something would help? (sorry super new to openstack world, still learning the system!)","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"}],"ironic/drivers/modules/redfish/management.py":[{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"64cc1f4f5f69e153ecfa33cdfe1e45bebe87dc77","unresolved":true,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # If state is missing but health is reported, infer state from health"},{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"132603fa_90b34af7","line":712,"updated":"2025-11-18 23:19:01.000000000","message":"@iurygregory@gmail.com this seems to be an edge case seeing only for HP. basically no State for /storage \n\n```\n\u0027https://hp/redfish/v1/Systems/1/Storage/DA011400/Drives/DA011400/\u0027 | jq\n{\n  \"@odata.context\": \"/redfish/v1/$metadata#Drive.Drive\",\n  \"@odata.etag\": \"W/\\\"717826F7\\\"\",\n  \"@odata.id\": \"/redfish/v1/Systems/1/Storage/DA011400/Drives/DA011400/\",\n  \"@odata.type\": \"#Drive.v1_16_0.Drive\",\n  \"Id\": \"DA011400\",\n  \"Actions\": {\n    \"#Drive.Reset\": {\n      \"ResetValue@Redfish.AllowableValues\": [\n        \"ForceOff\",\n        \"ForceOn\",\n        \"PowerCycle\"\n      ],\n      \"target\": \"/redfish/v1/Systems/1/Storage/DA011400/Drives/DA011400/Actions/Drive.Reset/\"\n    }\n  },\n  \"CapacityBytes\": 480103981056,\n  \"EncryptionStatus\": \"Unencrypted\",\n  \"FailurePredicted\": false,\n  \"Identifiers\": [],\n  \"Location\": [\n    {\n      \"Info\": \"20\",\n      \"InfoFormat\": \"Slot\"\n    }\n  ],\n  \"Manufacturer\": \"Samsung\",\n  \"MediaType\": \"SSD\",\n  \"Model\": \"VR000480KXLXF\",\n  \"Name\": \"Samsung 0.00TB 0G NVME SSD\",\n  \"Oem\": {\n    \"Hpe\": {\n      \"@odata.context\": \"/redfish/v1/$metadata#HpeiLODriveExt.HpeiLODriveExt\",\n      \"@odata.type\": \"#HpeiLODriveExt.v2_0_1.HpeiLODriveExt\",\n      \"CurrentTemperatureCelsius\": 31,\n      \"DriveStatus\": {\n        \"Health\": \"OK\",\n        \"State\": \"Enabled\"\n      },\n      \"HealthUpdated\": \"Dynamic\",\n      \"NVMeId\": \"144d_VR000480KXLXF_S711NE0WB37676\",\n      \"PowerOnHours\": 13419,\n      \"TemperatureStatus\": {\n        \"Health\": \"OK\",\n        \"State\": \"Enabled\" ---------------------\u003e ??\n      },\n      \"WearStatus\": \"OK\"\n    }\n  },\n  \"Operations\": [],\n  \"PhysicalLocation\": {\n    \"PartLocation\": {\n      \"LocationOrdinalValue\": 20,\n      \"LocationType\": \"Slot\",\n      \"ServiceLabel\": \"Slot\u003d20\"\n    },\n    \"PhysicalAddress\": {}\n  },\n  \"PredictedMediaLifeLeftPercent\": 100,\n  \"Protocol\": \"NVMe\",\n  \"Revision\": \"HPK2\",\n  \"SerialNumber\": \"S711NE0WB37676\",\n  \"Status\": {\n    \"Health\": \"OK\" -----------------------------\u003e missing\n  }\n}\n```\n\nSince `state` is missing, Sushy returns a None, and IPE does .lower()...crashing IPE. IPE should handle this instead of doing a workaround here?","commit_id":"698c35fb232507823967e9431f7872bcbc403e89"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # If state is missing but health is reported, infer state from health"},{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"f30ef1ba_5fd09956","line":712,"in_reply_to":"132603fa_90b34af7","updated":"2025-12-10 16:42:40.000000000","message":"Eventually, we should fix IPE, but I\u0027m fine with merging the workaround to avoid breakage. Shouldn\u0027t it be in a separate patch though?","commit_id":"698c35fb232507823967e9431f7872bcbc403e89"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"577661ecb85e49f6111d1e4f2fd0f591385df89a","unresolved":false,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # If state is missing but health is reported, infer state from health"},{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a7a1773_a325a82d","line":712,"in_reply_to":"7b0605f7_7166cf3c","updated":"2025-12-19 22:11:36.000000000","message":"Ah i mixed the issues. Another PR for this specific makes sense. Ill start anotther thread around simplestorage https://review.opendev.org/c/openstack/ironic/+/971572","commit_id":"698c35fb232507823967e9431f7872bcbc403e89"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":true,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # If state is missing but health is reported, infer state from health"},{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7b0605f7_7166cf3c","line":712,"in_reply_to":"f30ef1ba_5fd09956","updated":"2025-12-12 19:47:26.000000000","message":"Yeah so originally we had some dead code around SimpleStorage (it was never really called)...so the problem only showed up recently. \n\nBut I\u0027m thinking if we should even use this SimpleStorage. So it looks like it\u0027s been deprecated. https://redfishforum.com/thread/483/different-storage-simplestorage \n\nSimpleStorage gave us way to make less API calls to collect Drive info, but given that it\u0027s deprecated...thinking if i just remove this and just take the hit on API calls. what do you think? it\u0027s saving maybe a little time but of course not enough at work scale anyway...","commit_id":"698c35fb232507823967e9431f7872bcbc403e89"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0398ede97681fcac69c3ef1ec146632f1555bc38","unresolved":true,"context_lines":[{"line_number":946,"context_line":"                try:"},{"line_number":947,"context_line":"                    # Process devices directly from SimpleStorage"},{"line_number":948,"context_line":"                    for device in simple_storage.devices:"},{"line_number":949,"context_line":"                        # Skip devices without capacity (e.g., backplanes, enclosures)"},{"line_number":950,"context_line":"                        # These are physical infrastructure, not storage drives."},{"line_number":951,"context_line":"                        # Including them causes Prometheus label inconsistency errors"},{"line_number":952,"context_line":"                        # since they lack fields like capacity_bytes that actual"}],"source_content_type":"text/x-python","patch_set":10,"id":"2e8b3fb3_24c14857","line":949,"updated":"2025-11-18 23:23:34.000000000","message":"Also another edge case, if capacity_bytes is missing IPE crashes. Should this be handled in IPE and/or also keep it here?","commit_id":"698c35fb232507823967e9431f7872bcbc403e89"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":719,"context_line":"        return unique_name, sensor"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"    def get_sensors_data(self, task):"},{"line_number":722,"context_line":"        # Note for dev: This function is called frequently (e.g 60s)"},{"line_number":723,"context_line":"        # So we must be careful about introducing new Redfish API"},{"line_number":724,"context_line":"        # calls as they tend to be slow. Depending on vendor"},{"line_number":725,"context_line":"        # this function may take up to 20s to finish."}],"source_content_type":"text/x-python","patch_set":12,"id":"303603f8_025afc5b","line":722,"updated":"2025-12-10 16:42:40.000000000","message":"nit: put the comment below the docstring","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        return unique_name, sensor"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"    def get_sensors_data(self, task):"},{"line_number":722,"context_line":"        # Note for dev: This function is called frequently (e.g 60s)"},{"line_number":723,"context_line":"        # So we must be careful about introducing new Redfish API"},{"line_number":724,"context_line":"        # calls as they tend to be slow. Depending on vendor"},{"line_number":725,"context_line":"        # this function may take up to 20s to finish."}],"source_content_type":"text/x-python","patch_set":12,"id":"4b299578_241ab124","line":722,"in_reply_to":"303603f8_025afc5b","updated":"2025-12-12 19:47:26.000000000","message":"done","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":789,"context_line":"            total \u003d time.time() - method_start"},{"line_number":790,"context_line":"            LOG.debug(\"Gathered sensor data for node %s in %.2f seconds: %s\","},{"line_number":791,"context_line":"                      node.uuid, total, sensors)"},{"line_number":792,"context_line":"        except Exception as exc:"},{"line_number":793,"context_line":"            LOG.error(\"Sensor collection failed for node %(node)s: %(error)s\","},{"line_number":794,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: exc})"},{"line_number":795,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"473e9f32_f0dca5a9","line":792,"updated":"2025-12-10 16:42:40.000000000","message":"I\u0027d rather avoid a large try..except block. First, because it\u0027s going to be pretty hard to debug. Second, because failing to collect one sensor now causes the entire sensor collection to fail.","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":789,"context_line":"            total \u003d time.time() - method_start"},{"line_number":790,"context_line":"            LOG.debug(\"Gathered sensor data for node %s in %.2f seconds: %s\","},{"line_number":791,"context_line":"                      node.uuid, total, sensors)"},{"line_number":792,"context_line":"        except Exception as exc:"},{"line_number":793,"context_line":"            LOG.error(\"Sensor collection failed for node %(node)s: %(error)s\","},{"line_number":794,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: exc})"},{"line_number":795,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"d22224a5_90f72bcb","line":792,"in_reply_to":"473e9f32_f0dca5a9","updated":"2025-12-12 19:47:26.000000000","message":"removed that giant try except!","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":887,"context_line":"                try:"},{"line_number":888,"context_line":"                    # Check and log if there\u0027s at least one drive"},{"line_number":889,"context_line":"                    if storage.drives_identities:"},{"line_number":890,"context_line":"                        LOG.info(\"Storage %s has %d drive links: %s\","},{"line_number":891,"context_line":"                                 storage.identity,"},{"line_number":892,"context_line":"                                 len(storage.drives_identities),"},{"line_number":893,"context_line":"                                 storage.drives_identities)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f1d5c1f_4534809d","line":890,"updated":"2025-12-10 16:42:40.000000000","message":"s/info/debug/\n\nIn fact, maybe we don\u0027t need this message at all given that sushy already logs all response objects","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":887,"context_line":"                try:"},{"line_number":888,"context_line":"                    # Check and log if there\u0027s at least one drive"},{"line_number":889,"context_line":"                    if storage.drives_identities:"},{"line_number":890,"context_line":"                        LOG.info(\"Storage %s has %d drive links: %s\","},{"line_number":891,"context_line":"                                 storage.identity,"},{"line_number":892,"context_line":"                                 len(storage.drives_identities),"},{"line_number":893,"context_line":"                                 storage.drives_identities)"}],"source_content_type":"text/x-python","patch_set":12,"id":"e34600e4_a2ecccf6","line":890,"in_reply_to":"1f1d5c1f_4534809d","updated":"2025-12-12 19:47:26.000000000","message":"removed the log","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":907,"context_line":"            # Log"},{"line_number":908,"context_line":"            total_storage_sensors \u003d len(storage_sensors[\u0027Drive\u0027])"},{"line_number":909,"context_line":"            storage_time \u003d time.time() - start_time"},{"line_number":910,"context_line":"            LOG.info(\"Storage processing completed for node %s: %d sensors \""},{"line_number":911,"context_line":"                     \"in %.2f seconds\","},{"line_number":912,"context_line":"                     node.uuid, total_storage_sensors, storage_time)"},{"line_number":913,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"c4e22f1a_6aeaba84","line":910,"updated":"2025-12-10 16:42:40.000000000","message":"Let\u0027s demote this message to debug level, it\u0027s only important for fine-tuning the performance","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":907,"context_line":"            # Log"},{"line_number":908,"context_line":"            total_storage_sensors \u003d len(storage_sensors[\u0027Drive\u0027])"},{"line_number":909,"context_line":"            storage_time \u003d time.time() - start_time"},{"line_number":910,"context_line":"            LOG.info(\"Storage processing completed for node %s: %d sensors \""},{"line_number":911,"context_line":"                     \"in %.2f seconds\","},{"line_number":912,"context_line":"                     node.uuid, total_storage_sensors, storage_time)"},{"line_number":913,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"c8fc8e1b_a35d1619","line":910,"in_reply_to":"c4e22f1a_6aeaba84","updated":"2025-12-12 19:47:26.000000000","message":"demoted","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":911,"context_line":"                     \"in %.2f seconds\","},{"line_number":912,"context_line":"                     node.uuid, total_storage_sensors, storage_time)"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"        except sushy.exceptions.SushyError as exc:"},{"line_number":915,"context_line":"            LOG.debug(\"Failed reading drive information for node \""},{"line_number":916,"context_line":"                      \"%(node)s: %(error)s\", {\u0027node\u0027: node.uuid,"},{"line_number":917,"context_line":"                                              \u0027error\u0027: exc})"}],"source_content_type":"text/x-python","patch_set":12,"id":"3dbe1bf8_496e8078","line":914,"updated":"2025-12-10 16:42:40.000000000","message":"Why not let this exception fall through? You already have a general try..except on the caller level","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":911,"context_line":"                     \"in %.2f seconds\","},{"line_number":912,"context_line":"                     node.uuid, total_storage_sensors, storage_time)"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"        except sushy.exceptions.SushyError as exc:"},{"line_number":915,"context_line":"            LOG.debug(\"Failed reading drive information for node \""},{"line_number":916,"context_line":"                      \"%(node)s: %(error)s\", {\u0027node\u0027: node.uuid,"},{"line_number":917,"context_line":"                                              \u0027error\u0027: exc})"}],"source_content_type":"text/x-python","patch_set":12,"id":"410b491b_a641550f","line":914,"in_reply_to":"3dbe1bf8_496e8078","updated":"2025-12-12 19:47:26.000000000","message":"We removed the giant caller-level try/except...so this local handling is now needed","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":971,"context_line":"            # Log"},{"line_number":972,"context_line":"            total_simple_storage_sensors \u003d len(simple_storage_sensors[\u0027Drive\u0027])"},{"line_number":973,"context_line":"            simple_storage_time \u003d time.time() - start_time"},{"line_number":974,"context_line":"            LOG.info(\"SimpleStorage processing completed for node %s: \""},{"line_number":975,"context_line":"                     \"%d sensors in %.2f seconds\","},{"line_number":976,"context_line":"                     node.uuid, total_simple_storage_sensors,"},{"line_number":977,"context_line":"                     simple_storage_time)"}],"source_content_type":"text/x-python","patch_set":12,"id":"cb908880_efb76ac9","line":974,"updated":"2025-12-10 16:42:40.000000000","message":"same, s/info/debug/","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":971,"context_line":"            # Log"},{"line_number":972,"context_line":"            total_simple_storage_sensors \u003d len(simple_storage_sensors[\u0027Drive\u0027])"},{"line_number":973,"context_line":"            simple_storage_time \u003d time.time() - start_time"},{"line_number":974,"context_line":"            LOG.info(\"SimpleStorage processing completed for node %s: \""},{"line_number":975,"context_line":"                     \"%d sensors in %.2f seconds\","},{"line_number":976,"context_line":"                     node.uuid, total_simple_storage_sensors,"},{"line_number":977,"context_line":"                     simple_storage_time)"}],"source_content_type":"text/x-python","patch_set":12,"id":"e0d6c7e8_87240971","line":974,"in_reply_to":"cb908880_efb76ac9","updated":"2025-12-12 19:47:26.000000000","message":"done","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3a4b9a74c5db1d3fc01e932f4982f2081519619f","unresolved":true,"context_lines":[{"line_number":979,"context_line":"        except sushy.exceptions.MissingAttributeError:"},{"line_number":980,"context_line":"            # Re-raise MissingAttributeError so caller can fall back to Storage"},{"line_number":981,"context_line":"            raise"},{"line_number":982,"context_line":"        except sushy.exceptions.SushyError as exc:"},{"line_number":983,"context_line":"            LOG.debug(\"Failed reading simple storage information for node \""},{"line_number":984,"context_line":"                      \"%(node)s: %(error)s\", {\u0027node\u0027: node.uuid,"},{"line_number":985,"context_line":"                                              \u0027error\u0027: exc})"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ab23636_15644e0f","line":982,"updated":"2025-12-10 16:42:40.000000000","message":"Why not let this exception fall through? You already have a general try..except on the caller level","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a233f50b1ebdf406278f18bc0c03c3b1e07ee49b","unresolved":false,"context_lines":[{"line_number":979,"context_line":"        except sushy.exceptions.MissingAttributeError:"},{"line_number":980,"context_line":"            # Re-raise MissingAttributeError so caller can fall back to Storage"},{"line_number":981,"context_line":"            raise"},{"line_number":982,"context_line":"        except sushy.exceptions.SushyError as exc:"},{"line_number":983,"context_line":"            LOG.debug(\"Failed reading simple storage information for node \""},{"line_number":984,"context_line":"                      \"%(node)s: %(error)s\", {\u0027node\u0027: node.uuid,"},{"line_number":985,"context_line":"                                              \u0027error\u0027: exc})"}],"source_content_type":"text/x-python","patch_set":12,"id":"c5fb0f87_3b9669cb","line":982,"in_reply_to":"1ab23636_15644e0f","updated":"2025-12-12 19:47:26.000000000","message":"We removed the giant caller-level try/except...so this local handling is now needed","commit_id":"0ce79c4a63173fa118d7cc1c9f6c3b7089c049a2"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3c9c4cf68ba9de5338192c1a474a36db0da8853d","unresolved":true,"context_lines":[{"line_number":721,"context_line":"        \"\"\"Get sensors data."},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        :param task: a TaskManager instance."},{"line_number":724,"context_line":"        :raises: FailedToGetSensorData when getting the sensor data fails."},{"line_number":725,"context_line":"        :raises: FailedToParseSensorData when parsing sensor data fails."},{"line_number":726,"context_line":"        :raises: InvalidParameterValue if required parameters"},{"line_number":727,"context_line":"                 are missing."}],"source_content_type":"text/x-python","patch_set":13,"id":"700987b8_280c5f39","side":"PARENT","line":724,"updated":"2025-12-16 18:15:07.000000000","message":"Are all these Exceptions really no longer raised? I see some may be handled in new try/except blocks, but not all.","commit_id":"530c88757afd49467cfed7dd31d18cbc4e055f2c"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a742287b277c799909839816e4e6a43afc2217d2","unresolved":false,"context_lines":[{"line_number":721,"context_line":"        \"\"\"Get sensors data."},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        :param task: a TaskManager instance."},{"line_number":724,"context_line":"        :raises: FailedToGetSensorData when getting the sensor data fails."},{"line_number":725,"context_line":"        :raises: FailedToParseSensorData when parsing sensor data fails."},{"line_number":726,"context_line":"        :raises: InvalidParameterValue if required parameters"},{"line_number":727,"context_line":"                 are missing."}],"source_content_type":"text/x-python","patch_set":13,"id":"9e100916_f6f5c580","side":"PARENT","line":724,"in_reply_to":"04f90e9c_70415143","updated":"2026-01-05 14:33:52.000000000","message":"Done","commit_id":"530c88757afd49467cfed7dd31d18cbc4e055f2c"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0698b295a58a64c320bf4cf08b4d988321517321","unresolved":true,"context_lines":[{"line_number":721,"context_line":"        \"\"\"Get sensors data."},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        :param task: a TaskManager instance."},{"line_number":724,"context_line":"        :raises: FailedToGetSensorData when getting the sensor data fails."},{"line_number":725,"context_line":"        :raises: FailedToParseSensorData when parsing sensor data fails."},{"line_number":726,"context_line":"        :raises: InvalidParameterValue if required parameters"},{"line_number":727,"context_line":"                 are missing."}],"source_content_type":"text/x-python","patch_set":13,"id":"04f90e9c_70415143","side":"PARENT","line":724,"in_reply_to":"700987b8_280c5f39","updated":"2025-12-18 20:03:11.000000000","message":"The Redfish driver never raised these. Likely copy-pasted from IPMI\u0027s docstring. One possible source...if `redfish_utils.get_system()` fails but the caller is catching it.","commit_id":"530c88757afd49467cfed7dd31d18cbc4e055f2c"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3c9c4cf68ba9de5338192c1a474a36db0da8853d","unresolved":true,"context_lines":[{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        unique_name \u003d \u0027%s:%s@%s\u0027 % ("},{"line_number":717,"context_line":"            drive.name, storage_identity, system_identity)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fc54bcb4_7d35d749","line":714,"updated":"2025-12-16 18:15:07.000000000","message":"How safe is this assumption? Would it be possible to also record (or at least log) that this is inferred?","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0698b295a58a64c320bf4cf08b4d988321517321","unresolved":true,"context_lines":[{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        unique_name \u003d \u0027%s:%s@%s\u0027 % ("},{"line_number":717,"context_line":"            drive.name, storage_identity, system_identity)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fe9eba10_6b69101d","line":714,"in_reply_to":"fc54bcb4_7d35d749","updated":"2025-12-18 20:03:11.000000000","message":"The assumption is safe imo...if a drive reports health (OK/Warning/Critical), it\u0027s operational\n\nadded a log!","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a742287b277c799909839816e4e6a43afc2217d2","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        # Some vendors (e.g., HPE) omit State from Drive Status"},{"line_number":712,"context_line":"        if not sensor.get(\u0027state\u0027) and sensor.get(\u0027health\u0027):"},{"line_number":713,"context_line":"            # If drive is reporting health status, assume it\u0027s enabled"},{"line_number":714,"context_line":"            sensor[\u0027state\u0027] \u003d \u0027Enabled\u0027"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        unique_name \u003d \u0027%s:%s@%s\u0027 % ("},{"line_number":717,"context_line":"            drive.name, storage_identity, system_identity)"}],"source_content_type":"text/x-python","patch_set":13,"id":"cde7bd6e_931f88ed","line":714,"in_reply_to":"fe9eba10_6b69101d","updated":"2026-01-05 14:33:52.000000000","message":"Done","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3c9c4cf68ba9de5338192c1a474a36db0da8853d","unresolved":true,"context_lines":[{"line_number":934,"context_line":"            # Process devices from all simple storage controllers"},{"line_number":935,"context_line":"            for simple_storage in ("},{"line_number":936,"context_line":"                    simple_storage_collection_expanded.get_members()):"},{"line_number":937,"context_line":"                try:"},{"line_number":938,"context_line":"                    # Process devices directly from SimpleStorage"},{"line_number":939,"context_line":"                    for device in simple_storage.devices:"},{"line_number":940,"context_line":"                        # Skip devices without capacity (e.g., backplanes,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a44b3ce_1d60871b","line":937,"updated":"2025-12-16 18:15:07.000000000","message":"Does the failure to get a drive\u0027s sensor from one device indicate an overall failure for all devices?","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"a742287b277c799909839816e4e6a43afc2217d2","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            # Process devices from all simple storage controllers"},{"line_number":935,"context_line":"            for simple_storage in ("},{"line_number":936,"context_line":"                    simple_storage_collection_expanded.get_members()):"},{"line_number":937,"context_line":"                try:"},{"line_number":938,"context_line":"                    # Process devices directly from SimpleStorage"},{"line_number":939,"context_line":"                    for device in simple_storage.devices:"},{"line_number":940,"context_line":"                        # Skip devices without capacity (e.g., backplanes,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9302d47d_572f5ae0","line":937,"in_reply_to":"393fc22b_c45bc100","updated":"2026-01-05 14:33:52.000000000","message":"Done","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"0698b295a58a64c320bf4cf08b4d988321517321","unresolved":true,"context_lines":[{"line_number":934,"context_line":"            # Process devices from all simple storage controllers"},{"line_number":935,"context_line":"            for simple_storage in ("},{"line_number":936,"context_line":"                    simple_storage_collection_expanded.get_members()):"},{"line_number":937,"context_line":"                try:"},{"line_number":938,"context_line":"                    # Process devices directly from SimpleStorage"},{"line_number":939,"context_line":"                    for device in simple_storage.devices:"},{"line_number":940,"context_line":"                        # Skip devices without capacity (e.g., backplanes,"}],"source_content_type":"text/x-python","patch_set":13,"id":"393fc22b_c45bc100","line":937,"in_reply_to":"7a44b3ce_1d60871b","updated":"2025-12-18 20:03:11.000000000","message":"No. The try/except is inside the controller loop, so if one controller fails, we log it and continue to the next controller.","commit_id":"824a30bb6235a5fa2e4b56442dfcbe07d2809cde"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"d5c3f771b4690a4aacd8a17c7229fc57f2373700","unresolved":true,"context_lines":[{"line_number":932,"context_line":"        try:"},{"line_number":933,"context_line":"            drives \u003d {}"},{"line_number":934,"context_line":"            # 1 API call to get all SimpleStorage with devices expanded"},{"line_number":935,"context_line":"            simple_storage_collection_expanded \u003d system.simple_storage_expanded"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"            # Process devices from all simple storage controllers"},{"line_number":938,"context_line":"            for simple_storage in ("}],"source_content_type":"text/x-python","patch_set":14,"id":"573fa9e6_7c6f5efd","line":935,"updated":"2025-12-19 22:13:34.000000000","message":"SimpleStorage gave us way to make less API calls to collect Drive info, but given that it\u0027s deprecated...thinking if i just remove this and just take the hit on API calls. what do you think? it\u0027s saving maybe a little time but of course not enough at work scale anyway...\n\n@dtantsur@protonmail.com @iurygregory@gmail.com","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1b3b646cb6a84620726bb554d7d27183c46db3e","unresolved":true,"context_lines":[{"line_number":932,"context_line":"        try:"},{"line_number":933,"context_line":"            drives \u003d {}"},{"line_number":934,"context_line":"            # 1 API call to get all SimpleStorage with devices expanded"},{"line_number":935,"context_line":"            simple_storage_collection_expanded \u003d system.simple_storage_expanded"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"            # Process devices from all simple storage controllers"},{"line_number":938,"context_line":"            for simple_storage in ("}],"source_content_type":"text/x-python","patch_set":14,"id":"2acc237f_19a71e7f","line":935,"in_reply_to":"573fa9e6_7c6f5efd","updated":"2026-01-29 17:03:02.000000000","message":"Does it hurt to have efficient simple storage support still?","commit_id":"39cd682515accbb466ce7b6904d43e5c101b8989"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a4d0c3734979ac658580bfdb764bf43230c24732","unresolved":true,"context_lines":[{"line_number":823,"context_line":"                # Storage requires following drive links (1+M calls)"},{"line_number":824,"context_line":"                drive_data \u003d self._process_storage_sensors("},{"line_number":825,"context_line":"                    node, system)"},{"line_number":826,"context_line":"                LOG.warning(\"Falling back to Storage for drive \""},{"line_number":827,"context_line":"                            \"sensors on %s (less efficient than \""},{"line_number":828,"context_line":"                            \"SimpleStorage)\", node.uuid)"},{"line_number":829,"context_line":"            except sushy.exceptions.MissingAttributeError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"b1eb98b9_9c2c78b8","line":826,"updated":"2026-01-28 19:19:22.000000000","message":"Not actionable, should be debug. This is from a group GR-OSS review session.","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"d3c9e3db5bd127d180108badfe236a9a9c6dafc9","unresolved":false,"context_lines":[{"line_number":823,"context_line":"                # Storage requires following drive links (1+M calls)"},{"line_number":824,"context_line":"                drive_data \u003d self._process_storage_sensors("},{"line_number":825,"context_line":"                    node, system)"},{"line_number":826,"context_line":"                LOG.warning(\"Falling back to Storage for drive \""},{"line_number":827,"context_line":"                            \"sensors on %s (less efficient than \""},{"line_number":828,"context_line":"                            \"SimpleStorage)\", node.uuid)"},{"line_number":829,"context_line":"            except sushy.exceptions.MissingAttributeError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3892a5fb_752d11a2","line":826,"in_reply_to":"b1eb98b9_9c2c78b8","updated":"2026-01-28 20:22:39.000000000","message":"updated to debug","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a4d0c3734979ac658580bfdb764bf43230c24732","unresolved":true,"context_lines":[{"line_number":858,"context_line":"            chassis \u003d chassis_list[0] if chassis_list else None"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"            if not chassis:"},{"line_number":861,"context_line":"                LOG.warning(\"No chassis found for node %s\", node.uuid)"},{"line_number":862,"context_line":"                return sensors"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3411beb2_9ae4c238","line":861,"updated":"2026-01-28 19:19:22.000000000","message":"This should probably be a debug log because the operator cannot act on it.","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"d3c9e3db5bd127d180108badfe236a9a9c6dafc9","unresolved":false,"context_lines":[{"line_number":858,"context_line":"            chassis \u003d chassis_list[0] if chassis_list else None"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"            if not chassis:"},{"line_number":861,"context_line":"                LOG.warning(\"No chassis found for node %s\", node.uuid)"},{"line_number":862,"context_line":"                return sensors"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"6d8816de_e4f31c87","line":861,"in_reply_to":"3411beb2_9ae4c238","updated":"2026-01-28 20:22:39.000000000","message":"updated to debug","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a4d0c3734979ac658580bfdb764bf43230c24732","unresolved":true,"context_lines":[{"line_number":894,"context_line":"                      node.uuid, total_chassis_sensors, chassis_time)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"        except Exception as exc:"},{"line_number":897,"context_line":"            LOG.warning(\"Failed reading expanded chassis information for \""},{"line_number":898,"context_line":"                        \"node %(node)s: %(error)s\","},{"line_number":899,"context_line":"                        {\u0027node\u0027: node.uuid, \u0027error\u0027: exc})"},{"line_number":900,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"75e3e57d_a6413323","line":897,"updated":"2026-01-28 19:19:22.000000000","message":"Repeating other comments, this should be debug, applies to other points where this is true.","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":38165,"name":"Nahian Pathan","display_name":"Nahian","email":"npathan@redhat.com","username":"pixelsoccupied"},"change_message_id":"d3c9e3db5bd127d180108badfe236a9a9c6dafc9","unresolved":false,"context_lines":[{"line_number":894,"context_line":"                      node.uuid, total_chassis_sensors, chassis_time)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"        except Exception as exc:"},{"line_number":897,"context_line":"            LOG.warning(\"Failed reading expanded chassis information for \""},{"line_number":898,"context_line":"                        \"node %(node)s: %(error)s\","},{"line_number":899,"context_line":"                        {\u0027node\u0027: node.uuid, \u0027error\u0027: exc})"},{"line_number":900,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"e18ff280_b004e194","line":897,"in_reply_to":"75e3e57d_a6413323","updated":"2026-01-28 20:22:39.000000000","message":"updated to debug","commit_id":"bdbdc09bbdd8ac7d7a153d86c388b36beebbf889"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1b3b646cb6a84620726bb554d7d27183c46db3e","unresolved":true,"context_lines":[{"line_number":811,"context_line":"            drive_data \u003d self._process_simple_storage_sensors("},{"line_number":812,"context_line":"                node, system)"},{"line_number":813,"context_line":"            simple_storage_available \u003d True"},{"line_number":814,"context_line":"            LOG.debug(\"Using SimpleStorage for drive sensors on %s\","},{"line_number":815,"context_line":"                      node.uuid)"},{"line_number":816,"context_line":"        except sushy.exceptions.MissingAttributeError:"},{"line_number":817,"context_line":"            LOG.debug(\"SimpleStorage not available for node %s\","}],"source_content_type":"text/x-python","patch_set":17,"id":"8777719b_f83c8d3a","line":814,"updated":"2026-01-29 17:03:02.000000000","message":"I think we also should be careful with logging that happens for each node on each iteration - like this one. I\u0027d prefer to log only unusual situations.","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b0d0bd3dc8768729ae13381a36d1751d7f7bdda2","unresolved":true,"context_lines":[{"line_number":811,"context_line":"            drive_data \u003d self._process_simple_storage_sensors("},{"line_number":812,"context_line":"                node, system)"},{"line_number":813,"context_line":"            simple_storage_available \u003d True"},{"line_number":814,"context_line":"            LOG.debug(\"Using SimpleStorage for drive sensors on %s\","},{"line_number":815,"context_line":"                      node.uuid)"},{"line_number":816,"context_line":"        except sushy.exceptions.MissingAttributeError:"},{"line_number":817,"context_line":"            LOG.debug(\"SimpleStorage not available for node %s\","}],"source_content_type":"text/x-python","patch_set":17,"id":"224e4efa_c427a893","line":814,"in_reply_to":"8777719b_f83c8d3a","updated":"2026-01-29 19:06:11.000000000","message":"++, I agree. I can see it being useful for development purposes, but a lot of folks always run in debug mode and this can very quickly become a flood of lot entries.","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1b3b646cb6a84620726bb554d7d27183c46db3e","unresolved":true,"context_lines":[{"line_number":814,"context_line":"            LOG.debug(\"Using SimpleStorage for drive sensors on %s\","},{"line_number":815,"context_line":"                      node.uuid)"},{"line_number":816,"context_line":"        except sushy.exceptions.MissingAttributeError:"},{"line_number":817,"context_line":"            LOG.debug(\"SimpleStorage not available for node %s\","},{"line_number":818,"context_line":"                      node.uuid)"},{"line_number":819,"context_line":""},{"line_number":820,"context_line":"        # Fall back to Storage only if SimpleStorage is not available"}],"source_content_type":"text/x-python","patch_set":17,"id":"b89bd3ef_52983fb2","line":817,"updated":"2026-01-29 17:03:02.000000000","message":"And I\u0027d also skip this in favour of 826 and 830 (either will be logged in this case)","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1b3b646cb6a84620726bb554d7d27183c46db3e","unresolved":true,"context_lines":[{"line_number":832,"context_line":"        sensors[\u0027Drive\u0027].update(drive_data.get(\u0027Drive\u0027, {}))"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"        total \u003d time.time() - method_start"},{"line_number":835,"context_line":"        LOG.debug(\"Gathered sensor data for node %s in %.2f seconds: %s\","},{"line_number":836,"context_line":"                  node.uuid, total, sensors)"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"        return sensors"}],"source_content_type":"text/x-python","patch_set":17,"id":"1fd70a46_f9c679ac","line":835,"updated":"2026-01-29 17:03:02.000000000","message":"Same here: timing is handy, but it\u0027s a few more log records per node per iteration","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b0d0bd3dc8768729ae13381a36d1751d7f7bdda2","unresolved":true,"context_lines":[{"line_number":832,"context_line":"        sensors[\u0027Drive\u0027].update(drive_data.get(\u0027Drive\u0027, {}))"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"        total \u003d time.time() - method_start"},{"line_number":835,"context_line":"        LOG.debug(\"Gathered sensor data for node %s in %.2f seconds: %s\","},{"line_number":836,"context_line":"                  node.uuid, total, sensors)"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"        return sensors"}],"source_content_type":"text/x-python","patch_set":17,"id":"76a4b490_4610ebb4","line":835,"in_reply_to":"1fd70a46_f9c679ac","updated":"2026-01-29 19:06:11.000000000","message":"Personally, I\u0027d make it configurable, and just default it to false. Definitely handy, just not handy in normal operational situations.","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1b3b646cb6a84620726bb554d7d27183c46db3e","unresolved":true,"context_lines":[{"line_number":889,"context_line":"            # Log"},{"line_number":890,"context_line":"            total_chassis_sensors \u003d sum(len(data) for data in sensors.values())"},{"line_number":891,"context_line":"            chassis_time \u003d time.time() - start_time"},{"line_number":892,"context_line":"            LOG.debug(\"Chassis processing completed for node %s: %d sensors \""},{"line_number":893,"context_line":"                      \"in %.2f seconds\","},{"line_number":894,"context_line":"                      node.uuid, total_chassis_sensors, chassis_time)"},{"line_number":895,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"0fbe0a13_b52b60a8","line":892,"updated":"2026-01-29 17:03:02.000000000","message":"Same here","commit_id":"c5c0bba74c6b7ca155e44e0d725331711b05bb60"}]}
