)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cb3a67cda565b93e5631df08cbfaf896d77914e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f6774ba8_f27b5a0d","updated":"2026-06-30 19:07:59.000000000","message":"ill levave the parent patch for a day or two incase anyone else want to review but this looks good to me","commit_id":"ab7c7370fd328b773efebec4797619fe6f4050b8"}],"cyborg/context.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e5bc6375310d446c7a0aa94b0504d2d678b41ffe","unresolved":true,"context_lines":[{"line_number":73,"context_line":"        \u0027read_deleted\u0027,"},{"line_number":74,"context_line":"        \u0027remote_address\u0027,"},{"line_number":75,"context_line":"        \u0027timestamp\u0027,"},{"line_number":76,"context_line":"        \u0027quota_class\u0027,"},{"line_number":77,"context_line":"        \u0027service_catalog\u0027,"},{"line_number":78,"context_line":"    ]"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"0f95cb09_71c13e19","side":"PARENT","line":76,"range":{"start_line":76,"start_character":9,"end_line":76,"end_character":20},"updated":"2026-06-30 10:48:34.000000000","message":"this is form nova as are the other fields\nread_deleted was used for the feature where you could have a read slave listed in the conenction url for the db before we recommended agaisnt doing that.\n\ni dont know if it ever worked for cybrog","commit_id":"c2e40a7910b61240506b20d88815e11dc1aa4b46"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"7ec118fc29fe70a80fdb1d75931dae1ae87ce87f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \u0027read_deleted\u0027,"},{"line_number":74,"context_line":"        \u0027remote_address\u0027,"},{"line_number":75,"context_line":"        \u0027timestamp\u0027,"},{"line_number":76,"context_line":"        \u0027quota_class\u0027,"},{"line_number":77,"context_line":"        \u0027service_catalog\u0027,"},{"line_number":78,"context_line":"    ]"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d94da730_4d3ab38c","side":"PARENT","line":76,"range":{"start_line":76,"start_character":9,"end_line":76,"end_character":20},"in_reply_to":"0f95cb09_71c13e19","updated":"2026-06-30 13:52:43.000000000","message":"I\u0027ve removed this in the parent change for simplicity.","commit_id":"c2e40a7910b61240506b20d88815e11dc1aa4b46"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e5bc6375310d446c7a0aa94b0504d2d678b41ffe","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        \u0027remote_address\u0027,"},{"line_number":75,"context_line":"        \u0027timestamp\u0027,"},{"line_number":76,"context_line":"        \u0027quota_class\u0027,"},{"line_number":77,"context_line":"        \u0027service_catalog\u0027,"},{"line_number":78,"context_line":"    ]"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __init__("}],"source_content_type":"text/x-python","patch_set":1,"id":"2544b174_8f1f1e1c","side":"PARENT","line":77,"range":{"start_line":77,"start_character":7,"end_line":77,"end_character":26},"updated":"2026-06-30 10:48:34.000000000","message":"https://github.com/openstack/cyborg/blob/master/cyborg/api/hooks.py#L55C1-L103C10\n\nthis is used in our api hooks.\n\ni do plan to refactothose into middleware eventually but not until after the srbac series is complete.\n\nthis is why tyhe ci jobs are failing.","commit_id":"c2e40a7910b61240506b20d88815e11dc1aa4b46"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"7ec118fc29fe70a80fdb1d75931dae1ae87ce87f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \u0027remote_address\u0027,"},{"line_number":75,"context_line":"        \u0027timestamp\u0027,"},{"line_number":76,"context_line":"        \u0027quota_class\u0027,"},{"line_number":77,"context_line":"        \u0027service_catalog\u0027,"},{"line_number":78,"context_line":"    ]"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def __init__("}],"source_content_type":"text/x-python","patch_set":1,"id":"155532f6_685fcf25","side":"PARENT","line":77,"range":{"start_line":77,"start_character":7,"end_line":77,"end_character":26},"in_reply_to":"2544b174_8f1f1e1c","updated":"2026-06-30 13:52:43.000000000","message":"Oh yes. I\u0027ve updated the commit tokeep this now.","commit_id":"c2e40a7910b61240506b20d88815e11dc1aa4b46"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e5bc6375310d446c7a0aa94b0504d2d678b41ffe","unresolved":true,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        self.read_deleted \u003d read_deleted"},{"line_number":114,"context_line":"        self.remote_address \u003d remote_address"},{"line_number":115,"context_line":"        if not timestamp:"},{"line_number":116,"context_line":"            timestamp \u003d timeutils.utcnow()"},{"line_number":117,"context_line":"        if isinstance(timestamp, str):"},{"line_number":118,"context_line":"            timestamp \u003d timeutils.parse_strtime(timestamp)"},{"line_number":119,"context_line":"        self.timestamp \u003d timestamp"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        if service_catalog:"},{"line_number":122,"context_line":"            # Only include required parts of service_catalog"}],"source_content_type":"text/x-python","patch_set":1,"id":"a2e9744a_60b46ccc","side":"PARENT","line":119,"range":{"start_line":115,"start_character":6,"end_line":119,"end_character":34},"updated":"2026-06-30 10:48:34.000000000","message":"this is the only one im tempted to kep but we can alwasy add it again later if we want/need it\n\nfor what it worth i rememebr doing the exact same clean up in watcher\ni tought i did this already for cybrog but i guess i never got around to it","commit_id":"c2e40a7910b61240506b20d88815e11dc1aa4b46"},{"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":"b4b96e9a26bde47e30d71b78d7691ac130b32918","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystoneauth1.access import service_catalog as ksa_service_catalog"},{"line_number":20,"context_line":"from oslo_context import context"},{"line_number":21,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"}],"source_content_type":"text/x-python","patch_set":1,"id":"3559d1bd_596e13dd","line":22,"updated":"2026-06-28 17:44:09.000000000","message":"The import \u0027from oslo_utils import timeutils\u0027 (line 22) is now unused. The old code used timeutils.utcnow() and timeutils.parse_strtime() for the removed timestamp property. ruff/flake8 will flag F401, gating the patch in CI.\n\n**Severity**: WARNING | **Confidence**: 1.0\n\n**Impact**: Unused import that fails the project\u0027s ruff F401 / pep8 checks and adds clutter; may produce a CI -1 on lint.\n\n**Suggestion**:\nDelete the \u0027from oslo_utils import timeutils\u0027 import line entirely. There are no remaining references to timeutils in this module after the timestamp property removal.","commit_id":"e4a3d819cc767fddd558bf4ba862cb930f403ed6"},{"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":"b4b96e9a26bde47e30d71b78d7691ac130b32918","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class _ContextAuthPlugin(plugin.BaseAuthPlugin):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bc446937_14809ff2","line":25,"updated":"2026-06-28 17:44:09.000000000","message":"The import \u0027from cyborg.common import utils\u0027 (line 25) is now unused. The old to_dict() used utils.strtime(self.timestamp), which was removed. utils has no remaining references and will be flagged F401.\n\n**Severity**: WARNING | **Confidence**: 1.0\n\n**Impact**: Unused import that fails the project\u0027s ruff F401 / pep8 checks and adds clutter; may produce a CI -1 on lint.\n\n**Suggestion**:\nDelete the \u0027from cyborg.common import utils\u0027 import line entirely. There are no remaining references to utils in this module after the to_dict() simplification.","commit_id":"e4a3d819cc767fddd558bf4ba862cb930f403ed6"},{"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":"b4b96e9a26bde47e30d71b78d7691ac130b32918","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \u0027project_id\u0027,"},{"line_number":73,"context_line":"    ]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __init__("},{"line_number":76,"context_line":"        self,"},{"line_number":77,"context_line":"        user_id\u003dNone,"},{"line_number":78,"context_line":"        project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f3c9a5e_35a5a8ba","line":75,"updated":"2026-06-28 17:44:09.000000000","message":"Removing service_catalog from __init__ breaks from_environ. hooks.py:102 passes it, flowing via cyborg **kwargs into super().__init__(). The oslo.context base __init__ has a fixed signature with no **kwargs (verified in 2.19.2 and 4.1.0), raising TypeError on requests with X_SERVICE_CATALOG.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: ContextHook.before() runs for every API request. Any request carrying X_SERVICE_CATALOG (set by keystone auth_token middleware) crashes at context construction with TypeError, making the API unusable.\n\n**Priority**: Before merge\n**Why This Matters**: This is a functional regression on the core request-handling path. The change removes a parameter that an in-tree caller (hooks.py:102) still actively depends on.\n\n**Recommendation**:\nRe-add service_catalog\u003dNone as an explicit __init__ parameter and store it as self.service_catalog (with the old default of []). The old __init__ consumed service_catalog explicitly and never forwarded it to the base class; deleting that parameter reintroduces a hard failure. Alternatively, update hooks.py to stop passing service_catalog, but then get_auth_plugin() must also be fixed.","commit_id":"e4a3d819cc767fddd558bf4ba862cb930f403ed6"},{"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":"b4b96e9a26bde47e30d71b78d7691ac130b32918","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        if self.user_auth_plugin:"},{"line_number":99,"context_line":"            return self.user_auth_plugin"},{"line_number":100,"context_line":"        else:"},{"line_number":101,"context_line":"            return _ContextAuthPlugin(self.auth_token, self.service_catalog)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def to_dict(self):"},{"line_number":104,"context_line":"        values \u003d super().to_dict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dec30acc_c68dff10","line":101,"updated":"2026-06-28 17:44:09.000000000","message":"get_auth_plugin() references self.service_catalog (line 101), but the refactored __init__ no longer sets it and oslo.context\u0027s base __init__ does not store it either. The old code always set self.service_catalog (default []). This raises AttributeError when user_auth_plugin is not set.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: cyborg/service_auth.py:34 calls context.get_auth_plugin(), and cyborg/image/glance.py:58 uses it to build the Glance client. For contexts without a user_auth_plugin (the common case for internal/admin operations), any Glance image lookup will raise AttributeError.\n\n**Priority**: Before merge\n**Why This Matters**: Even if the from_environ TypeError is fixed independently, this is a second failure in the same auth path. It defeats image-service integration for contexts constructed without an explicit auth plugin.\n\n**Recommendation**:\nEnsure self.service_catalog is always populated. Restore the service_catalog parameter in __init__ and store it on self (with default []), or change get_auth_plugin() to use getattr(self, \u0027service_catalog\u0027, None). The cleanest fix is to keep the service_catalog parameter and storage as before, since _ContextAuthPlugin.get_endpoint() needs a real catalog.","commit_id":"e4a3d819cc767fddd558bf4ba862cb930f403ed6"},{"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":"c82ff33f1b69284522e5b87d869992927b5da69f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystoneauth1.access import service_catalog as ksa_service_catalog"},{"line_number":20,"context_line":"from oslo_context import context"},{"line_number":21,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"725f9083_cb4d3f20","line":22,"updated":"2026-06-30 14:33:30.000000000","message":"Unused import: \u0027from oslo_utils import timeutils\u0027 is no longer referenced after the timestamp handling was removed from __init__ and to_dict(). ruff flags this as F401 (cyborg enables the F ruleset).\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Dead import that will fail the project\u0027s ruff/pyflakes pre-commit and pep8 gate; leaves an unused dependency reference in the module.\n\n**Suggestion**:\nDelete the \u0027from oslo_utils import timeutils\u0027 line. timeutils was only used for utcnow()/parse_strtime()/strtime() of the removed self.timestamp attribute.","commit_id":"5ec0cc2f2a834a3de926e574460933efc3d99b72"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"92a7b00a649d78d05673396132084699b540991c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystoneauth1.access import service_catalog as ksa_service_catalog"},{"line_number":20,"context_line":"from oslo_context import context"},{"line_number":21,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"c318dd51_1254d74a","line":22,"in_reply_to":"16ed8eda_4c4a99bb","updated":"2026-06-30 15:47:02.000000000","message":"Done","commit_id":"5ec0cc2f2a834a3de926e574460933efc3d99b72"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"50576a345432eaf10f5ae52072b887e89c1a11b2","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from keystoneauth1.access import service_catalog as ksa_service_catalog"},{"line_number":20,"context_line":"from oslo_context import context"},{"line_number":21,"context_line":"from oslo_db.sqlalchemy import enginefacade"},{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"}],"source_content_type":"text/x-python","patch_set":2,"id":"16ed8eda_4c4a99bb","line":22,"in_reply_to":"725f9083_cb4d3f20","updated":"2026-06-30 14:59:31.000000000","message":"oh this should cause the ruff checks to fail","commit_id":"5ec0cc2f2a834a3de926e574460933efc3d99b72"},{"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":"c82ff33f1b69284522e5b87d869992927b5da69f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class _ContextAuthPlugin(plugin.BaseAuthPlugin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fcc0e298_cc5e3379","line":25,"updated":"2026-06-30 14:33:30.000000000","message":"Unused import: \u0027from cyborg.common import utils\u0027 is no longer referenced in context.py. Its only previous use was utils.strtime(self.timestamp) in to_dict(), which was removed.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Dead local import flagged by ruff F401; will fail the pep8 pre-commit/gate. The strtime helper still exists in cyborg/common/utils.py but is unreferenced from here.\n\n**Suggestion**:\nDelete the \u0027from cyborg.common import utils\u0027 line. Verify no other symbol from utils is referenced in this file (grep confirms none remain).","commit_id":"5ec0cc2f2a834a3de926e574460933efc3d99b72"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"92a7b00a649d78d05673396132084699b540991c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class _ContextAuthPlugin(plugin.BaseAuthPlugin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7e03c785_ec296215","line":25,"in_reply_to":"c0e2187c_b6b68ea9","updated":"2026-06-30 15:47:02.000000000","message":"Done. Also removed the strtime function which was used only by the removed logic.","commit_id":"5ec0cc2f2a834a3de926e574460933efc3d99b72"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"50576a345432eaf10f5ae52072b887e89c1a11b2","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from oslo_utils import timeutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from cyborg.common import exception"},{"line_number":25,"context_line":"from cyborg.common import utils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class _ContextAuthPlugin(plugin.BaseAuthPlugin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"c0e2187c_b6b68ea9","line":25,"in_reply_to":"fcc0e298_cc5e3379","updated":"2026-06-30 14:59:31.000000000","message":"same here","commit_id":"5ec0cc2f2a834a3de926e574460933efc3d99b72"},{"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":"065192eab9a9d3ab6195005fb32b1d1e0fc3d52a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        else:"},{"line_number":110,"context_line":"            return _ContextAuthPlugin(self.auth_token, self.service_catalog)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def to_dict(self):"},{"line_number":113,"context_line":"        values \u003d super().to_dict()"},{"line_number":114,"context_line":"        values.update("},{"line_number":115,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":4,"id":"663f15e2_2a0d515d","line":112,"updated":"2026-06-30 16:04:25.000000000","message":"The to_dict() docstring was removed entirely during the refactor and the method now has no docstring. The simplified to_dict() silently relies on super().to_dict() to emit is_admin, request_id, is_admin_project, project_id and the other standard oslo.context keys, while only user_id/user_name/service_catalog/project_name are added explicitly. A short docstring noting this delegation would aid future maintainers.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Documents the deliberate reliance on oslo.context\u0027s base to_dict() and clarifies which keys Cyborg adds on top, preventing a future maintainer from reintroducing redundant explicit emission or accidentally dropping a key the base provides.\n\n**Recommendation**:\nAdd a one-line docstring, e.g.: \u0027\u0027\u0027Build the context dict, adding cyborg-specific keys on top of oslo.context\u0027s base to_dict().\u0027\u0027\u0027 This keeps the delegation documented.","commit_id":"dc462f7213e9e73b07569a4ede952e10d9d34624"}]}
