)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Create some scoped and unscoped versions of endpoints to better"},{"line_number":10,"context_line":"support whitelabeling."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* autohold-info: GET /api/autohold/{id}"},{"line_number":13,"context_line":"* autohold-info (scoped): GET /api/tenant/{tenant}/autohold/{id}"},{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_c1c85475","line":11,"updated":"2020-05-19 16:47:44.000000000","message":"Quick notes below based on discussion in IRC (in short, most things should be tenant-scoped, except the connections and info endpoints).","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Create some scoped and unscoped versions of endpoints to better"},{"line_number":10,"context_line":"support whitelabeling."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* autohold-info: GET /api/autohold/{id}"},{"line_number":13,"context_line":"* autohold-info (scoped): GET /api/tenant/{tenant}/autohold/{id}"},{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":15,"context_line":"* autohold-delete: DELETE /api/autohold/{id}"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_a1c3a056","line":12,"updated":"2020-05-19 16:47:44.000000000","message":"I think we can drop this (global autohold).","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* autohold-info: GET /api/autohold/{id}"},{"line_number":13,"context_line":"* autohold-info (scoped): GET /api/tenant/{tenant}/autohold/{id}"},{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":15,"context_line":"* autohold-delete: DELETE /api/autohold/{id}"},{"line_number":16,"context_line":"* autohold-delete (scoped): DELETE /api/tenant/{tenant}/autohold/{id}"},{"line_number":17,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_01a40cb9","line":14,"updated":"2020-05-19 16:47:44.000000000","message":"This is good (tenant autohold).","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":12,"context_line":"* autohold-info: GET /api/autohold/{id}"},{"line_number":13,"context_line":"* autohold-info (scoped): GET /api/tenant/{tenant}/autohold/{id}"},{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":15,"context_line":"* autohold-delete: DELETE /api/autohold/{id}"},{"line_number":16,"context_line":"* autohold-delete (scoped): DELETE /api/tenant/{tenant}/autohold/{id}"},{"line_number":17,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":18,"context_line":"* connections: GET /api/connections and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_e1a638c1","line":15,"updated":"2020-05-19 16:47:44.000000000","message":"Drop global autohold.","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":15,"context_line":"* autohold-delete: DELETE /api/autohold/{id}"},{"line_number":16,"context_line":"* autohold-delete (scoped): DELETE /api/tenant/{tenant}/autohold/{id}"},{"line_number":17,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":18,"context_line":"* connections: GET /api/connections and"},{"line_number":19,"context_line":"  GET /api/tenant/{tenant}/connections return the same output regardless"},{"line_number":20,"context_line":"  of tenant."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_41aa8484","line":17,"updated":"2020-05-19 16:47:44.000000000","message":"Keep tenant autohold.","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":15,"context_line":"* autohold-delete: DELETE /api/autohold/{id}"},{"line_number":16,"context_line":"* autohold-delete (scoped): DELETE /api/tenant/{tenant}/autohold/{id}"},{"line_number":17,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":18,"context_line":"* connections: GET /api/connections and"},{"line_number":19,"context_line":"  GET /api/tenant/{tenant}/connections return the same output regardless"},{"line_number":20,"context_line":"  of tenant."},{"line_number":21,"context_line":"* authorizations: changed path to /api/authorizations"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_21add09a","line":18,"updated":"2020-05-19 16:47:44.000000000","message":"Keep global connections.","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":17,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":18,"context_line":"* connections: GET /api/connections and"},{"line_number":19,"context_line":"  GET /api/tenant/{tenant}/connections return the same output regardless"},{"line_number":20,"context_line":"  of tenant."},{"line_number":21,"context_line":"* authorizations: changed path to /api/authorizations"},{"line_number":22,"context_line":"* authorizations (scoped): GET /api/tenant/{tenant}/authorizations"},{"line_number":23,"context_line":"  returns a list of authorized tenants scoped to {tenant}, ie either"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_81977c48","line":20,"updated":"2020-05-19 16:47:44.000000000","message":"Drop tenant connections.","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":18,"context_line":"* connections: GET /api/connections and"},{"line_number":19,"context_line":"  GET /api/tenant/{tenant}/connections return the same output regardless"},{"line_number":20,"context_line":"  of tenant."},{"line_number":21,"context_line":"* authorizations: changed path to /api/authorizations"},{"line_number":22,"context_line":"* authorizations (scoped): GET /api/tenant/{tenant}/authorizations"},{"line_number":23,"context_line":"  returns a list of authorized tenants scoped to {tenant}, ie either"},{"line_number":24,"context_line":"  [tenant,] or [] depending on the user\u0027s authorizations."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_61922859","line":21,"updated":"2020-05-19 16:47:44.000000000","message":"Drop global authorizations.  This will be an API breakage, so maybe just leave the /user/authorizations endpoint alone in this patch, and then remove it later?  Unless we\u0027re sure nothing is using it, in which case we can drop it now.","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2a9e64c8ae6702626ff2ad9b52a404d2ddbcf458","unresolved":false,"context_lines":[{"line_number":21,"context_line":"* authorizations: changed path to /api/authorizations"},{"line_number":22,"context_line":"* authorizations (scoped): GET /api/tenant/{tenant}/authorizations"},{"line_number":23,"context_line":"  returns a list of authorized tenants scoped to {tenant}, ie either"},{"line_number":24,"context_line":"  [tenant,] or [] depending on the user\u0027s authorizations."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: Ibbe5e07a886d54ecd641bb64f02e28dbf8025659"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ff570b3c_c19df466","line":24,"updated":"2020-05-19 16:47:44.000000000","message":"Keep this.","commit_id":"5d683522933302925cc32e4b19ce30194e000b27"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"6d6917c9f848bef3b1c01831f4b2a0f50aa99072","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Improve whitelabeling support of the REST API."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"* autohold-info: GET /api/tenant/{tenant}/autohold/{id}"},{"line_number":12,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":13,"context_line":"* autohold-delete: DELETE /api/tenant/{tenant}/autohold/{id}"},{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":15,"context_line":"* authorizations: /api/user/authorizations is deprecated in favor of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"9f560f44_6afd436d","line":12,"updated":"2020-10-05 16:43:49.000000000","message":"It seems like the code actually returns 404 in that case.","commit_id":"894f53a4b68f634a91b48b92bb26e2e712402d84"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"c3fc24d0906162466581864589502bdf8b8e902f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Improve whitelabeling support of the REST API."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"* autohold-info: GET /api/tenant/{tenant}/autohold/{id}"},{"line_number":12,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":13,"context_line":"* autohold-delete: DELETE /api/tenant/{tenant}/autohold/{id}"},{"line_number":14,"context_line":"  returns a 403 Forbidden if the autohold id does not match the tenant"},{"line_number":15,"context_line":"* authorizations: /api/user/authorizations is deprecated in favor of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"9f560f44_76bfceaa","line":12,"in_reply_to":"9f560f44_6afd436d","updated":"2020-10-07 12:44:54.000000000","message":"Done","commit_id":"894f53a4b68f634a91b48b92bb26e2e712402d84"}],"releasenotes/notes/scoping_REST_API-866574c4d73c577a.yaml":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"a72c14535e1aca5621d2b2192f1a8d9d7072324c","unresolved":false,"context_lines":[{"line_number":8,"context_line":"deprecations:"},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    REST API: authorizations: the /api/user/authorizations endpoint is deprecated"},{"line_number":11,"context_line":"    in favor of the tenant-scoped endpoint. It will be removed next release."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"bf51134e_508545ce","line":11,"updated":"2020-06-23 21:35:55.000000000","message":"I\u0027m not sure I follow the utility of this change. Either you are authorized on the current tenant or not. Why make this return a list if it is a binary answer?\n\nRelated, would it be more useful to keep the non scoped request to get a complete list?","commit_id":"3ee553b04aa97c8934f3b2ab8374268c88269283"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"3ded0dad4cb1e863c5e0dcc3ef9168f57a4df57b","unresolved":false,"context_lines":[{"line_number":8,"context_line":"deprecations:"},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    REST API: authorizations: the /api/user/authorizations endpoint is deprecated"},{"line_number":11,"context_line":"    in favor of the tenant-scoped endpoint. It will be removed next release."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"bf51134e_7e26106a","line":11,"in_reply_to":"bf51134e_508545ce","updated":"2020-06-29 16:09:23.000000000","message":"I kept the list format for consistency between both endpoints, but a boolean would be indeed enough.\n\nAuthZ and AuthN for the web UI are meant to be tenant-scoped, which limits the utility of the non scoped endpoint. And my understanding from previous discussions is that unscoped endpoints should be the exception, not the norm.","commit_id":"3ee553b04aa97c8934f3b2ab8374268c88269283"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"45d8fd1ee0511d556f3d40b423877af53de61420","unresolved":false,"context_lines":[{"line_number":8,"context_line":"deprecations:"},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    REST API: authorizations: the /api/user/authorizations endpoint is deprecated"},{"line_number":11,"context_line":"    in favor of the tenant-scoped endpoint. It will be removed next release."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"9f560f44_f80764c8","line":11,"in_reply_to":"bf51134e_53d27a5d","updated":"2020-08-19 11:03:25.000000000","message":"Done","commit_id":"3ee553b04aa97c8934f3b2ab8374268c88269283"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"b77384518962e1d7cdc3b5aa8bc7058dbd627106","unresolved":false,"context_lines":[{"line_number":8,"context_line":"deprecations:"},{"line_number":9,"context_line":"  - |"},{"line_number":10,"context_line":"    REST API: authorizations: the /api/user/authorizations endpoint is deprecated"},{"line_number":11,"context_line":"    in favor of the tenant-scoped endpoint. It will be removed next release."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"bf51134e_53d27a5d","line":11,"in_reply_to":"bf51134e_7e26106a","updated":"2020-07-10 13:41:45.000000000","message":"If we want to deprecate the non-scoped I think we don\u0027t have to keep that part consistent as it will be removed anyway in the future.\n\nIn this case I think we should consider getting just a bool (or maybe a data structure of the real permissions if we go towards more granular permissions at some time like read/admin or so).","commit_id":"3ee553b04aa97c8934f3b2ab8374268c88269283"}],"tests/unit/test_web.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"47af660e78e620485bec97209cceb46af002a17a","unresolved":false,"context_lines":[{"line_number":1404,"context_line":"        self.assertEqual(1, len(autohold_requests))"},{"line_number":1405,"context_line":"        request \u003d autohold_requests[0]"},{"line_number":1406,"context_line":"        resp \u003d self.delete_url("},{"line_number":1407,"context_line":"            \"api//tenant/tenant-one/autohold/%s\" % request[\u0027id\u0027],"},{"line_number":1408,"context_line":"            headers\u003d{\u0027Authorization\u0027: \u0027Bearer %s\u0027 % token})"},{"line_number":1409,"context_line":"        self.assertEqual(403, resp.status_code)"},{"line_number":1410,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_91a332b2","line":1407,"updated":"2020-05-20 16:28:11.000000000","message":"-1: Extra / ?","commit_id":"2635c472543878402878c51338396828ed0761f9"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"64d1bd2e17a7b32b0b31af9d91f7a0aca525eade","unresolved":false,"context_lines":[{"line_number":1404,"context_line":"        self.assertEqual(1, len(autohold_requests))"},{"line_number":1405,"context_line":"        request \u003d autohold_requests[0]"},{"line_number":1406,"context_line":"        resp \u003d self.delete_url("},{"line_number":1407,"context_line":"            \"api//tenant/tenant-one/autohold/%s\" % request[\u0027id\u0027],"},{"line_number":1408,"context_line":"            headers\u003d{\u0027Authorization\u0027: \u0027Bearer %s\u0027 % token})"},{"line_number":1409,"context_line":"        self.assertEqual(403, resp.status_code)"},{"line_number":1410,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_779ec354","line":1407,"in_reply_to":"ff570b3c_91a332b2","updated":"2020-06-19 08:30:58.000000000","message":"Done","commit_id":"2635c472543878402878c51338396828ed0761f9"}],"zuul/web/__init__.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"47af660e78e620485bec97209cceb46af002a17a","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                if tenant !\u003d request[\u0027tenant\u0027]:"},{"line_number":468,"context_line":"                    raise cherrypy.HTTPError("},{"line_number":469,"context_line":"                        403,"},{"line_number":470,"context_line":"                        \u0027This request belongs to another tenant\u0027)"},{"line_number":471,"context_line":"            return {"},{"line_number":472,"context_line":"                \u0027id\u0027: request[\u0027id\u0027],"},{"line_number":473,"context_line":"                \u0027tenant\u0027: request[\u0027tenant\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff570b3c_71a65ec3","line":470,"updated":"2020-05-20 16:28:11.000000000","message":"Should we think about performing the tenant check first and returning a 404 if it doesn\u0027t match?  That might set us up to avoid future data leaks. (not a minus one)","commit_id":"2635c472543878402878c51338396828ed0761f9"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"64d1bd2e17a7b32b0b31af9d91f7a0aca525eade","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                if tenant !\u003d request[\u0027tenant\u0027]:"},{"line_number":468,"context_line":"                    raise cherrypy.HTTPError("},{"line_number":469,"context_line":"                        403,"},{"line_number":470,"context_line":"                        \u0027This request belongs to another tenant\u0027)"},{"line_number":471,"context_line":"            return {"},{"line_number":472,"context_line":"                \u0027id\u0027: request[\u0027id\u0027],"},{"line_number":473,"context_line":"                \u0027tenant\u0027: request[\u0027tenant\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_97d1d7fe","line":470,"in_reply_to":"ff570b3c_71a65ec3","updated":"2020-06-19 08:30:58.000000000","message":"Done","commit_id":"2635c472543878402878c51338396828ed0761f9"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"db818acd655bd5f7774bb51d7af5e6a07b7721bf","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    @cherrypy.tools.handle_options(allowed_methods\u003d[\u0027GET\u0027, \u0027DELETE\u0027, ])"},{"line_number":470,"context_line":"    def autohold_by_request_id(self, tenant, request_id):"},{"line_number":471,"context_line":"        if cherrypy.request.method \u003d\u003d \u0027GET\u0027:"},{"line_number":472,"context_line":"            return self._autohold_info(request_id, tenant)"},{"line_number":473,"context_line":"        elif cherrypy.request.method \u003d\u003d \u0027DELETE\u0027:"},{"line_number":474,"context_line":"            return self._autohold_delete(request_id, tenant)"},{"line_number":475,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_99cf62af","line":472,"range":{"start_line":472,"start_character":12,"end_line":472,"end_character":58},"updated":"2020-06-18 13:12:00.000000000","message":"nit: should we keep the same order, e.g. (tenant, request_it) ?","commit_id":"d50ee2540f2e5f8c040fb04bceb5a20a639b2cc5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"64d1bd2e17a7b32b0b31af9d91f7a0aca525eade","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    @cherrypy.tools.handle_options(allowed_methods\u003d[\u0027GET\u0027, \u0027DELETE\u0027, ])"},{"line_number":470,"context_line":"    def autohold_by_request_id(self, tenant, request_id):"},{"line_number":471,"context_line":"        if cherrypy.request.method \u003d\u003d \u0027GET\u0027:"},{"line_number":472,"context_line":"            return self._autohold_info(request_id, tenant)"},{"line_number":473,"context_line":"        elif cherrypy.request.method \u003d\u003d \u0027DELETE\u0027:"},{"line_number":474,"context_line":"            return self._autohold_delete(request_id, tenant)"},{"line_number":475,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_d7f4ef88","line":472,"range":{"start_line":472,"start_character":12,"end_line":472,"end_character":58},"in_reply_to":"bf51134e_99cf62af","updated":"2020-06-19 08:30:58.000000000","message":"the _ methods are not exposed, and the arg order is a remnant from these actions not being properly tenant-scoped. I\u0027ll fix it in the next PS for consistency","commit_id":"d50ee2540f2e5f8c040fb04bceb5a20a639b2cc5"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"db818acd655bd5f7774bb51d7af5e6a07b7721bf","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        else:"},{"line_number":476,"context_line":"            raise cherrypy.HTTPError(405)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    def _autohold_info(self, request_id, tenant\u003dNone):"},{"line_number":479,"context_line":"        job \u003d self.rpc.submitJob(\u0027zuul:autohold_info\u0027,"},{"line_number":480,"context_line":"                                 {\u0027request_id\u0027: request_id})"},{"line_number":481,"context_line":"        if job.failure:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_39c0d67b","line":478,"range":{"start_line":478,"start_character":41,"end_line":478,"end_character":53},"updated":"2020-06-18 13:12:00.000000000","message":"How can the tenant be None here?","commit_id":"d50ee2540f2e5f8c040fb04bceb5a20a639b2cc5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"64d1bd2e17a7b32b0b31af9d91f7a0aca525eade","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        else:"},{"line_number":476,"context_line":"            raise cherrypy.HTTPError(405)"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    def _autohold_info(self, request_id, tenant\u003dNone):"},{"line_number":479,"context_line":"        job \u003d self.rpc.submitJob(\u0027zuul:autohold_info\u0027,"},{"line_number":480,"context_line":"                                 {\u0027request_id\u0027: request_id})"},{"line_number":481,"context_line":"        if job.failure:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_f77c93ec","line":478,"range":{"start_line":478,"start_character":41,"end_line":478,"end_character":53},"in_reply_to":"bf51134e_39c0d67b","updated":"2020-06-19 08:30:58.000000000","message":"Done","commit_id":"d50ee2540f2e5f8c040fb04bceb5a20a639b2cc5"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"db818acd655bd5f7774bb51d7af5e6a07b7721bf","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                \u0027nodes\u0027: request[\u0027nodes\u0027]"},{"line_number":507,"context_line":"            }"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def _autohold_delete(self, request_id, tenant\u003dNone):"},{"line_number":510,"context_line":"        # We need tenant info from the request for authz"},{"line_number":511,"context_line":"        request \u003d self._autohold_info(request_id, tenant)"},{"line_number":512,"context_line":"        basic_error \u003d self._basic_auth_header_check()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_9944821d","line":509,"range":{"start_line":509,"start_character":43,"end_line":509,"end_character":54},"updated":"2020-06-18 13:12:00.000000000","message":"How can the tenant be None here?","commit_id":"d50ee2540f2e5f8c040fb04bceb5a20a639b2cc5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"64d1bd2e17a7b32b0b31af9d91f7a0aca525eade","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                \u0027nodes\u0027: request[\u0027nodes\u0027]"},{"line_number":507,"context_line":"            }"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def _autohold_delete(self, request_id, tenant\u003dNone):"},{"line_number":510,"context_line":"        # We need tenant info from the request for authz"},{"line_number":511,"context_line":"        request \u003d self._autohold_info(request_id, tenant)"},{"line_number":512,"context_line":"        basic_error \u003d self._basic_auth_header_check()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_37872bda","line":509,"range":{"start_line":509,"start_character":43,"end_line":509,"end_character":54},"in_reply_to":"bf51134e_9944821d","updated":"2020-06-19 08:30:58.000000000","message":"Done","commit_id":"d50ee2540f2e5f8c040fb04bceb5a20a639b2cc5"}]}
