)]}'
{"/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":"63311078a7023c91f353840d3009ad433a5fc536","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Asynchronous Redfish client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add the support to the expand calls."},{"line_number":10,"context_line":"Add `types-python-dateutil1` to tox.ini, so tox-mypy can pass on CI."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Specify in `firmware_utils` from where the `RedfishError` exception"},{"line_number":13,"context_line":"comes, since we now also have it in `ironic.common.redfish.exceptions`."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"0051eb75_a01fc3bf","line":10,"updated":"2026-11-05 22:33:32.000000000","message":"we added types-python-dateutil (no 1)","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"4f03cf2dbc1f4326e83f0783f10d8a8eb2ae260c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Asynchronous Redfish client"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add the support to the expand calls."},{"line_number":10,"context_line":"Add `types-python-dateutil1` to tox.ini, so tox-mypy can pass on CI."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Specify in `firmware_utils` from where the `RedfishError` exception"},{"line_number":13,"context_line":"comes, since we now also have it in `ironic.common.redfish.exceptions`."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"652f674a_0aa0b652","line":10,"in_reply_to":"0051eb75_a01fc3bf","updated":"2026-11-06 13:32:06.000000000","message":"Done","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"e6a1da61042822fc849e507541c907600387466d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"ce80a094_69e0accd","updated":"2026-09-15 11:24:16.000000000","message":"recheck a lot of node failures","commit_id":"0ea18ec5efd2d004a7c9011c62a7cbe6a554126e"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"1c08aac3dadde97665a07a7a76a28fe96eadfefe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"eb8391b1_aa775b6d","updated":"2026-09-28 01:41:43.000000000","message":"recheck some post-failures","commit_id":"f8e991ae7484dab56c0cee93f32475bc87e58fcf"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ff655917196e29405a8de74d654cafe4d2d20e6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"039d7a7e_f217fada","updated":"2026-11-04 12:11:44.000000000","message":"Thank you Riccardo! I will update code and the unit tests and re-run things on my bifrost setup to validate things are still working","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"},{"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":"16ca749830c6dbb9f76eb62d40da64fe73861700","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"abfdc343_c65b3d24","updated":"2026-11-05 22:10:31.000000000","message":"IMO 5000 line changes are difficult to review in a complete manner. Ideally this would get broken up some if possible.","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"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":"63311078a7023c91f353840d3009ad433a5fc536","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"666552b7_70f54f84","updated":"2026-11-05 22:33:32.000000000","message":"This is too much code for me to ever really feel great +2\u0027ing. I gave it a best effort review.\n\nReview was assisted by GLM-5.3","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"6b2a35c40beedfea463e7ce781a811aa4e120e54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"b25dded1_2cf044ef","in_reply_to":"666552b7_70f54f84","updated":"2026-11-10 16:00:22.000000000","message":"Done, patch split in 3 parts","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"6b2a35c40beedfea463e7ce781a811aa4e120e54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"5340ede0_68be7008","in_reply_to":"abfdc343_c65b3d24","updated":"2026-11-10 16:00:22.000000000","message":"Done","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"}],"ironic/common/redfish/auth.py":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"60bdb4db7b845fb4eda56c4d62ba408fe3d1305f","unresolved":true,"context_lines":[{"line_number":150,"context_line":"                  {\u0027user\u0027: self._username})"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # POST to SessionService to create session"},{"line_number":153,"context_line":"        session_service_path \u003d \u0027/redfish/v1/SessionService/Sessions\u0027"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            response \u003d await self._connector.post("}],"source_content_type":"text/x-python","patch_set":16,"id":"1e5da723_67f3f03f","line":153,"updated":"2026-11-05 09:29:37.000000000","message":"the client accepts a custom root prefix, but this is hardcoded","commit_id":"a16e077ae7558a5c7e6e0188fff6d9f55335871d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7226d7d5454e1414125a59495061f2ce2561c75f","unresolved":true,"context_lines":[{"line_number":150,"context_line":"                  {\u0027user\u0027: self._username})"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # POST to SessionService to create session"},{"line_number":153,"context_line":"        session_service_path \u003d \u0027/redfish/v1/SessionService/Sessions\u0027"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            response \u003d await self._connector.post("}],"source_content_type":"text/x-python","patch_set":16,"id":"873d825d_ce7e23be","line":153,"in_reply_to":"1e5da723_67f3f03f","updated":"2026-11-05 11:51:28.000000000","message":"Yeah, it should be discoverable. IIRC sushy uses this path as a fallback.","commit_id":"a16e077ae7558a5c7e6e0188fff6d9f55335871d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"3a87da07cc2fc2f0e3e26945047e4b73c362e89b","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                  {\u0027user\u0027: self._username})"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # POST to SessionService to create session"},{"line_number":153,"context_line":"        session_service_path \u003d \u0027/redfish/v1/SessionService/Sessions\u0027"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            response \u003d await self._connector.post("}],"source_content_type":"text/x-python","patch_set":16,"id":"944eac41_a3156976","line":153,"in_reply_to":"873d825d_ce7e23be","updated":"2026-11-05 12:35:06.000000000","message":"ack","commit_id":"a16e077ae7558a5c7e6e0188fff6d9f55335871d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"4f03cf2dbc1f4326e83f0783f10d8a8eb2ae260c","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"8d6b9924_bd9ec190","line":337,"updated":"2026-11-06 13:32:06.000000000","message":"Hey Jay, right it makes sense. Thanks for raising this, I think it would probably be better to have a separate block for the ConnectionError, instead of having on L325, so we don\u0027t fallback to basic auth, but let\u0027s see what others have a security concern or not..","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"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":"63311078a7023c91f353840d3009ad433a5fc536","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"446e8028_8b25eb70","line":337,"updated":"2026-11-05 22:33:32.000000000","message":"If there\u0027s a ConnectionError on login, it seems like it\u0027d fall back here. This may be a situation where we might fallback invalidly to basic auth. I don\u0027t know well enough to know if that\u0027s a security concern that we could go from sessions-based to basic... but still seems non-ideal. We probably need to add ConnectionError on line 325","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"31ec5ee40dec54b57a90e70e6899320617598959","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f4467f6_b990532f","line":337,"in_reply_to":"32e01400_a5233a38","updated":"2026-11-09 11:29:53.000000000","message":"Right, this makes sense.\nPreviously we were not following sushy, since we only had AccessError and a bare Exception, so connectivity failure would fell trough to basic auth. Now we go with ConnectionError and a re-raise and handling RedfishError (equivalent to SushyError).\n\nI also asked claude to re-review and it found one difference\n\"sushy\u0027s create_session (main.py:460) checks X-Auth-Token before reading Location, so a BMC returning 201 + Location with no token leaves a session sushy never recorded — unusable and undeletable. This patch reads the Location first and logs it at warning before raising. That\u0027s intentionally better than sushy\"\n\nI can upload a new patchset to match the current implementation in sushy.","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4d2d273b02c7cf989a2e9d9a24e8b6a725d3f924","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"90a45eb3_f45b4cab","line":337,"in_reply_to":"3f4467f6_b990532f","updated":"2026-11-09 15:51:40.000000000","message":"I don\u0027t suggest we reproduce the Location bug but everything else should be kept close to sushy behavior. If we find something not great from the security perspective, let\u0027s fix it in two places.","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"47db7d94ecc0cbadba77887d06d054bf30248b84","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7813ac11_cbf80a68","line":337,"in_reply_to":"446e8028_8b25eb70","updated":"2026-11-09 16:15:57.000000000","message":"Done","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"5a29c2e9fdd0ce6e850abd02c8a021f80efb86eb","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"32e01400_a5233a38","line":337,"in_reply_to":"6ad5792a_c41f6fdf","updated":"2026-11-09 09:52:43.000000000","message":"What does sushy do? The last thing we want to do is for two of these to behave differently.","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"301023e286deb80cc06ebacf6d4c32ba27e7770c","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"6ad5792a_c41f6fdf","line":337,"in_reply_to":"783b51f6_4f6d0c1a","updated":"2026-11-07 15:27:11.000000000","message":"yeah I think re-raising is valid and have a fallback also.","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"437909b17d652a8c5212546a2979be54d802a1a7","unresolved":true,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"783b51f6_4f6d0c1a","line":337,"in_reply_to":"8d6b9924_bd9ec190","updated":"2026-11-06 14:07:50.000000000","message":"I think Jay\u0027s concern is valid, and on top of that the fall back could actually mask connectivity failure and leave orphaned sessions\nnot sure how to go around that\nmaybe re-raising ConnectionError before the fallback handler ?\nfall back should probably be limited to errors that indicate session auth is not supported","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"47db7d94ecc0cbadba77887d06d054bf30248b84","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                LOG.error(\u0027Session authentication failed after previously \u0027"},{"line_number":335,"context_line":"                          \u0027working. Error: %(error)s\u0027, {\u0027error\u0027: e})"},{"line_number":336,"context_line":"                raise"},{"line_number":337,"context_line":"        except Exception as e:"},{"line_number":338,"context_line":"            # For other exceptions, try fallback if no session was established"},{"line_number":339,"context_line":"            if (not self.can_refresh_session()"},{"line_number":340,"context_line":"                    and not self._session_auth_previously_successful):"}],"source_content_type":"text/x-python","patch_set":17,"id":"4664663e_201bdd7e","line":337,"in_reply_to":"90a45eb3_f45b4cab","updated":"2026-11-09 16:15:57.000000000","message":"Agree, to keep full things more close to sushy I will update the LOG level (in sushy it\u0027s warning and here it\u0027s set to debug).","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"}],"ironic/common/redfish/client.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":"63311078a7023c91f353840d3009ad433a5fc536","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            auth_type\u003d\u0027auto\u0027"},{"line_number":46,"context_line":"        ) as client:"},{"line_number":47,"context_line":"            # Get a single system"},{"line_number":48,"context_line":"            system \u003d await client.get_system()"},{"line_number":49,"context_line":"            print(system.field(\u0027Manufacturer\u0027))"},{"line_number":50,"context_line":"            print(system.field(\u0027PowerState\u0027))"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"0d615d2c_e9749cd4","line":48,"updated":"2026-11-05 22:33:32.000000000","message":"this doesn\u0027t exist? (client.get_system())?","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"33c707b23efa030859814923047fd0484d8eafcb","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            auth_type\u003d\u0027auto\u0027"},{"line_number":46,"context_line":"        ) as client:"},{"line_number":47,"context_line":"            # Get a single system"},{"line_number":48,"context_line":"            system \u003d await client.get_system()"},{"line_number":49,"context_line":"            print(system.field(\u0027Manufacturer\u0027))"},{"line_number":50,"context_line":"            print(system.field(\u0027PowerState\u0027))"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"d7f15f06_92bc2259","line":48,"in_reply_to":"0d615d2c_e9749cd4","updated":"2026-11-06 13:55:11.000000000","message":"Right, this was in the initial implementation Dmitry did, I forgot to update things while re-working on the patch 🫥","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"}],"ironic/common/redfish/connector.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        :raises: Various HTTP exceptions on HTTP errors."},{"line_number":393,"context_line":"        \"\"\""},{"line_number":394,"context_line":"        response \u003d await self._request(\u0027GET\u0027, path, headers\u003dheaders,"},{"line_number":395,"context_line":"                                        timeout\u003dtimeout)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"        # Parse JSON response"},{"line_number":398,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5182c870_4ac1ca78","line":395,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        :raises: Various HTTP exceptions on HTTP errors."},{"line_number":418,"context_line":"        \"\"\""},{"line_number":419,"context_line":"        return await self._request(\u0027POST\u0027, path, data\u003ddata, headers\u003dheaders,"},{"line_number":420,"context_line":"                                    timeout\u003dtimeout)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"    async def delete(self, path\u003d\u0027\u0027, headers\u003dNone, timeout\u003dNone):"},{"line_number":423,"context_line":"        \"\"\"Async HTTP DELETE method."}],"source_content_type":"text/x-python","patch_set":9,"id":"8f6a0853_5b231fcb","line":420,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        :raises: Various HTTP exceptions on HTTP errors."},{"line_number":431,"context_line":"        \"\"\""},{"line_number":432,"context_line":"        return await self._request(\u0027DELETE\u0027, path, headers\u003dheaders,"},{"line_number":433,"context_line":"                                    timeout\u003dtimeout)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    async def _etag_handler(self, path\u003d\u0027\u0027, data\u003dNone, headers\u003dNone,"},{"line_number":436,"context_line":"                            etag\u003dNone, timeout\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ac8cf1ce_b3807b4c","line":433,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":536,"context_line":"        :raises: Various HTTP exceptions on HTTP errors."},{"line_number":537,"context_line":"        \"\"\""},{"line_number":538,"context_line":"        return await self._request(\u0027PUT\u0027, path, data\u003ddata, headers\u003dheaders,"},{"line_number":539,"context_line":"                                    timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a9a64e5f_46c8371d","line":539,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"18a0c9b45efa991fcfff71397c7c4c044672e7b4","unresolved":true,"context_lines":[{"line_number":260,"context_line":"                    timeout\u003dtimeout"},{"line_number":261,"context_line":"                )"},{"line_number":262,"context_line":"                break  # Success, exit retry loop"},{"line_number":263,"context_line":"            except (httpx.ConnectError, httpx.ReadTimeout, httpx.WriteTimeout,"},{"line_number":264,"context_line":"                    httpx.PoolTimeout, httpx.ConnectTimeout) as e:"},{"line_number":265,"context_line":"                # Retry transient connection errors"},{"line_number":266,"context_line":"                if attempt \u003c max_retries - 1:"}],"source_content_type":"text/x-python","patch_set":15,"id":"eb0c8b44_6c5c5d36","line":263,"updated":"2026-11-04 08:49:58.000000000","message":"should we avoid retrying POST/PATCH after a read or write timeout? If the action has gone through, we risk to duplicate it.","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ff655917196e29405a8de74d654cafe4d2d20e6b","unresolved":false,"context_lines":[{"line_number":260,"context_line":"                    timeout\u003dtimeout"},{"line_number":261,"context_line":"                )"},{"line_number":262,"context_line":"                break  # Success, exit retry loop"},{"line_number":263,"context_line":"            except (httpx.ConnectError, httpx.ReadTimeout, httpx.WriteTimeout,"},{"line_number":264,"context_line":"                    httpx.PoolTimeout, httpx.ConnectTimeout) as e:"},{"line_number":265,"context_line":"                # Retry transient connection errors"},{"line_number":266,"context_line":"                if attempt \u003c max_retries - 1:"}],"source_content_type":"text/x-python","patch_set":15,"id":"b6565c8b_40683720","line":263,"in_reply_to":"eb0c8b44_6c5c5d36","updated":"2026-11-04 12:11:44.000000000","message":"Right this makes sense, let me update","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"60bdb4db7b845fb4eda56c4d62ba408fe3d1305f","unresolved":true,"context_lines":[{"line_number":271,"context_line":"                   \u0027data\u0027: utils.sanitize(data)})"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        # Retry loop for transient connection errors"},{"line_number":274,"context_line":"        max_retries \u003d self._server_side_retries or 3"},{"line_number":275,"context_line":"        delay \u003d self._server_side_retries_delay or 2"},{"line_number":276,"context_line":"        idempotent \u003d method in IDEMPOTENT_METHODS"},{"line_number":277,"context_line":"        for attempt in range(max_retries):"}],"source_content_type":"text/x-python","patch_set":16,"id":"55e9f74e_94d2cec7","line":274,"updated":"2026-11-05 09:29:37.000000000","message":"setting _server_side_retries to 0 will fall back to 3, and setting _server_side_retries_delay to 0 will fall back to 2\nis that intended ?","commit_id":"a16e077ae7558a5c7e6e0188fff6d9f55335871d"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"811a7e8fa89bbcbe83b4d66b67107f4628ced30f","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                   \u0027data\u0027: utils.sanitize(data)})"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        # Retry loop for transient connection errors"},{"line_number":274,"context_line":"        max_retries \u003d self._server_side_retries or 3"},{"line_number":275,"context_line":"        delay \u003d self._server_side_retries_delay or 2"},{"line_number":276,"context_line":"        idempotent \u003d method in IDEMPOTENT_METHODS"},{"line_number":277,"context_line":"        for attempt in range(max_retries):"}],"source_content_type":"text/x-python","patch_set":16,"id":"4fd429b6_04b40fd7","line":274,"in_reply_to":"55e9f74e_94d2cec7","updated":"2026-11-05 12:19:08.000000000","message":"I was sleepy and claude probably had some hallucination...\nI\u0027m changing from `max_retries` to `max_attempts` \nmax_attempts \u003d max(1, self._server_side_retries + 1).\nThe delay will be only based on _server_side_retries_delay.","commit_id":"a16e077ae7558a5c7e6e0188fff6d9f55335871d"},{"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":"63311078a7023c91f353840d3009ad433a5fc536","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        :returns: Full URL."},{"line_number":173,"context_line":"        if urlparse.urlparse(path).netloc:"},{"line_number":174,"context_line":"            # Already an absolute URL"},{"line_number":175,"context_line":"            return path"},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        return urlparse.urljoin(self._url, path)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"f70b7650_54f81255","line":175,"updated":"2026-11-05 22:33:32.000000000","message":"What is this?","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"47db7d94ecc0cbadba77887d06d054bf30248b84","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        :returns: Full URL."},{"line_number":173,"context_line":"        if urlparse.urlparse(path).netloc:"},{"line_number":174,"context_line":"            # Already an absolute URL"},{"line_number":175,"context_line":"            return path"},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        return urlparse.urljoin(self._url, path)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3026a291_f71adfff","line":175,"in_reply_to":"42ab41f0_b0d7c7a9","updated":"2026-11-09 16:15:57.000000000","message":"Done","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"360445d567f72c9cec02416a211360d3e7e73cef","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        :returns: Full URL."},{"line_number":173,"context_line":"        if urlparse.urlparse(path).netloc:"},{"line_number":174,"context_line":"            # Already an absolute URL"},{"line_number":175,"context_line":"            return path"},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        return urlparse.urljoin(self._url, path)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"42ab41f0_b0d7c7a9","line":175,"in_reply_to":"9226f493_727a44f3","updated":"2026-11-08 21:53:32.000000000","message":"It would probably be worth to re-work on a follow-up I would say, since the patch is already quite big.., or should I try to split this one in small parts?","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"301023e286deb80cc06ebacf6d4c32ba27e7770c","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        :returns: Full URL."},{"line_number":173,"context_line":"        if urlparse.urlparse(path).netloc:"},{"line_number":174,"context_line":"            # Already an absolute URL"},{"line_number":175,"context_line":"            return path"},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        return urlparse.urljoin(self._url, path)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9226f493_727a44f3","line":175,"in_reply_to":"f70b7650_54f81255","updated":"2026-11-07 15:27:11.000000000","message":"This got swallowed into the docstring when while re-working on the patch, shouldn\u0027t be required anymore, it used to be the initial implementation (I think it moved till patch set 10.)\nThe short-circuit was a no-op, so I\u0027m dropping it. \n\nIf you see any security concerns here let me know, checking with claude it said: \n```\nWorth noting this function does no host-trust check — a BMC-supplied @odata.id or\n action target pointing elsewhere gets requested with credentials attached. \nThat\u0027s pre-existing and matches sushy\u0027s behavior, and the dead branch didn\u0027t help with it\n  either, but it\u0027s the same class as the recent OCI redirect hardening. I\u0027d rather fix it in a follow-up than widen this patch.\n```\nBut not sure if it\u0027s hallucinating..","commit_id":"974fd56c2631d4a613f3e99aebd86ae224c5bf23"}],"ironic/common/redfish/resource.py":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"18a0c9b45efa991fcfff71397c7c4c044672e7b4","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        response \u003d await self._connector.get(path)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        # Handle both dict response (from .json()) and response object"},{"line_number":90,"context_line":"        if hasattr(response, \u0027json\u0027):"},{"line_number":91,"context_line":"            self._json \u003d response.json()"},{"line_number":92,"context_line":"            # Capture ETag if present"},{"line_number":93,"context_line":"            if hasattr(response, \u0027headers\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"460ed459_669af2e0","line":90,"updated":"2026-11-04 08:49:58.000000000","message":"AsyncConnector get always returns a dict, the first condition is always skipped and etag is always cleared. The patch will always fail in case of conditional updates since the If-Match value won\u0027t be present.","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ff655917196e29405a8de74d654cafe4d2d20e6b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        response \u003d await self._connector.get(path)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        # Handle both dict response (from .json()) and response object"},{"line_number":90,"context_line":"        if hasattr(response, \u0027json\u0027):"},{"line_number":91,"context_line":"            self._json \u003d response.json()"},{"line_number":92,"context_line":"            # Capture ETag if present"},{"line_number":93,"context_line":"            if hasattr(response, \u0027headers\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"cacafd9c_18ee09b9","line":90,"in_reply_to":"460ed459_669af2e0","updated":"2026-11-04 12:11:44.000000000","message":"You are right, and also affects the TaskMonitor like you mentioned.\nGoing to change the `get` to return responses like the other verbs and update the code to handle things.","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"}],"ironic/common/redfish/taskmonitor.py":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"18a0c9b45efa991fcfff71397c7c4c044672e7b4","unresolved":true,"context_lines":[{"line_number":86,"context_line":"        :raises: ConnectionError on request failures"},{"line_number":87,"context_line":"        :raises: Various HTTP exceptions on HTTP errors"},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        self._response \u003d await self._connector.get("},{"line_number":90,"context_line":"            path\u003dself.task_monitor_uri"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a8086f8_1cdd7784","line":89,"updated":"2026-11-04 08:49:58.000000000","message":"this looks odd, it\u0027s expecting an http response but you\u0027re passing a parsed json? I think this fails and the error is masked by the mock in the unit test. If you change the mock to the dict returned by AsyncConnector, you should see a failure.","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"ff655917196e29405a8de74d654cafe4d2d20e6b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        :raises: ConnectionError on request failures"},{"line_number":87,"context_line":"        :raises: Various HTTP exceptions on HTTP errors"},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        self._response \u003d await self._connector.get("},{"line_number":90,"context_line":"            path\u003dself.task_monitor_uri"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fef29b4b_bb6a56a5","line":89,"in_reply_to":"7a8086f8_1cdd7784","updated":"2026-11-04 12:11:44.000000000","message":"Acknowledged","commit_id":"1f87f95a16cb72a82f443f1d5f38ad9ba0104405"}],"ironic/tests/unit/common/redfish/test_client.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                        collection \u003d await client_obj.collection(\u0027Systems\u0027)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"                        self.assertIsInstance(collection,"},{"line_number":131,"context_line":"                                            resource.AsyncResourceCollection)"},{"line_number":132,"context_line":"                        self.assertEqual(3, len(collection))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        asyncio.run(run_test())"}],"source_content_type":"text/x-python","patch_set":9,"id":"0dc6fdc8_195cb39e","line":131,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                        collection \u003d await client_obj.collection(\u0027Managers\u0027)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"                        self.assertIsInstance(collection,"},{"line_number":177,"context_line":"                                            resource.AsyncResourceCollection)"},{"line_number":178,"context_line":"                        self.assertEqual(1, len(collection))"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        asyncio.run(run_test())"}],"source_content_type":"text/x-python","patch_set":9,"id":"73fd79f7_87ed997c","line":177,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"}],"ironic/tests/unit/common/redfish/test_connector.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            import httpx"},{"line_number":43,"context_line":"            request \u003d mock.Mock(url\u003d\u0027http://test.com\u0027)"},{"line_number":44,"context_line":"            raise httpx.HTTPStatusError(\u0027Error\u0027, request\u003drequest,"},{"line_number":45,"context_line":"                                       response\u003dself)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class TestAsyncConnector(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"365873fc_e04c1419","line":45,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"}],"ironic/tests/unit/common/redfish/test_resource.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a060bee4ed1a9d287bee7a254967f5f8e52c2df7","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            chassis_collection \u003d await res.link(\u0027Chassis\u0027)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"            self.assertIsInstance(chassis_collection,"},{"line_number":330,"context_line":"                                resource.AsyncResourceCollection)"},{"line_number":331,"context_line":"            self.assertEqual(1, len(chassis_collection))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        asyncio.run(run_test())"}],"source_content_type":"text/x-python","patch_set":9,"id":"b98c1ddb_9aac0116","line":330,"updated":"2026-09-11 04:45:29.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"bf2cf17a8b42c733b0d17d61444760f354cbd9ed"}]}
