)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b7ea7af94113af854606a5662b038e08b5d7ea45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"02f0275c_50e1b91f","updated":"2026-06-24 15:19:51.000000000","message":"this is functional but i can do better so i will","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"3d7197705c67fd66dca00377bb30479adde98878","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e76e45bf_5b0bda06","updated":"2026-07-14 16:56:31.000000000","message":"patch looks good, aside from the circular import","commit_id":"d08ef3fab9dc695c59a10f96ce755e13859d3c73"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"c1586ade7617e4921fa2fc9801335d6867d92374","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b81a7cc7_48e373ec","updated":"2026-07-15 14:02:16.000000000","message":"Based on my testing here https://review.opendev.org/c/openstack/cyborg/+/997365, This fix works https://zuul.opendev.org/t/openstack/build/6cc9d4585fd84b5180795c93982237b1 and all pci life cycle tests passes on cyborg-tempest-py3 job\n\nhttps://60f5f908ce7f00581e31-643a2db52c37cfaf38924d3327c11bda.ssl.cf2.rackcdn.com/openstack/6cc9d4585fd84b5180795c93982237b1/testr_results.html","commit_id":"7faf80e098f189e6220ccbe5bfc9d179f482fa76"}],"cyborg/api/controllers/base.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"70aeea15c410cdd2189a8dafa5a65cbef927360c","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        deprecation warning."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        .. _OpenStack API-WG guideline:"},{"line_number":120,"context_line":"           https://specs.openstack.org/openstack/api-wg/guidelines/microversion_specification.html"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param headers: webob headers"},{"line_number":123,"context_line":"        :param default_version: version to use if not specified in headers"}],"source_content_type":"text/x-python","patch_set":1,"id":"3018c525_22cac5ce","line":120,"updated":"2026-06-24 01:49:44.000000000","message":"Line exceeds 79-character limit. The docstring URL reference at line 120 is 98 characters long, violating the OpenStack PEP8/H904 line-length standard enforced by flake8 in tox -e pep8.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: The pep8/tox gate check will fail on this line, blocking the patch from merging. Even if the URL is long, it must be wrapped or shortened to comply with the 79-char rule.\n\n**Suggestion**:\nWrap the URL across multiple lines using the reStructuredText line-continuation style, or shorten it. For example: break the URL at a path boundary and indent the continuation, or use a shorter redirect link. A common pattern is to place the URL on its own indented continuation line under the .. _directive.","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"70aeea15c410cdd2189a8dafa5a65cbef927360c","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Try the standard format first:"},{"line_number":132,"context_line":"        #   OpenStack-API-Version: accelerator \u003cversion\u003e"},{"line_number":133,"context_line":"        version_str \u003d microversion_parse.get_version("},{"line_number":134,"context_line":"            headers, service_type\u003d\u0027accelerator\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        if version_str is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3309ac49_ad715c47","line":133,"updated":"2026-06-24 01:49:44.000000000","message":"The service type \u0027accelerator\u0027 is hardcoded as a string literal in parse_headers. If the service type ever changes or is needed elsewhere, it would need to be updated in multiple places.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Centralizing the service type avoids duplication and reduces the risk of inconsistency. The v2/versions.py module already defines service_type_string() which returns \u0027accelerator\u0027.\n\n**Recommendation**:\nImport and reuse versions.service_type_string() instead of the hardcoded literal, or define a module-level constant. This keeps the service type in a single source of truth and is consistent with how v2/__init__.py line 149 already uses it.","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6f083877be2d7a55a52d22961c177674ea0432f4","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Try the standard format first:"},{"line_number":132,"context_line":"        #   OpenStack-API-Version: accelerator \u003cversion\u003e"},{"line_number":133,"context_line":"        version_str \u003d microversion_parse.get_version("},{"line_number":134,"context_line":"            headers, service_type\u003d\u0027accelerator\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        if version_str is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"6959d29e_56ff4cef","line":133,"in_reply_to":"23b15f61_2de2a5e7","updated":"2026-07-15 09:28:51.000000000","message":"Acknowledged","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b7ea7af94113af854606a5662b038e08b5d7ea45","unresolved":true,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # Try the standard format first:"},{"line_number":132,"context_line":"        #   OpenStack-API-Version: accelerator \u003cversion\u003e"},{"line_number":133,"context_line":"        version_str \u003d microversion_parse.get_version("},{"line_number":134,"context_line":"            headers, service_type\u003d\u0027accelerator\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        if version_str is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"23b15f61_2de2a5e7","line":133,"in_reply_to":"3309ac49_ad715c47","updated":"2026-06-24 15:19:51.000000000","message":"yes this ^","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b7ea7af94113af854606a5662b038e08b5d7ea45","unresolved":true,"context_lines":[{"line_number":131,"context_line":"        # Try the standard format first:"},{"line_number":132,"context_line":"        #   OpenStack-API-Version: accelerator \u003cversion\u003e"},{"line_number":133,"context_line":"        version_str \u003d microversion_parse.get_version("},{"line_number":134,"context_line":"            headers, service_type\u003d\u0027accelerator\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        if version_str is None:"},{"line_number":137,"context_line":"            # Fall back to a bare version string without the service"}],"source_content_type":"text/x-python","patch_set":1,"id":"3bb01676_873d59e7","line":134,"range":{"start_line":134,"start_character":35,"end_line":134,"end_character":46},"updated":"2026-06-24 15:19:51.000000000","message":"note this value is defined here\n\nhttps://opendev.org/openstack/service-types-authority/src/branch/master/service-types.yaml#L159\n\nits the same value we use when registering the keystone endpoint\n\nhowever we shoudl define this as a resuabel constant if we have not already done that instead of just the raw sting","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6f083877be2d7a55a52d22961c177674ea0432f4","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        # Try the standard format first:"},{"line_number":132,"context_line":"        #   OpenStack-API-Version: accelerator \u003cversion\u003e"},{"line_number":133,"context_line":"        version_str \u003d microversion_parse.get_version("},{"line_number":134,"context_line":"            headers, service_type\u003d\u0027accelerator\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        if version_str is None:"},{"line_number":137,"context_line":"            # Fall back to a bare version string without the service"}],"source_content_type":"text/x-python","patch_set":1,"id":"4e5d2982_a27c53bd","line":134,"range":{"start_line":134,"start_character":35,"end_line":134,"end_character":46},"in_reply_to":"3bb01676_873d59e7","updated":"2026-07-15 09:28:51.000000000","message":"Acknowledged","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"70aeea15c410cdd2189a8dafa5a65cbef927360c","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        version_str \u003d microversion_parse.get_version("},{"line_number":134,"context_line":"            headers, service_type\u003d\u0027accelerator\u0027)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        if version_str is None:"},{"line_number":137,"context_line":"            # Fall back to a bare version string without the service"},{"line_number":138,"context_line":"            # type prefix for backward compatibility."},{"line_number":139,"context_line":"            raw \u003d headers.get(Version.current_api_version)"}],"source_content_type":"text/x-python","patch_set":1,"id":"23def2f6_1af1cda3","line":136,"updated":"2026-06-24 01:49:44.000000000","message":"Spurious deprecation warning logged on every API request. The min_version()/max_version() helpers construct base.Version with bare version dicts, which the new fallback interprets as a client omitting the service type prefix, firing LOG.warning each time.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: Every API request triggers two spurious deprecation warnings (one from min_version(), one from max_version() in _check_version), polluting logs, inflating log volume, and obscuring genuine deprecation warnings from real clients.\n\n**Priority**: Before merge\n**Why This Matters**: The internal boundary-check helpers at v2/__init__.py lines 35-48 are not HTTP client requests; they are server-side comparisons. Routing them through the client-deprecation-warning path is incorrect and will generate misleading log noise in production for every single request.\n\n**Recommendation**:\nEither (a) have min_version()/max_version() pass headers that include the service type prefix (e.g. {\u0027OpenStack-API-Version\u0027: \u0027accelerator 2.0\u0027}) so microversion_parse.get_version matches and the fallback path is never hit, or (b) add a flag/sentinel to parse_headers that suppresses the deprecation warning for internal/server-side calls, or (c) move the deprecation warning out of parse_headers into the _route handler where it can distinguish real client requests from internal constructions.","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"70aeea15c410cdd2189a8dafa5a65cbef927360c","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        if version_str is None:"},{"line_number":137,"context_line":"            # Fall back to a bare version string without the service"},{"line_number":138,"context_line":"            # type prefix for backward compatibility."},{"line_number":139,"context_line":"            raw \u003d headers.get(Version.current_api_version)"},{"line_number":140,"context_line":"            if raw is not None:"},{"line_number":141,"context_line":"                LOG.warning("},{"line_number":142,"context_line":"                    \u0027Received OpenStack-API-Version header without \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"0fb64b58_000633da","line":139,"updated":"2026-06-24 01:49:44.000000000","message":"The bare-version fallback path does not validate the raw header value before using it. A malformed bare value (e.g. \u0027foobar\u0027) is accepted as version_str, then silently falls to minimal_version (2,0) at the ValueError handler instead of raising HTTPNotAcceptable.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Clients sending a malformed bare version string get silently downgraded to the minimum version instead of receiving a clear 406 error, which can cause hard-to-diagnose behavior where requested features are silently unavailable.\n\n**Suggestion**:\nAfter extracting the bare version in the fallback branch, validate it with a quick check (e.g. that it matches the expected X.Y format or \u0027latest\u0027) before assigning it to version_str. Invalid bare values should raise exc.HTTPNotAcceptable with a descriptive message, matching how unsupported versions are already handled downstream.","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b7ea7af94113af854606a5662b038e08b5d7ea45","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        if version_str is None:"},{"line_number":137,"context_line":"            # Fall back to a bare version string without the service"},{"line_number":138,"context_line":"            # type prefix for backward compatibility."},{"line_number":139,"context_line":"            raw \u003d headers.get(Version.current_api_version)"},{"line_number":140,"context_line":"            if raw is not None:"},{"line_number":141,"context_line":"                LOG.warning("},{"line_number":142,"context_line":"                    \u0027Received OpenStack-API-Version header without \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7872a682_8da03186","line":139,"in_reply_to":"0fb64b58_000633da","updated":"2026-06-24 15:19:51.000000000","message":"this is valid i shoudl be using microverison parse on this as well\n\nthere is a version that takes the string","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6f083877be2d7a55a52d22961c177674ea0432f4","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        if version_str is None:"},{"line_number":137,"context_line":"            # Fall back to a bare version string without the service"},{"line_number":138,"context_line":"            # type prefix for backward compatibility."},{"line_number":139,"context_line":"            raw \u003d headers.get(Version.current_api_version)"},{"line_number":140,"context_line":"            if raw is not None:"},{"line_number":141,"context_line":"                LOG.warning("},{"line_number":142,"context_line":"                    \u0027Received OpenStack-API-Version header without \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"4fdde703_5632f5ea","line":139,"in_reply_to":"7872a682_8da03186","updated":"2026-07-15 09:28:51.000000000","message":"Done","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b7ea7af94113af854606a5662b038e08b5d7ea45","unresolved":true,"context_lines":[{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            parse_str \u003d version_str"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        try:"},{"line_number":159,"context_line":"            version \u003d tuple(int(i) for i in parse_str.split(\u0027.\u0027))"},{"line_number":160,"context_line":"        except ValueError:"},{"line_number":161,"context_line":"            version \u003d minimal_version"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if len(version) !\u003d 2:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d26c830b_ee7e3270","line":160,"range":{"start_line":158,"start_character":1,"end_line":160,"end_character":26},"updated":"2026-06-24 15:19:51.000000000","message":"also this is kind of a hack when we removed microversion parase \nwe didnt nessiarly regresss this\n\nhttps://review.opendev.org/c/openstack/cyborg/+/905646\n\nbut we can handel the version more robustsly using the fuction it provides","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6f083877be2d7a55a52d22961c177674ea0432f4","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            parse_str \u003d version_str"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        try:"},{"line_number":159,"context_line":"            version \u003d tuple(int(i) for i in parse_str.split(\u0027.\u0027))"},{"line_number":160,"context_line":"        except ValueError:"},{"line_number":161,"context_line":"            version \u003d minimal_version"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        if len(version) !\u003d 2:"}],"source_content_type":"text/x-python","patch_set":1,"id":"66026263_6379cc51","line":160,"range":{"start_line":158,"start_character":1,"end_line":160,"end_character":26},"in_reply_to":"d26c830b_ee7e3270","updated":"2026-07-15 09:28:51.000000000","message":"Done","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"3d7197705c67fd66dca00377bb30479adde98878","unresolved":true,"context_lines":[{"line_number":26,"context_line":"from webob import exc"},{"line_number":27,"context_line":"from wsme import types as wtypes"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from cyborg.api.controllers.v2 import versions"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"01f95f72_d5104d82","line":29,"updated":"2026-07-14 16:56:31.000000000","message":"this import seems to be causing a circular import via https://github.com/openstack/cyborg/blob/c0fc5432a52115a4e31d183b41916e51d134bdd0/cyborg/api/controllers/v2/__init__.py#L26 which pulls in base.py again https://github.com/openstack/cyborg/blob/master/cyborg/api/controllers/link.py#L20 as shown in CI:\n```\nJul 09 22:09:07.722016 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     ...\u003c3 lines\u003e...\nJul 09 22:09:07.722016 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg         **app_conf,\nJul 09 22:09:07.722016 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     )\nJul 09 22:09:07.722016 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/data/venv/lib/python3.13/site-packages/pecan/__init__.py\", line 74, in make_app\nJul 09 22:09:07.722016 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     app \u003d Pecan(root, **kw)\nJul 09 22:09:07.722016 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/data/venv/lib/python3.13/site-packages/pecan/core.py\", line 833, in __init__\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     super(Pecan, self).__init__(*args, **kw)\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/data/venv/lib/python3.13/site-packages/pecan/core.py\", line 229, in __init__\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     root \u003d self.__translate_root__(root)\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/data/venv/lib/python3.13/site-packages/pecan/core.py\", line 264, in __translate_root__\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     module \u003d __import__(name, fromlist\u003dfromlist)\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/cyborg/cyborg/api/controllers/root.py\", line 24, in \u003cmodule\u003e\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     from cyborg.api.controllers import base\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/cyborg/cyborg/api/controllers/base.py\", line 29, in \u003cmodule\u003e\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     from cyborg.api.controllers.v2 import versions\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/cyborg/cyborg/api/controllers/v2/__init__.py\", line 26, in \u003cmodule\u003e\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     from cyborg.api.controllers import link\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg   File \"/opt/stack/cyborg/cyborg/api/controllers/link.py\", line 40, in \u003cmodule\u003e\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg     class Link(base.APIBase):\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg                ^^^^^^^^^^^^\nJul 09 22:09:07.722816 np8de1ced9dc4f4 devstack@cyborg-api.service[79915]: 2026-07-09 22:09:07.708 79915 ERROR cyborg AttributeError: partially initialized module \u0027cyborg.api.controllers.base\u0027 from \u0027/opt/stack/cyborg/cyborg/api/\n```\nfrom https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_9f8/openstack/9f823d6f157d47b7bbc7d3d95852e4f2/controller/logs/screen-cyborg-api.txt","commit_id":"d08ef3fab9dc695c59a10f96ce755e13859d3c73"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6f083877be2d7a55a52d22961c177674ea0432f4","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from webob import exc"},{"line_number":27,"context_line":"from wsme import types as wtypes"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from cyborg.api.controllers.v2 import versions"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"860beaec_820ea011","line":29,"in_reply_to":"01f95f72_d5104d82","updated":"2026-07-15 09:28:51.000000000","message":"that should have been fien but ya i guess that valid we may need to move some things areoudn later","commit_id":"d08ef3fab9dc695c59a10f96ce755e13859d3c73"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"588291d6b96c6ceff5f0836b9b659ae5d9c8ce36","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            # type prefix for backward compatibility."},{"line_number":145,"context_line":"            raw \u003d headers.get(Version.current_api_version)"},{"line_number":146,"context_line":"            if raw is not None:"},{"line_number":147,"context_line":"                LOG.warning("},{"line_number":148,"context_line":"                    \u0027Received OpenStack-API-Version header without \u0027"},{"line_number":149,"context_line":"                    \u0027the service type prefix.  Clients should send \u0027"},{"line_number":150,"context_line":"                    \"\u0027OpenStack-API-Version: %s \u003cversion\u003e\u0027 \""}],"source_content_type":"text/x-python","patch_set":2,"id":"4a934c5d_5185f584","line":147,"updated":"2026-07-09 21:47:03.000000000","message":"The new code logs a LOG.warning when a client sends an OpenStack-API-Version header without the service type prefix, but no test asserts this warning is emitted. The existing tests test_new_client_new_api and test_latest_microversion exercise the bare-version code path but do not verify the depre...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: If the deprecation warning logic is later broken or removed, no test will catch the regression. Clients relying on the warning for migration guidance may not be alerted.\n\n**Recommendation**:\nAdd a test that sends a bare version header (e.g., \u00272.0\u0027) and asserts the deprecation warning is logged, using oslo_log\u0027s fixture or mock. For example, mock LOG.warning and assert it was called with the expected message.","commit_id":"d08ef3fab9dc695c59a10f96ce755e13859d3c73"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6f083877be2d7a55a52d22961c177674ea0432f4","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"API_V2 \u003d \u0027v2\u0027"},{"line_number":34,"context_line":"SERVICE_TYPE \u003d \u0027accelerator\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class APIBase(wtypes.Base):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6a606f8b_ef6fec2e","line":34,"updated":"2026-07-15 09:28:51.000000000","message":"i guess this is fine for now\ni intentionally didn\u0027t do this originally but we can move this later.\ni want a top level shared constants module everntully","commit_id":"7faf80e098f189e6220ccbe5bfc9d179f482fa76"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"53caf1b57c320cac458e71d997ced4152fe092fc","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            # Fall back to a bare version string without the service"},{"line_number":142,"context_line":"            # type prefix for backward compatibility."},{"line_number":143,"context_line":"            raw \u003d headers.get(Version.current_api_version)"},{"line_number":144,"context_line":"            if raw is not None:"},{"line_number":145,"context_line":"                LOG.warning("},{"line_number":146,"context_line":"                    \u0027Received OpenStack-API-Version header without \u0027"},{"line_number":147,"context_line":"                    \u0027the service type prefix.  Clients should send \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"4b274a66_54c2f2eb","line":144,"updated":"2026-07-15 09:22:09.000000000","message":"The new fallback path in parse_headers logs a LOG.warning when a client sends a bare version string without the service type prefix (e.g., \u0027OpenStack-API-Version: 2.0\u0027 instead of \u0027accelerator 2.0\u0027). This deprecation-warning behavior is new to this patch but no test verifies that the warning is ac...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: If the warning logging is accidentally removed or modified in a future change, no test would catch the regression. The deprecation warning is an important signal for operators to migrate clients to the standard prefixed format.\n\n**Recommendation**:\nAdd a test that uses self.useFixture(fixtures.FakeLogger) or unittest.mock.patch on the LOG object to assert that a warning is emitted when a bare version header is sent. Alternatively, use assertLogs within the existing test_new_client_new_api test to verify the warning.","commit_id":"7faf80e098f189e6220ccbe5bfc9d179f482fa76"}],"cyborg/tests/unit/api/controllers/v2/test_microversion.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"70aeea15c410cdd2189a8dafa5a65cbef927360c","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.assertEqual(response.headers[H_MAX_VER], MAX_VER)"},{"line_number":128,"context_line":"        self.assertEqual(response.headers[H_RESP_VER], RESP_MIN)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_standard_header_with_service_type_latest(self):"},{"line_number":131,"context_line":"        \"\"\"The API-WG standard format with \u0027latest\u0027.\"\"\""},{"line_number":132,"context_line":"        response \u003d self.get_json("},{"line_number":133,"context_line":"            \u0027/v2\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb29ad2_bac960c2","line":130,"updated":"2026-06-24 01:49:44.000000000","message":"The new test test_standard_header_with_service_type_latest does not assert the min/max response headers, unlike the other test methods. It only checks H_RESP_VER.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Adding min/max header assertions to this test would provide full coverage parity with the other microversion tests and catch regressions where the service-type-prefixed request path fails to set those headers correctly.\n\n**Recommendation**:\nAdd self.assertEqual(response.headers[H_MIN_VER], MIN_VER) and self.assertEqual(response.headers[H_MAX_VER], MAX_VER) to test_standard_header_with_service_type_latest, matching the assertions in the sibling test methods.","commit_id":"04cf82afa538228b15f39b38e6eccf8c05288fe6"}]}
