)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"1a37e111c58ebc2cf0f6a84c2db2ec58a1f612e8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4b0c33d9_a2aab934","updated":"2026-01-21 18:56:06.000000000","message":"The approach here is fine, but I wonder if we could simplify by specifying a required Ironic API version, like we do here (https://opendev.org/openstack/nova/src/commit/2b7b27132451fd4a491a812de3669b3771595c90/nova/virt/ironic/driver.py#L64) and use that as a minimum.","commit_id":"75eb1c64cd951a2067a86c66eefd99b05b7215d3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ea8b949077e716e9e1298111a88301e2f7e7ca58","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f209e0dc_b96c38f7","in_reply_to":"4b0c33d9_a2aab934","updated":"2026-01-23 15:21:55.000000000","message":"I concur, the contract IPA exists in is x-1, x, x+1 release modeling, where we don\u0027t break upgrades and we try super-hard not to break IPA not being upgraded for a cluster in a mixed state.","commit_id":"75eb1c64cd951a2067a86c66eefd99b05b7215d3"}],"ironic_python_agent/ironic_api_client.py":[{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"4c352ed085b99135905c88d00fe15f8952612466","unresolved":true,"context_lines":[{"line_number":188,"context_line":"                       min_version[0], min_version[1],"},{"line_number":189,"context_line":"                       \u0027.\u0027.join(map(str, MIN_IRONIC_VERSION))))"},{"line_number":190,"context_line":"                LOG.error(msg)"},{"line_number":191,"context_line":"                raise errors.LookupNodeError(msg)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _error_from_response(self, response):"},{"line_number":194,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3292b1c9_4aa108c8","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":49},"updated":"2026-01-19 10:15:59.000000000","message":"Alternative approach is to return False to trigger the retry mechanism, allowing version discovery another chance on retry. This would consume retry budget but might recover from transient discovery failures.\n\nFeedback welcome on whether this trade-off is preferable.","commit_id":"75eb1c64cd951a2067a86c66eefd99b05b7215d3"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"6791df9d61e7e63c9299af2d1c41fe25d1d095ce","unresolved":true,"context_lines":[{"line_number":188,"context_line":"                       min_version[0], min_version[1],"},{"line_number":189,"context_line":"                       \u0027.\u0027.join(map(str, MIN_IRONIC_VERSION))))"},{"line_number":190,"context_line":"                LOG.error(msg)"},{"line_number":191,"context_line":"                raise errors.LookupNodeError(msg)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def _error_from_response(self, response):"},{"line_number":194,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"88273b78_8b2a97c6","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":49},"in_reply_to":"3292b1c9_4aa108c8","updated":"2026-01-21 10:51:49.000000000","message":"we can probably spend one more retry here","commit_id":"75eb1c64cd951a2067a86c66eefd99b05b7215d3"}]}
