blob: 242b23325dede672d58cd6b21908436d1bc42c1c [file] [log] [blame]
# Copyright (C) 2019 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import traceback
from flask import abort, jsonify
from resultsdbpy.controller.archive_controller import ArchiveController
from resultsdbpy.controller.commit_controller import CommitController
from resultsdbpy.controller.ci_controller import CIController
from resultsdbpy.controller.failure_controller import FailureController
from resultsdbpy.controller.suite_controller import SuiteController
from resultsdbpy.controller.test_controller import TestController
from resultsdbpy.controller.upload_controller import UploadController
from resultsdbpy.flask_support.authed_blueprint import AuthedBlueprint
from werkzeug.exceptions import HTTPException
class APIRoutes(AuthedBlueprint):
def __init__(self, model, import_name=__name__, auth_decorator=None):
super(APIRoutes, self).__init__('controller', import_name, url_prefix='/api', auth_decorator=auth_decorator)
self.commit_controller = CommitController(commit_context=model.commit_context)
self.upload_controller = UploadController(commit_controller=self.commit_controller, upload_context=model.upload_context)
self.suite_controller = SuiteController(suite_context=model.suite_context)
self.test_controller = TestController(test_context=model.test_context)
self.failure_controller = FailureController(failure_context=model.failure_context)
self.ci_controller = CIController(ci_context=model.ci_context, upload_context=model.upload_context)
self.archive_controller = ArchiveController(commit_controller=self.commit_controller, archive_context=model.archive_context, upload_context=model.upload_context)
for code in [400, 404, 405]:
self.register_error_handler(code, self.error_response)
self.register_error_handler(500, self.response_500)
self.add_url_rule('/commits', 'commit_controller', self.commit_controller.default, methods=('GET', 'POST'))
self.add_url_rule('/commits/find', 'commit_controller_find', self.commit_controller.find, methods=('GET',))
self.add_url_rule('/commits/repositories', 'commit_controller_repositories', self.commit_controller.repositories, methods=('GET',))
self.add_url_rule('/commits/branches', 'commit_controller_branches', self.commit_controller.branches, methods=('GET',))
self.add_url_rule('/commits/siblings', 'commit_controller_siblings', self.commit_controller.siblings, methods=('GET',))
self.add_url_rule('/commits/next', 'commit_controller_next', self.commit_controller.next, methods=('GET',))
self.add_url_rule('/commits/previous', 'commit_controller_previous', self.commit_controller.previous, methods=('GET',))
self.add_url_rule('/commits/register', 'commit_controller_register', self.commit_controller.register, methods=('POST',))
self.add_url_rule('/upload', 'upload', self.upload_controller.upload, methods=('GET', 'POST'))
self.add_url_rule('/upload/archive', 'upload_archive', self.archive_controller.endpoint, methods=('GET', 'POST'))
self.add_url_rule('/upload/process', 'process', self.upload_controller.process, methods=('POST',))
self.add_url_rule('/suites', 'suites', self.upload_controller.suites, methods=('GET',))
self.add_url_rule('/<path:suite>/tests', 'tests-in-suite', self.test_controller.list_tests, methods=('GET',))
self.add_url_rule('/results/<path:suite>', 'suite-results', self.suite_controller.find_run_results, methods=('GET',))
self.add_url_rule('/results/<path:suite>/<path:test>', 'test-results', self.test_controller.find_test_result, methods=('GET',))
self.add_url_rule('/failures/<path:suite>', 'suite-failures', self.failure_controller.failures, methods=('GET',))
self.add_url_rule('/urls/queue', 'queue-urls', self.ci_controller.urls_for_queue_endpoint, methods=('GET',))
self.add_url_rule('/urls', 'build-urls', self.ci_controller.urls_for_builds_endpoint, methods=('GET',))
def error_response(self, error):
response = jsonify(status='error', error=error.name, description=error.description)
response.status = f'error.{error.name}'
response.status_code = error.code
return response
def response_500(cls, error):
if isinstance(error, HTTPException):
print(traceback.format_stack())
response = jsonify(status='error', error=error.name, description=error.description)
response.status = f'error.{error.name}'
response.status_code = error.code
return response
response = jsonify(status='error', error='Internal Server Error', description=str(error))
response.status = 'error.Internal Server Error'
response.status_code = 500
return response