parent
303db01ec5
commit
04df2410ec
4 changed files with 42 additions and 26 deletions
|
@ -8,11 +8,11 @@ import hashlib
|
|||
from flask import request
|
||||
from rfc3987 import parse as uri_parse
|
||||
|
||||
from app import app, userfiles as user_files, build_logs, log_archive, dockerfile_build_queue
|
||||
from app import userfiles as user_files, build_logs, log_archive, dockerfile_build_queue
|
||||
from buildtrigger.basehandler import BuildTriggerHandler
|
||||
from endpoints.api import (RepositoryParamResource, parse_args, query_param, nickname, resource,
|
||||
require_repo_read, require_repo_write, validate_json_request,
|
||||
ApiResource, internal_only, format_date, api, path_param,
|
||||
ApiResource, internal_only, format_date, api, path_param,
|
||||
require_repo_admin)
|
||||
from endpoints.exception import Unauthorized, NotFound, InvalidRequest
|
||||
from endpoints.building import start_build, PreparedBuild
|
||||
|
@ -20,7 +20,8 @@ from data import database
|
|||
from data import model
|
||||
from auth.auth_context import get_authenticated_user
|
||||
from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission,
|
||||
AdministerRepositoryPermission, AdministerOrganizationPermission)
|
||||
AdministerRepositoryPermission, AdministerOrganizationPermission,
|
||||
SuperUserPermission)
|
||||
|
||||
from data.buildlogs import BuildStatusRetrievalError
|
||||
from util.names import parse_robot_username
|
||||
|
@ -87,26 +88,33 @@ def trigger_view(trigger, can_read=False, can_admin=False, for_build=False):
|
|||
|
||||
def build_status_view(build_obj):
|
||||
phase = build_obj.phase
|
||||
status = {}
|
||||
error = None
|
||||
|
||||
try:
|
||||
status = build_logs.get_status(build_obj.uuid)
|
||||
except BuildStatusRetrievalError:
|
||||
status = {}
|
||||
except BuildStatusRetrievalError as bsre:
|
||||
phase = 'cannot_load'
|
||||
if SuperUserPermission().can():
|
||||
error = str(bsre)
|
||||
else:
|
||||
error = 'Redis may be down. Please contact support.'
|
||||
|
||||
# If the status contains a heartbeat, then check to see if has been written in the last few
|
||||
# minutes. If not, then the build timed out.
|
||||
if phase != database.BUILD_PHASE.COMPLETE and phase != database.BUILD_PHASE.ERROR:
|
||||
if status is not None and 'heartbeat' in status and status['heartbeat']:
|
||||
heartbeat = datetime.datetime.utcfromtimestamp(status['heartbeat'])
|
||||
if datetime.datetime.utcnow() - heartbeat > datetime.timedelta(minutes=1):
|
||||
phase = database.BUILD_PHASE.INTERNAL_ERROR
|
||||
if phase != 'cannot_load':
|
||||
# If the status contains a heartbeat, then check to see if has been written in the last few
|
||||
# minutes. If not, then the build timed out.
|
||||
if phase != database.BUILD_PHASE.COMPLETE and phase != database.BUILD_PHASE.ERROR:
|
||||
if status is not None and 'heartbeat' in status and status['heartbeat']:
|
||||
heartbeat = datetime.datetime.utcfromtimestamp(status['heartbeat'])
|
||||
if datetime.datetime.utcnow() - heartbeat > datetime.timedelta(minutes=1):
|
||||
phase = database.BUILD_PHASE.INTERNAL_ERROR
|
||||
|
||||
# If the phase is internal error, return 'error' instead if the number of retries
|
||||
# on the queue item is 0.
|
||||
if phase == database.BUILD_PHASE.INTERNAL_ERROR:
|
||||
retry = build_obj.queue_id and dockerfile_build_queue.has_retries_remaining(build_obj.queue_id)
|
||||
if not retry:
|
||||
phase = database.BUILD_PHASE.ERROR
|
||||
# If the phase is internal error, return 'error' instead if the number of retries
|
||||
# on the queue item is 0.
|
||||
if phase == database.BUILD_PHASE.INTERNAL_ERROR:
|
||||
retry = build_obj.queue_id and dockerfile_build_queue.has_retries_remaining(build_obj.queue_id)
|
||||
if not retry:
|
||||
phase = database.BUILD_PHASE.ERROR
|
||||
|
||||
repo_namespace = build_obj.repository.namespace_user.username
|
||||
repo_name = build_obj.repository.name
|
||||
|
@ -134,7 +142,8 @@ def build_status_view(build_obj):
|
|||
'repository': {
|
||||
'namespace': repo_namespace,
|
||||
'name': repo_name
|
||||
}
|
||||
},
|
||||
'error': error,
|
||||
}
|
||||
|
||||
if can_write:
|
||||
|
|
Reference in a new issue