)]}'
{"tests/unit/test_web.py":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"b75b29b5cb31a346ccb507db9b34931221389eb3","unresolved":false,"context_lines":[{"line_number":1303,"context_line":"                  \u0027newrev\u0027: \u0027aaaa\u0027,"},{"line_number":1304,"context_line":"                  \u0027oldrev\u0027: \u0027bbbb\u0027,"},{"line_number":1305,"context_line":"                  \u0027pipeline\u0027: \u0027check\u0027})"},{"line_number":1306,"context_line":"        self.assertEqual(403, resp.status_code)"},{"line_number":1307,"context_line":""},{"line_number":1308,"context_line":"    def test_autohold(self):"},{"line_number":1309,"context_line":"        \"\"\"Test that autohold can be set through the admin web interface\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_e9f31f08","line":1306,"updated":"2019-08-29 08:58:48.000000000","message":"NIT: I would add a test for autohold-delete there as well just to be on the side of caution","commit_id":"88b99ad4f5e8c6ad3913a27fe1130c88ae96b65d"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"c7b0fe79e46903362df85e1c5b375bbfc0185c4f","unresolved":false,"context_lines":[{"line_number":1303,"context_line":"                  \u0027newrev\u0027: \u0027aaaa\u0027,"},{"line_number":1304,"context_line":"                  \u0027oldrev\u0027: \u0027bbbb\u0027,"},{"line_number":1305,"context_line":"                  \u0027pipeline\u0027: \u0027check\u0027})"},{"line_number":1306,"context_line":"        self.assertEqual(403, resp.status_code)"},{"line_number":1307,"context_line":""},{"line_number":1308,"context_line":"    def test_autohold(self):"},{"line_number":1309,"context_line":"        \"\"\"Test that autohold can be set through the admin web interface\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_dd813a4f","line":1306,"in_reply_to":"7faddb67_e9f31f08","updated":"2019-08-29 14:59:45.000000000","message":"Done","commit_id":"88b99ad4f5e8c6ad3913a27fe1130c88ae96b65d"}],"zuul/web/__init__.py":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"13663420a8a2893208c1e64ea499df24ddb9a476","unresolved":false,"context_lines":[{"line_number":466,"context_line":"            }"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def _autohold_delete(request_id):"},{"line_number":469,"context_line":"        job \u003d self.rpc.submitJob(\u0027zuul:autohold_delete\u0027,"},{"line_number":470,"context_line":"                                 {\u0027request_id\u0027: request_id})"},{"line_number":471,"context_line":"        if job.failure:"},{"line_number":472,"context_line":"            raise cherrypy.HTTPError(500, \u0027autohold-delete failed\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_6c9c2bbf","line":469,"updated":"2019-08-28 15:09:18.000000000","message":"TODO: insert boilerplate authentication/authorization code above","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"f30a5ec7dd5ce57a7b63f36c3606b8e83a56bdc9","unresolved":false,"context_lines":[{"line_number":466,"context_line":"            }"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def _autohold_delete(request_id):"},{"line_number":469,"context_line":"        job \u003d self.rpc.submitJob(\u0027zuul:autohold_delete\u0027,"},{"line_number":470,"context_line":"                                 {\u0027request_id\u0027: request_id})"},{"line_number":471,"context_line":"        if job.failure:"},{"line_number":472,"context_line":"            raise cherrypy.HTTPError(500, \u0027autohold-delete failed\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_0c333764","line":469,"in_reply_to":"7faddb67_6c9c2bbf","updated":"2019-08-28 15:31:24.000000000","message":"Done","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"df3573868a6bff6ef628a6218943945c6915d41b","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        if job.failure:"},{"line_number":472,"context_line":"            raise cherrypy.HTTPError(500, \u0027autohold-delete failed\u0027)"},{"line_number":473,"context_line":"        else:"},{"line_number":474,"context_line":"            return True"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    @cherrypy.expose"},{"line_number":477,"context_line":"    @cherrypy.tools.json_out(content_type\u003d\u0027application/json; charset\u003dutf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_866146d6","line":474,"range":{"start_line":474,"start_character":12,"end_line":474,"end_character":23},"updated":"2019-08-28 13:44:14.000000000","message":"Is this the correct thing to return on success?","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"13663420a8a2893208c1e64ea499df24ddb9a476","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        if job.failure:"},{"line_number":472,"context_line":"            raise cherrypy.HTTPError(500, \u0027autohold-delete failed\u0027)"},{"line_number":473,"context_line":"        else:"},{"line_number":474,"context_line":"            return True"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    @cherrypy.expose"},{"line_number":477,"context_line":"    @cherrypy.tools.json_out(content_type\u003d\u0027application/json; charset\u003dutf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_c15de848","line":474,"range":{"start_line":474,"start_character":12,"end_line":474,"end_character":23},"in_reply_to":"7faddb67_866146d6","updated":"2019-08-28 15:09:18.000000000","message":"DELETE actions in REST APIs don\u0027t usually return anything on success (esp. if the delete is asynchronous); the HTTP status of the response is enough.\n\nInstead of returning True, do\n\n  cherrypy.response.status \u003d 204","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"f30a5ec7dd5ce57a7b63f36c3606b8e83a56bdc9","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        if job.failure:"},{"line_number":472,"context_line":"            raise cherrypy.HTTPError(500, \u0027autohold-delete failed\u0027)"},{"line_number":473,"context_line":"        else:"},{"line_number":474,"context_line":"            return True"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    @cherrypy.expose"},{"line_number":477,"context_line":"    @cherrypy.tools.json_out(content_type\u003d\u0027application/json; charset\u003dutf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_4c292ff0","line":474,"range":{"start_line":474,"start_character":12,"end_line":474,"end_character":23},"in_reply_to":"7faddb67_c15de848","updated":"2019-08-28 15:31:24.000000000","message":"Done","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"66988dd3ce3b3c3574dfc2eb57603507fbaab3d3","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                \u0027api\u0027,"},{"line_number":1079,"context_line":"                \u0027/api/tenant/{tenant}/project/{project:.*}/dequeue\u0027,"},{"line_number":1080,"context_line":"                controller\u003dapi, action\u003d\u0027dequeue\u0027)"},{"line_number":1081,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold/{request_id}\u0027,"},{"line_number":1082,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_by_request_id\u0027)"},{"line_number":1083,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold\u0027,"},{"line_number":1084,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_list\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_46826e54","line":1081,"range":{"start_line":1081,"start_character":39,"end_line":1081,"end_character":54},"updated":"2019-08-28 13:45:44.000000000","message":"Since \u0027tenant\u0027 is not needed to delete a request, should this path be different?","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"f30a5ec7dd5ce57a7b63f36c3606b8e83a56bdc9","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                \u0027api\u0027,"},{"line_number":1079,"context_line":"                \u0027/api/tenant/{tenant}/project/{project:.*}/dequeue\u0027,"},{"line_number":1080,"context_line":"                controller\u003dapi, action\u003d\u0027dequeue\u0027)"},{"line_number":1081,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold/{request_id}\u0027,"},{"line_number":1082,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_by_request_id\u0027)"},{"line_number":1083,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold\u0027,"},{"line_number":1084,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_list\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_acec63bb","line":1081,"range":{"start_line":1081,"start_character":39,"end_line":1081,"end_character":54},"in_reply_to":"7faddb67_215ddc78","updated":"2019-08-28 15:31:24.000000000","message":"Done","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"9090b34ac6ff1f12ec2c7f74ce292754c35316b8","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                \u0027api\u0027,"},{"line_number":1079,"context_line":"                \u0027/api/tenant/{tenant}/project/{project:.*}/dequeue\u0027,"},{"line_number":1080,"context_line":"                controller\u003dapi, action\u003d\u0027dequeue\u0027)"},{"line_number":1081,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold/{request_id}\u0027,"},{"line_number":1082,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_by_request_id\u0027)"},{"line_number":1083,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold\u0027,"},{"line_number":1084,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_list\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_46358ea7","line":1081,"range":{"start_line":1081,"start_character":39,"end_line":1081,"end_character":54},"in_reply_to":"7faddb67_46826e54","updated":"2019-08-28 13:48:37.000000000","message":"edit: not needed to delete OR get info on a specific request ID","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"13663420a8a2893208c1e64ea499df24ddb9a476","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"                \u0027api\u0027,"},{"line_number":1079,"context_line":"                \u0027/api/tenant/{tenant}/project/{project:.*}/dequeue\u0027,"},{"line_number":1080,"context_line":"                controller\u003dapi, action\u003d\u0027dequeue\u0027)"},{"line_number":1081,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold/{request_id}\u0027,"},{"line_number":1082,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_by_request_id\u0027)"},{"line_number":1083,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold\u0027,"},{"line_number":1084,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_list\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_215ddc78","line":1081,"range":{"start_line":1081,"start_character":39,"end_line":1081,"end_character":54},"in_reply_to":"7faddb67_46826e54","updated":"2019-08-28 15:09:18.000000000","message":"the path should just be \u0027/api/autohold/{request_id}\u0027\n\ncherrypy maps requests to this pattern, if there is a match anything in brackets will be passed as named args (here, request_id) to the action method","commit_id":"eb5cd86cf44965e7059898a0fbabe5c27020b800"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"b75b29b5cb31a346ccb507db9b34931221389eb3","unresolved":false,"context_lines":[{"line_number":479,"context_line":"            for header, contents in e.getAdditionalHeaders().items():"},{"line_number":480,"context_line":"                cherrypy.response.headers[header] \u003d contents"},{"line_number":481,"context_line":"            cherrypy.response.status \u003d e.HTTPError"},{"line_number":482,"context_line":"            return \u0027\u003ch1\u003e%s\u003c/h1\u003e\u0027 % e.error_description"},{"line_number":483,"context_line":"        self.is_authorized(claims, request[\u0027tenant\u0027])"},{"line_number":484,"context_line":"        msg \u003d \u0027User \"%s\" requesting \"%s\" on %s/%s\u0027"},{"line_number":485,"context_line":"        self.log.info("}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_a9be87fd","line":482,"range":{"start_line":482,"start_character":12,"end_line":482,"end_character":54},"updated":"2019-08-29 08:58:48.000000000","message":"This is going to change so that we return JSON rather than HTML, see https://review.opendev.org/#/c/641099/38/zuul/web/__init__.py\n\nIt\u0027d be best to change this directly here.","commit_id":"88b99ad4f5e8c6ad3913a27fe1130c88ae96b65d"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"c7b0fe79e46903362df85e1c5b375bbfc0185c4f","unresolved":false,"context_lines":[{"line_number":479,"context_line":"            for header, contents in e.getAdditionalHeaders().items():"},{"line_number":480,"context_line":"                cherrypy.response.headers[header] \u003d contents"},{"line_number":481,"context_line":"            cherrypy.response.status \u003d e.HTTPError"},{"line_number":482,"context_line":"            return \u0027\u003ch1\u003e%s\u003c/h1\u003e\u0027 % e.error_description"},{"line_number":483,"context_line":"        self.is_authorized(claims, request[\u0027tenant\u0027])"},{"line_number":484,"context_line":"        msg \u003d \u0027User \"%s\" requesting \"%s\" on %s/%s\u0027"},{"line_number":485,"context_line":"        self.log.info("}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_5dc30a8b","line":482,"range":{"start_line":482,"start_character":12,"end_line":482,"end_character":54},"in_reply_to":"7faddb67_a9be87fd","updated":"2019-08-29 14:59:45.000000000","message":"Done","commit_id":"88b99ad4f5e8c6ad3913a27fe1130c88ae96b65d"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"9559dfde58b89f390c95ff5ff24489c0ee8791c6","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            \u0027build\u0027: \u0027/api/tenant/{tenant}/build/{uuid}\u0027,"},{"line_number":524,"context_line":"            \u0027buildsets\u0027: \u0027/api/tenant/{tenant}/buildsets\u0027,"},{"line_number":525,"context_line":"            \u0027buildset\u0027: \u0027/api/tenant/{tenant}/buildset/{uuid}\u0027,"},{"line_number":526,"context_line":"            \u0027config_errors\u0027: \u0027/api/tenant/{tenant}/config-errors\u0027,"},{"line_number":527,"context_line":"        }"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    @cherrypy.expose"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_59bb8fe4","line":526,"updated":"2019-09-16 19:56:34.000000000","message":"nit: autohold are missing from the index.","commit_id":"12f68ee9c0a5c9f5fe76c9d048cdb20c015fed8d"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"54fb61fc1fd6e3e042db6ca4eee64b8f492dc3b3","unresolved":false,"context_lines":[{"line_number":523,"context_line":"            \u0027build\u0027: \u0027/api/tenant/{tenant}/build/{uuid}\u0027,"},{"line_number":524,"context_line":"            \u0027buildsets\u0027: \u0027/api/tenant/{tenant}/buildsets\u0027,"},{"line_number":525,"context_line":"            \u0027buildset\u0027: \u0027/api/tenant/{tenant}/buildset/{uuid}\u0027,"},{"line_number":526,"context_line":"            \u0027config_errors\u0027: \u0027/api/tenant/{tenant}/config-errors\u0027,"},{"line_number":527,"context_line":"        }"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    @cherrypy.expose"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_7dd0a6ca","line":526,"in_reply_to":"3fa7e38b_59bb8fe4","updated":"2019-09-17 16:33:20.000000000","message":"Not sure exactly what to put here since there is currently no autohold related data here, but if want you provide it, I can add it in another patchset.","commit_id":"12f68ee9c0a5c9f5fe76c9d048cdb20c015fed8d"},{"author":{"_account_id":9311,"name":"Tristan Cacqueray","email":"tdecacqu@redhat.com","username":"tristanC"},"change_message_id":"9559dfde58b89f390c95ff5ff24489c0ee8791c6","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                \u0027api\u0027,"},{"line_number":1101,"context_line":"                \u0027/api/tenant/{tenant}/project/{project:.*}/dequeue\u0027,"},{"line_number":1102,"context_line":"                controller\u003dapi, action\u003d\u0027dequeue\u0027)"},{"line_number":1103,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/autohold/{request_id}\u0027,"},{"line_number":1104,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_by_request_id\u0027)"},{"line_number":1105,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold\u0027,"},{"line_number":1106,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_list\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_99efc7e8","line":1103,"range":{"start_line":1103,"start_character":34,"end_line":1103,"end_character":48},"updated":"2019-09-16 19:56:34.000000000","message":"This should probably be scoped per tenant as white-labeled interface won\u0027t be able to get/delete requested autohold.","commit_id":"12f68ee9c0a5c9f5fe76c9d048cdb20c015fed8d"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"54fb61fc1fd6e3e042db6ca4eee64b8f492dc3b3","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                \u0027api\u0027,"},{"line_number":1101,"context_line":"                \u0027/api/tenant/{tenant}/project/{project:.*}/dequeue\u0027,"},{"line_number":1102,"context_line":"                controller\u003dapi, action\u003d\u0027dequeue\u0027)"},{"line_number":1103,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/autohold/{request_id}\u0027,"},{"line_number":1104,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_by_request_id\u0027)"},{"line_number":1105,"context_line":"        route_map.connect(\u0027api\u0027, \u0027/api/tenant/{tenant}/autohold\u0027,"},{"line_number":1106,"context_line":"                          controller\u003dapi, action\u003d\u0027autohold_list\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_1d4c12c6","line":1103,"range":{"start_line":1103,"start_character":34,"end_line":1103,"end_character":48},"in_reply_to":"3fa7e38b_99efc7e8","updated":"2019-09-17 16:33:20.000000000","message":"Done","commit_id":"12f68ee9c0a5c9f5fe76c9d048cdb20c015fed8d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"7050fed4cbf58d195dd8a4836c4432aaf2377f73","unresolved":false,"context_lines":[{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    @cherrypy.expose"},{"line_number":437,"context_line":"    @cherrypy.tools.json_out(content_type\u003d\u0027application/json; charset\u003dutf-8\u0027)"},{"line_number":438,"context_line":"    def autohold_by_request_id(self, tenant, request_id):"},{"line_number":439,"context_line":"        if cherrypy.request.method \u003d\u003d \u0027GET\u0027:"},{"line_number":440,"context_line":"            return self._autohold_info(request_id)"},{"line_number":441,"context_line":"        elif cherrypy.request.method \u003d\u003d \u0027DELETE\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_93120309","line":438,"updated":"2019-09-19 18:28:21.000000000","message":"You can specify the request method in the route_map and drop this method.","commit_id":"4931eed2b8dcdd9ec19be81cfcbdc422a2426ae1"}]}
