)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28558,"name":"Ghada Khalil","email":"ghada.khalil@windriver.com","username":"gkhalil"},"change_message_id":"1ae054abe0e70d5ffe3771d4fdc69adeda819e64","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/starlingx/integ/+/970455"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Story: 2011511"},{"line_number":48,"context_line":"Task: 53093"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Change-Id: I830084fcad9b6413477e703514325030c7dc58a2"},{"line_number":51,"context_line":"Signed-off-by: Hugo Brito \u003chugo.brito@windriver.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7ba7dc25_798605de","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":11},"updated":"2025-12-29 22:15:47.000000000","message":"This needs to be linked to a separate story/task as it\u0027s not related to Fault Management. There needs to be a separate story to track this DC work.","commit_id":"1a53d1c8f12bd034b09729d4ea6ebd04285b3e4f"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"5de7cca088ea2f29dff3d017c50210fff36f35c6","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/c/starlingx/integ/+/970455"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Story: 2011511"},{"line_number":48,"context_line":"Task: 53093"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Change-Id: I830084fcad9b6413477e703514325030c7dc58a2"},{"line_number":51,"context_line":"Signed-off-by: Hugo Brito \u003chugo.brito@windriver.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7e595db0_f245be4e","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":11},"in_reply_to":"7ba7dc25_798605de","updated":"2026-01-07 14:04:47.000000000","message":"Done","commit_id":"1a53d1c8f12bd034b09729d4ea6ebd04285b3e4f"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"66daa4e7ccb53659fba09f44af21c11fc3390872","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"de55ac62_66217dbb","updated":"2025-11-11 14:15:32.000000000","message":"Waiting for oic package dependency fixes","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"abe1e368c6c68242e23b6135de54f85e6b2047f6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"062c4cd6_71e33441","updated":"2026-01-13 20:45:12.000000000","message":"recheck","commit_id":"2b198a80098fddd2b5a8cd8eea2ade98674142c7"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"57a4ac531239da2d92a07adbb815449ea9779977","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a2f32677_758f3057","updated":"2026-01-13 20:22:46.000000000","message":"retest","commit_id":"2b198a80098fddd2b5a8cd8eea2ade98674142c7"}],"distributedcloud/dcmanager/api/app.py":[{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Huawei, Tech. Co,. Ltd."},{"line_number":2,"context_line":"# Copyright (c) 2017, 2019, 2021, 2024 Wind River Systems, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"4a353e00_3c1ad9ee","line":2,"range":{"start_line":2,"start_character":34,"end_line":2,"end_character":38},"updated":"2025-11-24 21:03:49.000000000","message":"2024-2025","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Huawei, Tech. Co,. Ltd."},{"line_number":2,"context_line":"# Copyright (c) 2017, 2019, 2021, 2024 Wind River Systems, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"efe713f7_ed278c65","line":2,"range":{"start_line":2,"start_character":34,"end_line":2,"end_character":38},"in_reply_to":"4a353e00_3c1ad9ee","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"}],"distributedcloud/dcmanager/api/controllers/restcomm.py":[{"author":{"_account_id":21776,"name":"Jerry Sun","email":"jerry.sun@windriver.com","username":"jerrysun"},"change_message_id":"e189a82261cca5be0644362784cfbc2d6005ff8d","unresolved":true,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def _oidc_identity_from_token(oidc_token):"},{"line_number":90,"context_line":"    \"\"\"Return (username, roles) using a tiny shared cache.\"\"\""},{"line_number":91,"context_line":"    oidc_config \u003d oidc_utils.get_apiserver_oidc_args()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    # shared per-process cache via function attribute"},{"line_number":94,"context_line":"    cache \u003d getattr(_oidc_identity_from_token, \"_cache\", {})"}],"source_content_type":"text/x-python","patch_set":3,"id":"124e4812_1db897e9","line":91,"updated":"2025-11-06 17:49:15.000000000","message":"is it possible to keep this cached somewhere locally? This call to the common utils method makes a kubectl call. if dcmanager is working with heavy load, i fear it might overwhelm kubernetes with too many calls.\nIt\u0027s not a concern right now, since the whole design is for a human being to run in oidc mode, with how they manually set a token, but if a script is involved, there might be enough load involved for this to become a problem.","commit_id":"2bdec9f2bd07b79e24a61249283089f8810e3987"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"73c7a0adcf24ff5a98e851fde55049b610f49b51","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def _oidc_identity_from_token(oidc_token):"},{"line_number":90,"context_line":"    \"\"\"Return (username, roles) using a tiny shared cache.\"\"\""},{"line_number":91,"context_line":"    oidc_config \u003d oidc_utils.get_apiserver_oidc_args()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    # shared per-process cache via function attribute"},{"line_number":94,"context_line":"    cache \u003d getattr(_oidc_identity_from_token, \"_cache\", {})"}],"source_content_type":"text/x-python","patch_set":3,"id":"19ea353d_493aa4fb","line":91,"in_reply_to":"124e4812_1db897e9","updated":"2025-11-06 20:10:07.000000000","message":"Done","commit_id":"2bdec9f2bd07b79e24a61249283089f8810e3987"},{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Huawei Tech. Co., Ltd."},{"line_number":2,"context_line":"# Copyright (c) 2017-2022, 2024 Wind River Systems, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"86d885fb_b9ad3c54","line":2,"range":{"start_line":2,"start_character":27,"end_line":2,"end_character":31},"updated":"2025-11-24 21:03:49.000000000","message":"2024-2025","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Huawei Tech. Co., Ltd."},{"line_number":2,"context_line":"# Copyright (c) 2017-2022, 2024 Wind River Systems, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"1d03a695_cde15b9e","line":2,"range":{"start_line":2,"start_character":27,"end_line":2,"end_character":31},"in_reply_to":"86d885fb_b9ad3c54","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        return k_context.RequestContext(**context_paras)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # OIDC RequestContext"},{"line_number":59,"context_line":"    username, roles \u003d _oidc_identity_from_token(oidc_token)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    return k_context.RequestContext("},{"line_number":62,"context_line":"        auth_type\u003d\"oidc\","}],"source_content_type":"text/x-python","patch_set":5,"id":"55a77915_8b40da99","line":59,"range":{"start_line":59,"start_character":48,"end_line":59,"end_character":58},"updated":"2025-11-24 21:03:49.000000000","message":"Could the oidc_token be missing from the headers, causing it to be None here? If that\u0027s possible, I suggest moving it to an \u0027elif oidc_token:\u0027 block.","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        return k_context.RequestContext(**context_paras)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    # OIDC RequestContext"},{"line_number":59,"context_line":"    username, roles \u003d _oidc_identity_from_token(oidc_token)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    return k_context.RequestContext("},{"line_number":62,"context_line":"        auth_type\u003d\"oidc\","}],"source_content_type":"text/x-python","patch_set":5,"id":"61ac0c67_7beb5fb1","line":59,"range":{"start_line":59,"start_character":48,"end_line":59,"end_character":58},"in_reply_to":"55a77915_8b40da99","updated":"2025-12-17 15:58:18.000000000","message":"No, the hook will verify first, but I’m adding debug logs since the error will be generic: Authentication Required.","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":89,"context_line":"def _oidc_identity_from_token(oidc_token):"},{"line_number":90,"context_line":"    \"\"\"Return (username, roles) using a tiny shared cache.\"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    oidc_config \u003d k_context.get_oidc_args_cached(k_context._oidc_cache)"},{"line_number":93,"context_line":"    token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("}],"source_content_type":"text/x-python","patch_set":5,"id":"4649a779_3218a6de","line":92,"range":{"start_line":92,"start_character":4,"end_line":92,"end_character":71},"updated":"2025-11-24 21:03:49.000000000","message":"Is it be possible for the OIDC to not be configured and return None? If there is, I suggest adding an explicit validation, raising a custom exception. Otherwise we\u0027ll have a generic KeyError on the lines bellow.","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"def _oidc_identity_from_token(oidc_token):"},{"line_number":90,"context_line":"    \"\"\"Return (username, roles) using a tiny shared cache.\"\"\""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    oidc_config \u003d k_context.get_oidc_args_cached(k_context._oidc_cache)"},{"line_number":93,"context_line":"    token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("}],"source_content_type":"text/x-python","patch_set":5,"id":"3aba2655_1f1eeb63","line":92,"range":{"start_line":92,"start_character":4,"end_line":92,"end_character":71},"in_reply_to":"4649a779_3218a6de","updated":"2025-12-17 15:58:18.000000000","message":"ditto","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":9926,"name":"John Kung","email":"john.kung@windriver.com","username":"jkung"},"change_message_id":"259aa10a22dc6c78b778cccba604f9cbeee1d592","unresolved":true,"context_lines":[{"line_number":91,"context_line":"    return {\"project_name\": _ADMIN_PROJECT_NAME, \"roles\": roles}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def _oidc_identity_from_token(oidc_token):"},{"line_number":95,"context_line":"    \"\"\"Return (username, roles) using a tiny shared cache.\"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    oidc_config \u003d k_context.get_oidc_args_cached(k_context._oidc_cache)"}],"source_content_type":"text/x-python","patch_set":8,"id":"a86a0629_98835c45","line":94,"updated":"2026-01-09 13:57:35.000000000","message":"this should reference the common library at https://review.opendev.org/c/starlingx/utilities/+/972456\n\ne.g. platform_utils parse_oidc_token_claims returns username and roles","commit_id":"b8e1c185d0b4059feff981b0287f4e7c068b23d3"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"724c46f248a0dcb7c6e44917bcffe1d07e7b259a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    return {\"project_name\": _ADMIN_PROJECT_NAME, \"roles\": roles}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def _oidc_identity_from_token(oidc_token):"},{"line_number":95,"context_line":"    \"\"\"Return (username, roles) using a tiny shared cache.\"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    oidc_config \u003d k_context.get_oidc_args_cached(k_context._oidc_cache)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1089cd91_b324ace5","line":94,"in_reply_to":"a86a0629_98835c45","updated":"2026-01-09 20:11:53.000000000","message":"Done","commit_id":"b8e1c185d0b4059feff981b0287f4e7c068b23d3"},{"author":{"_account_id":38731,"name":"Michael Chen","display_name":"Michael Chen","email":"michael.chen@windriver.com","username":"mchen2"},"change_message_id":"888843c529285a6c55de8a97c4d1ee89bb21c514","unresolved":true,"context_lines":[{"line_number":56,"context_line":"            context_paras[key] \u003d environ.get(val)"},{"line_number":57,"context_line":"        role \u003d environ.get(\"HTTP_X_ROLE\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        context_paras[\"is_admin\"] \u003d \"admin\" in role.split(\",\")"},{"line_number":60,"context_line":"        context_paras[\"auth_type\"] \u003d \"keystone\""},{"line_number":61,"context_line":"        return k_context.RequestContext(**context_paras)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"cc35bb19_47ad65f8","line":59,"updated":"2026-01-12 16:00:54.000000000","message":"Is it possible HTTP_X_ROLE is not defined? The line 59 can be crashed if role is None.","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"fedf0e25fa5eaf73f000734e3f18cce5ebf888cc","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            context_paras[key] \u003d environ.get(val)"},{"line_number":57,"context_line":"        role \u003d environ.get(\"HTTP_X_ROLE\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        context_paras[\"is_admin\"] \u003d \"admin\" in role.split(\",\")"},{"line_number":60,"context_line":"        context_paras[\"auth_type\"] \u003d \"keystone\""},{"line_number":61,"context_line":"        return k_context.RequestContext(**context_paras)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"c16906db_d44077fb","line":59,"in_reply_to":"cc35bb19_47ad65f8","updated":"2026-01-12 20:22:44.000000000","message":"I don\u0027t think so since the user must, at least, have reader and member permission.","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":38731,"name":"Michael Chen","display_name":"Michael Chen","email":"michael.chen@windriver.com","username":"mchen2"},"change_message_id":"563bafc6c5e9d543831d0348af4f525e8497f421","unresolved":true,"context_lines":[{"line_number":98,"context_line":"    with k_context._oidc_cache_lock:"},{"line_number":99,"context_line":"        token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("},{"line_number":102,"context_line":"        oidc_token,"},{"line_number":103,"context_line":"        token_bucket,"},{"line_number":104,"context_line":"        oidc_config[\"oidc-issuer-url\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"a04d960a_6f60805c","line":101,"updated":"2026-01-12 16:11:17.000000000","message":"Do you catch exception in this function? just like function _validate_oidc_auth().","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":38731,"name":"Michael Chen","display_name":"Michael Chen","email":"michael.chen@windriver.com","username":"mchen2"},"change_message_id":"888843c529285a6c55de8a97c4d1ee89bb21c514","unresolved":true,"context_lines":[{"line_number":98,"context_line":"    with k_context._oidc_cache_lock:"},{"line_number":99,"context_line":"        token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("},{"line_number":102,"context_line":"        oidc_token,"},{"line_number":103,"context_line":"        token_bucket,"},{"line_number":104,"context_line":"        oidc_config[\"oidc-issuer-url\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ce1da726_717eabe7","line":101,"updated":"2026-01-12 16:00:54.000000000","message":"Do you need to check if oidc_token is None?","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":28486,"name":"Tee Ngo","email":"tee.ngo@windriver.com","username":"teewrs"},"change_message_id":"7c44d333f9f0097ad438726be035514bbf90c519","unresolved":true,"context_lines":[{"line_number":98,"context_line":"    with k_context._oidc_cache_lock:"},{"line_number":99,"context_line":"        token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("},{"line_number":102,"context_line":"        oidc_token,"},{"line_number":103,"context_line":"        token_bucket,"},{"line_number":104,"context_line":"        oidc_config[\"oidc-issuer-url\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"6bd5d290_75484809","line":101,"range":{"start_line":101,"start_character":4,"end_line":101,"end_character":10},"updated":"2026-01-12 19:33:08.000000000","message":"Need to check if claims is None. If it is None then validate has failed.","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"7df8217b7518ec03da7a5454b959decf53c83504","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    with k_context._oidc_cache_lock:"},{"line_number":99,"context_line":"        token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("},{"line_number":102,"context_line":"        oidc_token,"},{"line_number":103,"context_line":"        token_bucket,"},{"line_number":104,"context_line":"        oidc_config[\"oidc-issuer-url\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"595f4989_5f05fd9e","line":101,"range":{"start_line":101,"start_character":4,"end_line":101,"end_character":10},"in_reply_to":"6bd5d290_75484809","updated":"2026-01-12 20:42:52.000000000","message":"Done","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"fedf0e25fa5eaf73f000734e3f18cce5ebf888cc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    with k_context._oidc_cache_lock:"},{"line_number":99,"context_line":"        token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("},{"line_number":102,"context_line":"        oidc_token,"},{"line_number":103,"context_line":"        token_bucket,"},{"line_number":104,"context_line":"        oidc_config[\"oidc-issuer-url\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"674a0168_b43ca361","line":101,"in_reply_to":"a04d960a_6f60805c","updated":"2026-01-12 20:22:44.000000000","message":"No, it was implemented to avoid the need for catching exceptions:\nhttps://review.opendev.org/c/starlingx/utilities/+/972456/4/utilities/platform-util/platform-util/platform_util/oidc/oidc_utils.py#210","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"fedf0e25fa5eaf73f000734e3f18cce5ebf888cc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    with k_context._oidc_cache_lock:"},{"line_number":99,"context_line":"        token_bucket \u003d k_context._oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    claims \u003d oidc_utils.validate_oidc_token("},{"line_number":102,"context_line":"        oidc_token,"},{"line_number":103,"context_line":"        token_bucket,"},{"line_number":104,"context_line":"        oidc_config[\"oidc-issuer-url\"],"}],"source_content_type":"text/x-python","patch_set":9,"id":"308f2c86_07831a91","line":101,"in_reply_to":"ce1da726_717eabe7","updated":"2026-01-12 20:22:44.000000000","message":"No, because the token is only used if the token_cache is not None, in which case, having a None token would not raise any issues:\nhttps://review.opendev.org/c/starlingx/utilities/+/972456/4/utilities/platform-util/platform-util/platform_util/oidc/oidc_utils.py#168","commit_id":"aaaff39e1bfd0a42805383de2253dacc59da1d19"}],"distributedcloud/dcmanager/common/context.py":[{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":36,"context_line":"auditLOG \u003d log.getLogger(audit_log_name)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# OIDC Cache"},{"line_number":39,"context_line":"_oidc_cache \u003d {}"},{"line_number":40,"context_line":"# OIDC args cache timeout"},{"line_number":41,"context_line":"OIDC_ARGS_TIMEOUT \u003d 86400"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"04415bfb_6e244b12","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":16},"updated":"2025-11-24 21:03:49.000000000","message":"Any concerns with thread safety here? If this is called by multiple threads due to multiple API requests, it might make sense to use a threading.Lock() obj.","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"auditLOG \u003d log.getLogger(audit_log_name)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# OIDC Cache"},{"line_number":39,"context_line":"_oidc_cache \u003d {}"},{"line_number":40,"context_line":"# OIDC args cache timeout"},{"line_number":41,"context_line":"OIDC_ARGS_TIMEOUT \u003d 86400"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d36fc46a_9218ee68","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":16},"in_reply_to":"04415bfb_6e244b12","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    \"\"\"Return OIDC args cache\"\"\""},{"line_number":50,"context_line":"    cfg \u003d cache.get(\"oidc_args\")"},{"line_number":51,"context_line":"    ts \u003d cache.get(\"oidc_args_ts\", 0.0)"},{"line_number":52,"context_line":"    now \u003d time.time()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    # Update OIDC Config every day"},{"line_number":55,"context_line":"    if not cfg or (now - ts) \u003e\u003d OIDC_ARGS_TIMEOUT:"}],"source_content_type":"text/x-python","patch_set":5,"id":"470ad62e_b12ad430","line":52,"range":{"start_line":52,"start_character":15,"end_line":52,"end_character":21},"updated":"2025-11-24 21:03:49.000000000","message":"monotonic(), so there\u0027s no issues when changing system clock.","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    \"\"\"Return OIDC args cache\"\"\""},{"line_number":50,"context_line":"    cfg \u003d cache.get(\"oidc_args\")"},{"line_number":51,"context_line":"    ts \u003d cache.get(\"oidc_args_ts\", 0.0)"},{"line_number":52,"context_line":"    now \u003d time.time()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    # Update OIDC Config every day"},{"line_number":55,"context_line":"    if not cfg or (now - ts) \u003e\u003d OIDC_ARGS_TIMEOUT:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ed7a1b42_e7a263f5","line":52,"range":{"start_line":52,"start_character":15,"end_line":52,"end_character":21},"in_reply_to":"470ad62e_b12ad430","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":206,"context_line":"        keystone_token \u003d req.headers.get(\"X-Auth-Token\")"},{"line_number":207,"context_line":"        oidc_token \u003d req.headers.get(\"OIDC-Token\")"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        auditLOG.debug(f\"Keystone Token: {keystone_token} OIDC Token: {oidc_token}\")"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        if keystone_token:"},{"line_number":212,"context_line":"            identity_status \u003d req.headers.get(\"X-Identity-Status\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"cb61f010_0cd387f7","line":209,"range":{"start_line":209,"start_character":41,"end_line":209,"end_character":82},"updated":"2025-11-24 21:03:49.000000000","message":"Better to avoid logging the tokens for security reasons as they could be valid ones (even at the debug level).","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        keystone_token \u003d req.headers.get(\"X-Auth-Token\")"},{"line_number":207,"context_line":"        oidc_token \u003d req.headers.get(\"OIDC-Token\")"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        auditLOG.debug(f\"Keystone Token: {keystone_token} OIDC Token: {oidc_token}\")"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        if keystone_token:"},{"line_number":212,"context_line":"            identity_status \u003d req.headers.get(\"X-Identity-Status\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"3994749d_934971c9","line":209,"range":{"start_line":209,"start_character":41,"end_line":209,"end_character":82},"in_reply_to":"cb61f010_0cd387f7","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"            return token_claims is not None"},{"line_number":243,"context_line":"        except Exception:"},{"line_number":244,"context_line":"            return False"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"class AuditLoggingHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":5,"id":"50ec4c8e_5b152fd8","line":244,"range":{"start_line":244,"start_character":12,"end_line":244,"end_character":24},"updated":"2025-11-24 21:03:49.000000000","message":"Consider clearing the config cache in case we have an exception so that an updated config is fetched.","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"            return token_claims is not None"},{"line_number":243,"context_line":"        except Exception:"},{"line_number":244,"context_line":"            return False"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"class AuditLoggingHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":5,"id":"f79c66ec_33ca5eea","line":244,"range":{"start_line":244,"start_character":12,"end_line":244,"end_character":24},"in_reply_to":"50ec4c8e_5b152fd8","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":31954,"name":"Yuxing Jiang","email":"Yuxing.Jiang@windriver.com","username":"yuxing"},"change_message_id":"cdc982f8136fcd4036a03dbeb8e4ee7a19f973e7","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    this credential refers to the credentials built for dcmanager middleware"},{"line_number":167,"context_line":"    in an OpenStack cloud."},{"line_number":168,"context_line":"    \"\"\""},{"line_number":169,"context_line":"    pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"class AuthHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":7,"id":"82a0d1f8_f3f27897","side":"PARENT","line":169,"updated":"2026-01-07 20:34:40.000000000","message":"Why to remove this pass? Do we need to consider raising a not implemented error instead?","commit_id":"d21556aa108607313df538c6d98279cbd16a0a6a"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"d83febef8743640ba498239bb747cf7c5850f501","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    this credential refers to the credentials built for dcmanager middleware"},{"line_number":167,"context_line":"    in an OpenStack cloud."},{"line_number":168,"context_line":"    \"\"\""},{"line_number":169,"context_line":"    pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"class AuthHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":7,"id":"c00084bf_b51d87ff","side":"PARENT","line":169,"in_reply_to":"82a0d1f8_f3f27897","updated":"2026-01-08 12:14:54.000000000","message":"This was done automatically by the linter since it does not have any use and the class is not empty.\nIt exists in all our services in the same way, i.e. a doc and a pass statement rather than the not implemented. I\u0027m not sure why they exist though as there are no references to any of them in the codebase.","commit_id":"d21556aa108607313df538c6d98279cbd16a0a6a"},{"author":{"_account_id":31954,"name":"Yuxing Jiang","email":"Yuxing.Jiang@windriver.com","username":"yuxing"},"change_message_id":"f3f430d5708012abbfd33699e6175bd8fd338387","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    this credential refers to the credentials built for dcmanager middleware"},{"line_number":167,"context_line":"    in an OpenStack cloud."},{"line_number":168,"context_line":"    \"\"\""},{"line_number":169,"context_line":"    pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"class AuthHook(hooks.PecanHook):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9c31be6a_f69bd195","side":"PARENT","line":169,"in_reply_to":"c00084bf_b51d87ff","updated":"2026-01-08 16:37:16.000000000","message":"The orginal design of this method is to get the service context for service project rather than the admin project in openstack. As there\u0027s doc string there, it is fine w/o a pass. I believe the best option is to raise not implemented error in case any usage request that though.","commit_id":"d21556aa108607313df538c6d98279cbd16a0a6a"},{"author":{"_account_id":38731,"name":"Michael Chen","display_name":"Michael Chen","email":"michael.chen@windriver.com","username":"mchen2"},"change_message_id":"71968df41bdd40ece686b08ed9c16d2721d2bef7","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                auditLOG.debug(\"OIDC configuration not available\")"},{"line_number":238,"context_line":"                return False"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            issuer_url \u003d oidc_config.get(\"oidc-issuer-url\")"},{"line_number":241,"context_line":"            client_id \u003d oidc_config.get(\"oidc-client-id\")"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            if not issuer_url or not client_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"6ab00b01_b8adbc6e","line":240,"updated":"2026-01-08 19:44:10.000000000","message":"get_oidc_args_cached() returns a reference to the cached config dict. The lock is release after returning this reference, allowing another thread to potentially modify the dict before the current thread reads both the issuer and client id values. This could result in reading mismatched issuer/client id pairs. However, this scenario is rare because issuer url and client id are not changed frequently. Ideally, we should ensure that issuer/client Id pairs remain consistent throughout the validation process.","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"74063678f691482bf3de0827c8555586ce9b03a8","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                auditLOG.debug(\"OIDC configuration not available\")"},{"line_number":238,"context_line":"                return False"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            issuer_url \u003d oidc_config.get(\"oidc-issuer-url\")"},{"line_number":241,"context_line":"            client_id \u003d oidc_config.get(\"oidc-client-id\")"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            if not issuer_url or not client_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"c6f3a142_8b5ce15f","line":240,"in_reply_to":"59a1bb17_32f42219","updated":"2026-01-09 14:06:31.000000000","message":"Ok, then that gets into the scenario I mentioned. Once the token is read with the get_oidc_args_cached, its value will not change unless its close to the timeout. If that occurs, it won\u0027t be a problem since the old token, i.e. the one read by the thread before being replaced, will fail in the validate_oidc_token method below.\nThat is to say, if the token does happen to be replaced, the values obtained in 240 and 241 will refer to the previous token, which will be regarded as invalid due to the timeout, causing the request to fail.","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"13eafcaadb2f2a332c398d8cdc2a4aafa4dc7bb2","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                auditLOG.debug(\"OIDC configuration not available\")"},{"line_number":238,"context_line":"                return False"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            issuer_url \u003d oidc_config.get(\"oidc-issuer-url\")"},{"line_number":241,"context_line":"            client_id \u003d oidc_config.get(\"oidc-client-id\")"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            if not issuer_url or not client_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7dfc3657_a382eec4","line":240,"in_reply_to":"6ab00b01_b8adbc6e","updated":"2026-01-08 21:14:31.000000000","message":"The get_oidc_args_cached will only update the token information if the timeout is exceeded, otherwise, the method only returns the cached data. Further, because it does have a lock setup, the refresh will only be done once as soon as the discrepancy is identified and any new request will return the updated data.\n\nThe possibility of a mismatch occurring would refer to when the token is retrieved close to the timeout, in which case its validation will fail and the execution will quit.\n\nIs that the same scenario you\u0027re seeing or is there something I missed?","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"},{"author":{"_account_id":38731,"name":"Michael Chen","display_name":"Michael Chen","email":"michael.chen@windriver.com","username":"mchen2"},"change_message_id":"f923d70b37eb93852e1902d12b9c7e0c6095061d","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                auditLOG.debug(\"OIDC configuration not available\")"},{"line_number":238,"context_line":"                return False"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            issuer_url \u003d oidc_config.get(\"oidc-issuer-url\")"},{"line_number":241,"context_line":"            client_id \u003d oidc_config.get(\"oidc-client-id\")"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            if not issuer_url or not client_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"59a1bb17_32f42219","line":240,"in_reply_to":"7dfc3657_a382eec4","updated":"2026-01-08 21:39:31.000000000","message":"Lines 240 and 241 perform unlocked reads, the values could be changed by another thread.","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"724c46f248a0dcb7c6e44917bcffe1d07e7b259a","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                auditLOG.debug(\"OIDC configuration not available\")"},{"line_number":238,"context_line":"                return False"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            issuer_url \u003d oidc_config.get(\"oidc-issuer-url\")"},{"line_number":241,"context_line":"            client_id \u003d oidc_config.get(\"oidc-client-id\")"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"            if not issuer_url or not client_id:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ea5f1aa5_93637813","line":240,"in_reply_to":"c6f3a142_8b5ce15f","updated":"2026-01-09 20:11:53.000000000","message":"I\u0027m closing this for now, but let me know if this is still a concern so we can further discuss.","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"},{"author":{"_account_id":38731,"name":"Michael Chen","display_name":"Michael Chen","email":"michael.chen@windriver.com","username":"mchen2"},"change_message_id":"71968df41bdd40ece686b08ed9c16d2721d2bef7","unresolved":true,"context_lines":[{"line_number":247,"context_line":"            with _oidc_cache_lock:"},{"line_number":248,"context_line":"                token_bucket \u003d _oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"            token_claims \u003d oidc_utils.validate_oidc_token("},{"line_number":251,"context_line":"                oidc_token, token_bucket, issuer_url, client_id"},{"line_number":252,"context_line":"            )"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"64dc1fd2_263baace","line":250,"updated":"2026-01-08 19:44:10.000000000","message":"Is it by requirement we don\u0027t need to handle oidc token refresh?","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"},{"author":{"_account_id":36476,"name":"Raphael Lima","display_name":"Raphael","email":"Raphael.Lima@windriver.com","username":"rlima"},"change_message_id":"13eafcaadb2f2a332c398d8cdc2a4aafa4dc7bb2","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            with _oidc_cache_lock:"},{"line_number":248,"context_line":"                token_bucket \u003d _oidc_cache.setdefault(\"oidc_tokens\", {})"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"            token_claims \u003d oidc_utils.validate_oidc_token("},{"line_number":251,"context_line":"                oidc_token, token_bucket, issuer_url, client_id"},{"line_number":252,"context_line":"            )"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5c5c0c01_98143c8d","line":250,"in_reply_to":"64dc1fd2_263baace","updated":"2026-01-08 21:14:31.000000000","message":"Not exactly. That is planned to be implemented, but is not required in the initial commit. For context, this change only modifies requests in the system controller and we still need to do the same for the subcloud interaction with it.","commit_id":"d350b431e4e50dea8f1b273d7ba517d0e1c4a5f6"}],"distributedcloud/dcmanager/tests/unit/api/controllers/v1/mixins.py":[{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2017 Ericsson AB"},{"line_number":2,"context_line":"# Copyright (c) 2020-2022, 2024 Wind River Systems, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"79dd0b9f_a8389901","line":2,"range":{"start_line":2,"start_character":27,"end_line":2,"end_character":31},"updated":"2025-11-24 21:03:49.000000000","message":"2024-2025","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2017 Ericsson AB"},{"line_number":2,"context_line":"# Copyright (c) 2020-2022, 2024 Wind River Systems, Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":5,"id":"93c00f8d_84b520b3","line":2,"range":{"start_line":2,"start_character":27,"end_line":2,"end_character":31},"in_reply_to":"79dd0b9f_a8389901","updated":"2025-12-17 15:58:18.000000000","message":"Done","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"}],"distributedcloud/dcorch/tests/unit/api/test_root_controller.py":[{"author":{"_account_id":35230,"name":"Gustavo Herzmann","email":"gustavo.herzmann@windriver.com","username":"gherzman"},"change_message_id":"7977aa5573b7f07dcbcab16debff42953a1c5949","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2024 Wind River Systems, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# SPDX-License-Identifier: Apache-2.0"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":5,"id":"27f3b830_528bd9e5","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2025-11-24 21:03:49.000000000","message":"2024-2025","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"},{"author":{"_account_id":14675,"name":"Hugo Nicodemos","email":"hugo.brito@windriver.com","username":"nicodemos"},"change_message_id":"893a519cd5da6ca68d1bed28a9135254c4787b1d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2024 Wind River Systems, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# SPDX-License-Identifier: Apache-2.0"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":5,"id":"b74ed4e2_df5571a9","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"in_reply_to":"27f3b830_528bd9e5","updated":"2025-12-17 15:58:18.000000000","message":"Change not needed 😄","commit_id":"3a42f7016c176c06f66c8ae435e52dd66c85b6d2"}]}
