)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"9dccb47ea15497b904b2060d8d49e9d3fa2dc61c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d41e8c78_bf28280f","updated":"2024-10-31 19:12:13.000000000","message":"recheck logs expired","commit_id":"88eaa977235d6845327053f0160a3e5abf7aff77"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"55e9e70393da0893f80c502c911ff986d467caff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d0631ea4_8d4f9a31","updated":"2024-11-01 22:24:10.000000000","message":"Tested locally with a devstack, using https://gist.github.com/Sharpz7/97356eb57f77d3ee75892791c6cab155\n\nFind the code and output in a comment.","commit_id":"213414a7c79a4c7cd6961813cad3a2d24ab73b49"},{"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":"86e3015e0ae621242e13cc0abf6abd562865d7fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c518d49b_b3250de5","updated":"2024-11-04 23:23:15.000000000","message":"Adam talked me outta the +2 on a patch he pushed in his 1:1 😄","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"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":"75dc272b901647d069da78c9e85f4ba6a1d1c8f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6c394b94_0a85041c","updated":"2024-11-04 10:02:58.000000000","message":"I like the general idea of centralizing feature gating; +1.","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"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":"81dcb73e1646db71bf72e6687d4bc9fae914ff8e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b0d8f67a_68bf6a0a","updated":"2024-11-04 19:46:59.000000000","message":"I\u0027m OK with this as-is, and I suggest we can improve the type definition later.","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"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":"3eb6e291df556ed2dca9fbb420c28d78641ba692","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d80adebe_a6a206a8","updated":"2024-11-08 20:13:53.000000000","message":"This LGTM, but I was thinking it\u0027d be ideal if we could try to get https://review.opendev.org/c/openstack/ironic-tempest-plugin/+/933970/ in first to validate the changes in CI?","commit_id":"59de13c1d5b4db9f78b180b692ff869c2398663f"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"e243cc83c1f0b9a6fb505d76d6fac574b76fc28b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"78328397_ce92244e","updated":"2024-11-17 04:23:44.000000000","message":"recheck - error looks unrelated to this change","commit_id":"95bf9aef48779c2e44ef346f6cb83228017c4a19"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"5946d383a4f746709a0279f1af7c4a1f829ac567","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"02aa1b51_d931f1d6","updated":"2024-11-18 20:49:48.000000000","message":"recheck - paramiko.ssh_exception.SSHException: No existing session","commit_id":"95bf9aef48779c2e44ef346f6cb83228017c4a19"},{"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":"a9dd11fd4fefbd27a01ffaa834bdababbe2ee96d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9da32101_4a35b062","updated":"2024-11-20 23:45:41.000000000","message":"recheck I hate docker (the company + associated dockerhub policies) \u003d\u003e toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit","commit_id":"dee9f2e370197ce1d0919aa5cc65ecad0b1d1f71"},{"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":"9bd02a748386a3504e5e2d9307f4a5b59162d7ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f517ed49_ad83e5b4","updated":"2024-11-22 20:38:40.000000000","message":"Thanks Stephen+Adam!","commit_id":"c49bd143f85316733157c43615cd617c3767f2fd"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"deaf184aa7c1ccf4c0a6391be59dd32e2efe96dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"92fde06b_8424ac55","updated":"2024-11-20 22:34:44.000000000","message":"recheck tempest.lib.exceptions.SSHTimeout: Connection to the 172.24.5.70 via SSH timed out.","commit_id":"c49bd143f85316733157c43615cd617c3767f2fd"}],"ironic/api/validation/__init__.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f07385256d88d87a14075fcf91a02bc3cf401b5","unresolved":true,"context_lines":[{"line_number":31,"context_line":"        the API is available under."},{"line_number":32,"context_line":"    :param max_version: An integer representing the minimum API version that"},{"line_number":33,"context_line":"        the API is available under."},{"line_number":34,"context_line":"    :param message: A message to return if the API is not supported."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def add_validator(func):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ca135b7_768c2ca1","line":34,"updated":"2024-09-11 17:33:05.000000000","message":"Missing docstring for `status_code`","commit_id":"88eaa977235d6845327053f0160a3e5abf7aff77"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"345bb99937279075cfe97fa8ea9d75d5604c8fa5","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        the API is available under."},{"line_number":32,"context_line":"    :param max_version: An integer representing the minimum API version that"},{"line_number":33,"context_line":"        the API is available under."},{"line_number":34,"context_line":"    :param message: A message to return if the API is not supported."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def add_validator(func):"}],"source_content_type":"text/x-python","patch_set":1,"id":"689d4690_1c0c77f7","line":34,"in_reply_to":"9ca135b7_768c2ca1","updated":"2024-11-01 19:01:32.000000000","message":"Done","commit_id":"88eaa977235d6845327053f0160a3e5abf7aff77"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"4575bbcde2991ff09f34136d72217adfc422c65a","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from ironic import api"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"}],"source_content_type":"text/x-python","patch_set":3,"id":"eea48e09_cb0a0e3a","line":22,"updated":"2024-11-05 21:18:50.000000000","message":"@stephenfin@redhat.com, @dtantsur@protonmail.com, @cardoe@cardoe.com - To summarise, I think the main thing we are debating here is whether to make the passing of None explicit or not? \n\nI would be in favour of it being implicit (i.e adding \u003d None), for cases where there is no restriction, or where only max_version needs to be set (I am not sure how often this happens in Ironic). If the \"no restriction\" case never happens, then adding logic to enforce at least one of min or max be set.\n\nRegardless, I think this is a nit and am happy to take the consensus on this.","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b1eb71fb5ba303b4da0483f850dd6991c5d9e48b","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from ironic import api"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b09c7290_4b5ec07e","line":22,"in_reply_to":"eea48e09_cb0a0e3a","updated":"2025-03-21 10:16:45.000000000","message":"Done","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"3d875f5816aa144d8522b087b2f03d728c43d510","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ecaa4353_5f8c24a2","line":23,"updated":"2024-11-02 04:00:24.000000000","message":"is there a valid point to passing None for min_version","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"b67a1e0313dca07d262c96e009ac7756e52ddc33","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a7f5ba9_d5022842","line":23,"in_reply_to":"1a3ddb94_8afecded","updated":"2024-11-05 20:48:03.000000000","message":"I\u0027ll checkup on the \"without microversion\" case and get a new patch up.\n\nThanks Stephen for teaching me about Optional\u0027s exact meaning - that is a very poor choice of word by the python devs...","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"8821cb0e10c384cd7efd89d5abe7e2bd9afd8c68","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"61f6d587_000c4ff0","line":23,"in_reply_to":"5a7f5ba9_d5022842","updated":"2024-11-05 21:05:20.000000000","message":"Done","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98aaddb45086a66589ff87b1c525421095d36132","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"30e5b82e_894ba1bb","line":23,"in_reply_to":"61f6d587_000c4ff0","updated":"2024-11-06 13:39:22.000000000","message":"\u003e Thanks Stephen for teaching me about Optional\u0027s exact meaning - that is a very poor choice of word by the python devs...\n\nCouldn\u0027t agree more. Fortunately it goes away in 3.10+ where you can do e.g. `str | None`.","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"32988777bd93f2d62b0bef43565e8b2f934525e0","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"893eb703_dba1f2fc","line":23,"in_reply_to":"6ac35d38_77c81f0a","updated":"2024-11-04 23:22:28.000000000","message":"The typehint would be wrong with the current case, so I think something needs to change here regardless.\n\nI would be in favour of min_version defaulting to None, with a change to make the behaviour of this clearer in the function (i.e None means that no microversion or any version below max_version is fine)\n\nDoes this work for you folks?","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"78ccc32d58c17fd0284762d4a04a5817c344248c","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"93f7695f_b0f08473","line":23,"in_reply_to":"893eb703_dba1f2fc","updated":"2024-11-04 23:23:29.000000000","message":"Sounds good to me.","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ff2458895a4c3fb2ea0bcab1e7460e34df9694b0","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a3ddb94_8afecded","line":23,"in_reply_to":"93f7695f_b0f08473","updated":"2024-11-05 13:51:29.000000000","message":"\u003e The typehint would be wrong with the current case, so I think something needs to change here regardless.\n\nNot so. You could call this like so:\n\n```\n@api_version(min_version\u003dNone)\ndef foo(self): ...\n```\n\nbut that\u0027s semantics. Sorry 😅\n\n\u003e I would be in favour of min_version defaulting to None, with a change to make the behaviour of this clearer in the function (i.e None means that no microversion or any version below max_version is fine)\n\nMostly agreed. However, does Ironic allow requests without a microversion header? I\u0027m pretty sure Nova does not. If it doesn\u0027t this might be a moot point?","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"baee861aab7a4513d66a235bb4e8043ff920b49a","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def api_version("},{"line_number":23,"context_line":"    min_version: ty.Optional[int],"},{"line_number":24,"context_line":"    max_version: ty.Optional[int] \u003d None,"},{"line_number":25,"context_line":"    message: ty.Optional[str] \u003d None,"},{"line_number":26,"context_line":"    status_code: int \u003d http.HTTPStatus.NOT_FOUND,"}],"source_content_type":"text/x-python","patch_set":3,"id":"6ac35d38_77c81f0a","line":23,"in_reply_to":"ecaa4353_5f8c24a2","updated":"2024-11-04 10:02:06.000000000","message":"If you had a resource that existed in v1.0 but was removed in v1.X,then I think it would be reasonable to set `min_version` could be set to `None`. I wonder if we want to set a default here? 🤔","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b4ddf34dde940cebb533c9c076088b042543d009","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    :param min_version: An integer representing the minimum API version that"},{"line_number":31,"context_line":"        the API is available under."},{"line_number":32,"context_line":"    :param max_version: An integer representing the minimum API version that"},{"line_number":33,"context_line":"        the API is available under."},{"line_number":34,"context_line":"    :param message: A message to return if the API is not supported."},{"line_number":35,"context_line":"    :param status_code: The HTTP status code to return if the API is not"}],"source_content_type":"text/x-python","patch_set":3,"id":"d13d9afd_9db66304","line":32,"updated":"2024-11-05 12:00:33.000000000","message":"s/minimum/maximum/","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b4ddf34dde940cebb533c9c076088b042543d009","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":42,"context_line":"            if ("},{"line_number":43,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":44,"context_line":"            ) or (max_version and not api.request.version.minor \u003c max_version):"},{"line_number":45,"context_line":"                exc_class \u003d {"},{"line_number":46,"context_line":"                    http.HTTPStatus.NOT_FOUND: webob_exc.HTTPNotFound,"},{"line_number":47,"context_line":"                    http.HTTPStatus.METHOD_NOT_ALLOWED: webob_exc.HTTPMethodNotAllowed,  # noqa: E501"}],"source_content_type":"text/x-python","patch_set":3,"id":"128c5fdb_47b0d14e","line":44,"updated":"2024-11-05 12:00:33.000000000","message":"Mmm, this is a potential footgun. I read \"the maximum version that the API is available under\" as \u003c\u003d here.","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ff2458895a4c3fb2ea0bcab1e7460e34df9694b0","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":42,"context_line":"            if ("},{"line_number":43,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":44,"context_line":"            ) or (max_version and not api.request.version.minor \u003c max_version):"},{"line_number":45,"context_line":"                exc_class \u003d {"},{"line_number":46,"context_line":"                    http.HTTPStatus.NOT_FOUND: webob_exc.HTTPNotFound,"},{"line_number":47,"context_line":"                    http.HTTPStatus.METHOD_NOT_ALLOWED: webob_exc.HTTPMethodNotAllowed,  # noqa: E501"}],"source_content_type":"text/x-python","patch_set":3,"id":"42380006_47ab1b57","line":44,"in_reply_to":"128c5fdb_47b0d14e","updated":"2024-11-05 13:51:29.000000000","message":"You\u0027re right: this was intended to be `\u003c\u003d`","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b4ddf34dde940cebb533c9c076088b042543d009","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            ) or (max_version and not api.request.version.minor \u003c max_version):"},{"line_number":45,"context_line":"                exc_class \u003d {"},{"line_number":46,"context_line":"                    http.HTTPStatus.NOT_FOUND: webob_exc.HTTPNotFound,"},{"line_number":47,"context_line":"                    http.HTTPStatus.METHOD_NOT_ALLOWED: webob_exc.HTTPMethodNotAllowed,  # noqa: E501"},{"line_number":48,"context_line":"                }"},{"line_number":49,"context_line":"                raise exc_class[status_code]("},{"line_number":50,"context_line":"                    message or \u0027The API is not supported for this version\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"b560d3a1_c73baca4","line":47,"updated":"2024-11-05 12:00:33.000000000","message":"Maybe accept the class as the argument instead of having a mapping here?\n\nOtherwise, you need something like\n\n assert status_code in exc_class\n\non line 38 (so that it happens early, not in run time)","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"eb75f2fbe8deecdf38cdf54a16c3a08a6ffb2d70","unresolved":true,"context_lines":[{"line_number":44,"context_line":"            ) or (max_version and not api.request.version.minor \u003c max_version):"},{"line_number":45,"context_line":"                exc_class \u003d {"},{"line_number":46,"context_line":"                    http.HTTPStatus.NOT_FOUND: webob_exc.HTTPNotFound,"},{"line_number":47,"context_line":"                    http.HTTPStatus.METHOD_NOT_ALLOWED: webob_exc.HTTPMethodNotAllowed,  # noqa: E501"},{"line_number":48,"context_line":"                }"},{"line_number":49,"context_line":"                raise exc_class[status_code]("},{"line_number":50,"context_line":"                    message or \u0027The API is not supported for this version\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"f6a5df8a_3153a7e2","line":47,"in_reply_to":"b560d3a1_c73baca4","updated":"2025-03-21 12:07:09.000000000","message":"I\u0027d suggest reverting this since it means any tooling that inspects the versioning attributes we store on the function will have to translate from an exception class back to a integer (for use in OpenAPI schemas)","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b4ddf34dde940cebb533c9c076088b042543d009","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                    http.HTTPStatus.METHOD_NOT_ALLOWED: webob_exc.HTTPMethodNotAllowed,  # noqa: E501"},{"line_number":48,"context_line":"                }"},{"line_number":49,"context_line":"                raise exc_class[status_code]("},{"line_number":50,"context_line":"                    message or \u0027The API is not supported for this version\u0027"},{"line_number":51,"context_line":"                )"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"            return func(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"a384b935_f822669a","line":50,"updated":"2024-11-05 12:00:33.000000000","message":"missing _()","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"1175c78eab8a2195c3b6b1c92f1354cb46452aa6","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":51,"context_line":"            # Version checks"},{"line_number":52,"context_line":"            if ("},{"line_number":53,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":54,"context_line":"            ) or ("},{"line_number":55,"context_line":"                max_version and not api.request.version.minor \u003c\u003d max_version"},{"line_number":56,"context_line":"            ):"}],"source_content_type":"text/x-python","patch_set":4,"id":"34882471_009b7045","line":53,"updated":"2024-11-05 21:58:37.000000000","message":"So ironic can have no microversion in API requests. I am not sure what this value becomes if this happens.\n\n@jay@jvf.cc?","commit_id":"59de13c1d5b4db9f78b180b692ff869c2398663f"},{"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":"887c680afee163d30084456223aeceb9d28fa2c8","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":51,"context_line":"            # Version checks"},{"line_number":52,"context_line":"            if ("},{"line_number":53,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":54,"context_line":"            ) or ("},{"line_number":55,"context_line":"                max_version and not api.request.version.minor \u003c\u003d max_version"},{"line_number":56,"context_line":"            ):"}],"source_content_type":"text/x-python","patch_set":4,"id":"de3a1824_5af7ac5a","line":53,"in_reply_to":"34882471_009b7045","updated":"2024-11-05 22:06:08.000000000","message":"I suspect it\u0027d be equivalent of asking for microversion 0? Should be easy to figure out with a local dev.","commit_id":"59de13c1d5b4db9f78b180b692ff869c2398663f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b1eb71fb5ba303b4da0483f850dd6991c5d9e48b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":51,"context_line":"            # Version checks"},{"line_number":52,"context_line":"            if ("},{"line_number":53,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":54,"context_line":"            ) or ("},{"line_number":55,"context_line":"                max_version and not api.request.version.minor \u003c\u003d max_version"},{"line_number":56,"context_line":"            ):"}],"source_content_type":"text/x-python","patch_set":4,"id":"247b901f_67299ce4","line":53,"in_reply_to":"a66c9ea4_4e51f2ab","updated":"2025-03-21 10:16:45.000000000","message":"Done","commit_id":"59de13c1d5b4db9f78b180b692ff869c2398663f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d6a02375502083707e684e9056334d2910454095","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":51,"context_line":"            # Version checks"},{"line_number":52,"context_line":"            if ("},{"line_number":53,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":54,"context_line":"            ) or ("},{"line_number":55,"context_line":"                max_version and not api.request.version.minor \u003c\u003d max_version"},{"line_number":56,"context_line":"            ):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ef0b48d7_ce4888e2","line":53,"in_reply_to":"de3a1824_5af7ac5a","updated":"2024-11-06 11:05:31.000000000","message":"Yeah, it will be pre-microversion API.","commit_id":"59de13c1d5b4db9f78b180b692ff869c2398663f"},{"author":{"_account_id":36102,"name":"Adam McArthur","display_name":"Adam McArthur","email":"adam@mcaq.me","username":"adamcarthur","status":"PhD Candidate in Computational Imaging. Open Source Software Engineer at G-Research."},"change_message_id":"6558803925934384bf7def447738e976b32e27ce","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        def wrapper(*args, **kwargs):"},{"line_number":51,"context_line":"            # Version checks"},{"line_number":52,"context_line":"            if ("},{"line_number":53,"context_line":"                min_version and not api.request.version.minor \u003e\u003d min_version"},{"line_number":54,"context_line":"            ) or ("},{"line_number":55,"context_line":"                max_version and not api.request.version.minor \u003c\u003d max_version"},{"line_number":56,"context_line":"            ):"}],"source_content_type":"text/x-python","patch_set":4,"id":"a66c9ea4_4e51f2ab","line":53,"in_reply_to":"ef0b48d7_ce4888e2","updated":"2024-11-07 00:52:53.000000000","message":"I think in that case, this code is fine as is.","commit_id":"59de13c1d5b4db9f78b180b692ff869c2398663f"}],"ironic/tests/unit/api/controllers/v1/test_shard.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b4ddf34dde940cebb533c9c076088b042543d009","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            \u0027/shards/shard1\u0027, expect_errors\u003dTrue, headers\u003dself.headers)"},{"line_number":70,"context_line":"        self.assertEqual(http_client.NOT_FOUND, result.status_int)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # We should get the same response if we request with the wrong version"},{"line_number":73,"context_line":"        headers \u003d {api_base.Version.string: \u00271.80\u0027}"},{"line_number":74,"context_line":"        result \u003d self.get_json("},{"line_number":75,"context_line":"            \u0027/shards/shard1\u0027, expect_errors\u003dTrue, headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":3,"id":"2d8541f2_a3baf236","line":72,"updated":"2024-11-05 12:00:33.000000000","message":"nit: move to a new unit test","commit_id":"928b49a1cb23500520a2236a7f89b9e3dedf81bf"}]}
