)]}'
{"/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"}],"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":"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":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":"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"}],"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"}]}
