)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"5344e86e0f9c37dcc91efa010a82342a548ad4bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"e556f54e_5235683c","updated":"2026-03-12 15:57:30.000000000","message":"recheck see if tempest failure is intermittent","commit_id":"86b35409ed0888bbbc86cb9ad63e97ff90e5c8ce"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"188790c91bd19bfa77c719c8f6255fc26753e506","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"4e47fa38_448a576d","updated":"2026-03-18 09:40:44.000000000","message":"looks good enough, we can iterate further in case of problems","commit_id":"bac55226af8fdb5477a3c3524aa0f31bd81d0773"}],"freezer_api/api/v2/jobs.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"c6ee8e6c019b4ddd7f3d6e91c87d530414b7e984","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                message\u003d\u0027Missing request body\u0027)"},{"line_number":102,"context_line":"        user_id \u003d req.get_header(\u0027X-User-ID\u0027)"},{"line_number":103,"context_line":"        self.update_actions_in_job(project_id, user_id, job.doc)"},{"line_number":104,"context_line":"        if CONF.centralized_scheduler.enabled:"},{"line_number":105,"context_line":"            ks_client \u003d req.env[\u0027freezer.context\u0027].keystone_client"},{"line_number":106,"context_line":"            trust \u003d ks_client.create_trust(user_id, project_id)"},{"line_number":107,"context_line":"            job.doc[\u0027user_credentials\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7dfee550_105a0c93","line":104,"range":{"start_line":104,"start_character":0,"end_line":104,"end_character":46},"updated":"2025-12-11 14:02:18.000000000","message":"Is there a possibility to get that from the scheduler, rather then from api config?","commit_id":"d06aaa4b263745676ddd4a65b0df6bb5bc1b854a"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"7905d5904f387235dd0a4ee54be33588aa211df9","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                message\u003d\u0027Missing request body\u0027)"},{"line_number":102,"context_line":"        user_id \u003d req.get_header(\u0027X-User-ID\u0027)"},{"line_number":103,"context_line":"        self.update_actions_in_job(project_id, user_id, job.doc)"},{"line_number":104,"context_line":"        if CONF.centralized_scheduler.enabled:"},{"line_number":105,"context_line":"            ks_client \u003d req.env[\u0027freezer.context\u0027].keystone_client"},{"line_number":106,"context_line":"            trust \u003d ks_client.create_trust(user_id, project_id)"},{"line_number":107,"context_line":"            job.doc[\u0027user_credentials\u0027] \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7eeda5d3_8aabde3d","line":104,"range":{"start_line":104,"start_character":0,"end_line":104,"end_character":46},"in_reply_to":"7dfee550_105a0c93","updated":"2026-03-12 14:08:03.000000000","message":"Done","commit_id":"d06aaa4b263745676ddd4a65b0df6bb5bc1b854a"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"c6ee8e6c019b4ddd7f3d6e91c87d530414b7e984","unresolved":true,"context_lines":[{"line_number":103,"context_line":"        self.update_actions_in_job(project_id, user_id, job.doc)"},{"line_number":104,"context_line":"        if CONF.centralized_scheduler.enabled:"},{"line_number":105,"context_line":"            ks_client \u003d req.env[\u0027freezer.context\u0027].keystone_client"},{"line_number":106,"context_line":"            trust \u003d ks_client.create_trust(user_id, project_id)"},{"line_number":107,"context_line":"            job.doc[\u0027user_credentials\u0027] \u003d {"},{"line_number":108,"context_line":"                \u0027trust_id\u0027: trust.id,"},{"line_number":109,"context_line":"                \u0027trustor_user_id\u0027: trust.trustor_user_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5bd8fa54_6cef9773","line":106,"range":{"start_line":106,"start_character":12,"end_line":106,"end_character":63},"updated":"2025-12-11 14:02:18.000000000","message":"what if job creation fails - are we doing any clean-up?\n\nAlso I\u0027m thinking if we there\u0027s any optimization possible to reduce amount of trusts (ie do it per tenant, not per job).","commit_id":"d06aaa4b263745676ddd4a65b0df6bb5bc1b854a"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"7905d5904f387235dd0a4ee54be33588aa211df9","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self.update_actions_in_job(project_id, user_id, job.doc)"},{"line_number":104,"context_line":"        if CONF.centralized_scheduler.enabled:"},{"line_number":105,"context_line":"            ks_client \u003d req.env[\u0027freezer.context\u0027].keystone_client"},{"line_number":106,"context_line":"            trust \u003d ks_client.create_trust(user_id, project_id)"},{"line_number":107,"context_line":"            job.doc[\u0027user_credentials\u0027] \u003d {"},{"line_number":108,"context_line":"                \u0027trust_id\u0027: trust.id,"},{"line_number":109,"context_line":"                \u0027trustor_user_id\u0027: trust.trustor_user_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"0d400046_29c12a93","line":106,"range":{"start_line":106,"start_character":12,"end_line":106,"end_character":63},"in_reply_to":"5bd8fa54_6cef9773","updated":"2026-03-12 14:08:03.000000000","message":"Done","commit_id":"d06aaa4b263745676ddd4a65b0df6bb5bc1b854a"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"fd91d7cff8320ad9deb0d60753de149391b438ee","unresolved":true,"context_lines":[{"line_number":23,"context_line":"from freezer_api.api.common import resource"},{"line_number":24,"context_line":"from freezer_api.common import exceptions as freezer_api_exc"},{"line_number":25,"context_line":"from freezer_api import policy"},{"line_number":26,"context_line":"from freezer_api.keystone_client import KeystoneClient"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"CONF \u003d cfg.CONF"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"abcf6146_5683fc72","line":26,"in_reply_to":"30075988_a67db845","updated":"2026-03-18 07:56:09.000000000","message":"\u003e pep8: H306: imports not in alphabetical order (freezer_api.policy, freezer_api.keystone_client.keystoneclient)\n\nPlease fix.","commit_id":"03bb3614f208459b4681a4a5a98683e61d7d4f4d"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"4797e8c8b1a45966086ae5d8418b122d049a1469","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from freezer_api.api.common import resource"},{"line_number":24,"context_line":"from freezer_api.common import exceptions as freezer_api_exc"},{"line_number":25,"context_line":"from freezer_api import policy"},{"line_number":26,"context_line":"from freezer_api.keystone_client import KeystoneClient"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"CONF \u003d cfg.CONF"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7db1ea_41827559","line":26,"in_reply_to":"abcf6146_5683fc72","updated":"2026-03-18 09:21:58.000000000","message":"Done","commit_id":"03bb3614f208459b4681a4a5a98683e61d7d4f4d"}],"freezer_api/common/config.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"c6ee8e6c019b4ddd7f3d6e91c87d530414b7e984","unresolved":true,"context_lines":[{"line_number":122,"context_line":"    CONF.register_opts(centralized_scheduler_opts(), group\u003dopt_group)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def keystone_client_opts():"},{"line_number":126,"context_line":"    \"\"\"Return a list of keystone client options.\"\"\""},{"line_number":127,"context_line":"    options \u003d ["},{"line_number":128,"context_line":"        cfg.StrOpt(\u0027endpoint_type\u0027,"},{"line_number":129,"context_line":"                   help\u003d("},{"line_number":130,"context_line":"                       \u0027Type of endpoint in service catalog to use \u0027"},{"line_number":131,"context_line":"                       \u0027for communication with Identity service.\u0027)),"},{"line_number":132,"context_line":"        cfg.StrOpt(\u0027region_name\u0027,"},{"line_number":133,"context_line":"                   help\u003d("},{"line_number":134,"context_line":"                       \u0027Region name used to get identity service endpoint.\u0027)),"},{"line_number":135,"context_line":"        cfg.StrOpt(\u0027ca_file\u0027,"},{"line_number":136,"context_line":"                   help\u003d(\u0027Optional CA cert file to use in SSL connections.\u0027)),"},{"line_number":137,"context_line":"        cfg.StrOpt(\u0027cert_file\u0027,"},{"line_number":138,"context_line":"                   help\u003d(\u0027Optional PEM-formatted certificate chain file.\u0027)),"},{"line_number":139,"context_line":"        cfg.StrOpt(\u0027key_file\u0027,"},{"line_number":140,"context_line":"                   help\u003d(\u0027Optional PEM-formatted file that contains the \u0027"},{"line_number":141,"context_line":"                         \u0027private key.\u0027)),"},{"line_number":142,"context_line":"        cfg.BoolOpt(\u0027insecure\u0027,"},{"line_number":143,"context_line":"                    default\u003dFalse,"},{"line_number":144,"context_line":"                    help\u003d(\"If set, then the server\u0027s certificate will not \""},{"line_number":145,"context_line":"                          \"be verified.\")),"},{"line_number":146,"context_line":"        cfg.IntOpt(\u0027retry_limit\u0027,"},{"line_number":147,"context_line":"                   default\u003d2,"},{"line_number":148,"context_line":"                   help\u003d(\u0027Number of times to retry when a client encounters an\u0027"},{"line_number":149,"context_line":"                         \u0027 expected intermittent error. Set to 0 to disable \u0027"},{"line_number":150,"context_line":"                         \u0027retries.\u0027)),"},{"line_number":151,"context_line":"    ]"},{"line_number":152,"context_line":"    return options"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def register_keystone_client_opts():"},{"line_number":156,"context_line":"    \"\"\"Register keystone client options.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"8eec69b2_f132753a","line":153,"range":{"start_line":125,"start_character":0,"end_line":153,"end_character":0},"updated":"2025-12-11 14:02:18.000000000","message":"We already have `AUTH_GROUP, AUTH_OPTS` defined on L29 - do we really need to have another section?","commit_id":"d06aaa4b263745676ddd4a65b0df6bb5bc1b854a"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"7905d5904f387235dd0a4ee54be33588aa211df9","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    CONF.register_opts(centralized_scheduler_opts(), group\u003dopt_group)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def keystone_client_opts():"},{"line_number":126,"context_line":"    \"\"\"Return a list of keystone client options.\"\"\""},{"line_number":127,"context_line":"    options \u003d ["},{"line_number":128,"context_line":"        cfg.StrOpt(\u0027endpoint_type\u0027,"},{"line_number":129,"context_line":"                   help\u003d("},{"line_number":130,"context_line":"                       \u0027Type of endpoint in service catalog to use \u0027"},{"line_number":131,"context_line":"                       \u0027for communication with Identity service.\u0027)),"},{"line_number":132,"context_line":"        cfg.StrOpt(\u0027region_name\u0027,"},{"line_number":133,"context_line":"                   help\u003d("},{"line_number":134,"context_line":"                       \u0027Region name used to get identity service endpoint.\u0027)),"},{"line_number":135,"context_line":"        cfg.StrOpt(\u0027ca_file\u0027,"},{"line_number":136,"context_line":"                   help\u003d(\u0027Optional CA cert file to use in SSL connections.\u0027)),"},{"line_number":137,"context_line":"        cfg.StrOpt(\u0027cert_file\u0027,"},{"line_number":138,"context_line":"                   help\u003d(\u0027Optional PEM-formatted certificate chain file.\u0027)),"},{"line_number":139,"context_line":"        cfg.StrOpt(\u0027key_file\u0027,"},{"line_number":140,"context_line":"                   help\u003d(\u0027Optional PEM-formatted file that contains the \u0027"},{"line_number":141,"context_line":"                         \u0027private key.\u0027)),"},{"line_number":142,"context_line":"        cfg.BoolOpt(\u0027insecure\u0027,"},{"line_number":143,"context_line":"                    default\u003dFalse,"},{"line_number":144,"context_line":"                    help\u003d(\"If set, then the server\u0027s certificate will not \""},{"line_number":145,"context_line":"                          \"be verified.\")),"},{"line_number":146,"context_line":"        cfg.IntOpt(\u0027retry_limit\u0027,"},{"line_number":147,"context_line":"                   default\u003d2,"},{"line_number":148,"context_line":"                   help\u003d(\u0027Number of times to retry when a client encounters an\u0027"},{"line_number":149,"context_line":"                         \u0027 expected intermittent error. Set to 0 to disable \u0027"},{"line_number":150,"context_line":"                         \u0027retries.\u0027)),"},{"line_number":151,"context_line":"    ]"},{"line_number":152,"context_line":"    return options"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def register_keystone_client_opts():"},{"line_number":156,"context_line":"    \"\"\"Register keystone client options.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff3ecbd2_f26f23ca","line":153,"range":{"start_line":125,"start_character":0,"end_line":153,"end_character":0},"in_reply_to":"8eec69b2_f132753a","updated":"2026-03-12 14:08:03.000000000","message":"Done","commit_id":"d06aaa4b263745676ddd4a65b0df6bb5bc1b854a"}],"freezer_api/db/sqlalchemy/api.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"d138115154a9af6b6e7c7fe1319b8cd657e909ed","unresolved":true,"context_lines":[{"line_number":752,"context_line":"            id\u003duuid.uuid4().hex,"},{"line_number":753,"context_line":"            trust_id\u003djob_doc[\u0027user_credentials\u0027][\u0027trust_id\u0027],"},{"line_number":754,"context_line":"            trustor_user_id\u003djob_doc[\u0027user_credentials\u0027][\u0027trustor_user_id\u0027],"},{"line_number":755,"context_line":"            job_id\u003djob_id)"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    add_tuple(tuple\u003djob)"},{"line_number":758,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ec6f12d1_895de526","line":755,"range":{"start_line":755,"start_character":0,"end_line":755,"end_character":26},"updated":"2026-03-16 16:40:12.000000000","message":"we have a list here now, so should be refactored","commit_id":"871ce5da476d233c2b4d1b660c128ded53ea5aae"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"94c955d5df405919d77dff023a77197092cefbc3","unresolved":false,"context_lines":[{"line_number":752,"context_line":"            id\u003duuid.uuid4().hex,"},{"line_number":753,"context_line":"            trust_id\u003djob_doc[\u0027user_credentials\u0027][\u0027trust_id\u0027],"},{"line_number":754,"context_line":"            trustor_user_id\u003djob_doc[\u0027user_credentials\u0027][\u0027trustor_user_id\u0027],"},{"line_number":755,"context_line":"            job_id\u003djob_id)"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    add_tuple(tuple\u003djob)"},{"line_number":758,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"87eb9c9a_c8a627da","line":755,"range":{"start_line":755,"start_character":0,"end_line":755,"end_character":26},"in_reply_to":"ec6f12d1_895de526","updated":"2026-03-17 14:43:45.000000000","message":"Done","commit_id":"871ce5da476d233c2b4d1b660c128ded53ea5aae"}],"freezer_api/db/sqlalchemy/migrations/versions/29a2fd19eb86_user_credentials.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"d138115154a9af6b6e7c7fe1319b8cd657e909ed","unresolved":true,"context_lines":[{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027trust_id\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027trustor_user_id\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027job_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":43,"context_line":"        sa.Column(\u0027deleted_at\u0027, sa.DateTime(), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":10,"id":"a9acc250_42c91d50","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":66},"updated":"2026-03-16 16:40:12.000000000","message":"also refed here","commit_id":"871ce5da476d233c2b4d1b660c128ded53ea5aae"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"94c955d5df405919d77dff023a77197092cefbc3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sa.Column(\u0027id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027trust_id\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027trustor_user_id\u0027, sa.String(length\u003d64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027job_id\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":43,"context_line":"        sa.Column(\u0027deleted_at\u0027, sa.DateTime(), nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":10,"id":"1d4b7f18_f2f5167e","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":66},"in_reply_to":"a9acc250_42c91d50","updated":"2026-03-17 14:43:45.000000000","message":"Done","commit_id":"871ce5da476d233c2b4d1b660c128ded53ea5aae"}],"freezer_api/db/sqlalchemy/models.py":[{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"d138115154a9af6b6e7c7fe1319b8cd657e909ed","unresolved":true,"context_lines":[{"line_number":173,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"},{"line_number":174,"context_line":"    trust_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":175,"context_line":"    trustor_user_id \u003d Column(String(64), nullable\u003dFalse)"},{"line_number":176,"context_line":"    job_id \u003d Column(String(36), ForeignKey(\u0027jobs.id\u0027), nullable\u003dFalse)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class ActionReport(BASE, FreezerBase):"}],"source_content_type":"text/x-python","patch_set":10,"id":"6a30b46f_e1bca7ea","line":176,"range":{"start_line":176,"start_character":0,"end_line":176,"end_character":70},"updated":"2026-03-16 16:40:12.000000000","message":"now this could be a list of jobs, so this should be re-designed now.","commit_id":"871ce5da476d233c2b4d1b660c128ded53ea5aae"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"94c955d5df405919d77dff023a77197092cefbc3","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"},{"line_number":174,"context_line":"    trust_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":175,"context_line":"    trustor_user_id \u003d Column(String(64), nullable\u003dFalse)"},{"line_number":176,"context_line":"    job_id \u003d Column(String(36), ForeignKey(\u0027jobs.id\u0027), nullable\u003dFalse)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class ActionReport(BASE, FreezerBase):"}],"source_content_type":"text/x-python","patch_set":10,"id":"c8e062b7_b70e71c3","line":176,"range":{"start_line":176,"start_character":0,"end_line":176,"end_character":70},"in_reply_to":"6a30b46f_e1bca7ea","updated":"2026-03-17 14:43:45.000000000","message":"Done","commit_id":"871ce5da476d233c2b4d1b660c128ded53ea5aae"}]}
