Refactor a lot of the build create code out into a common method. Add an endpoint for manually starting triggers.

This commit is contained in:
jakedt 2014-02-25 19:39:43 -05:00
parent a6128978cb
commit 011490d36d
4 changed files with 150 additions and 84 deletions

View file

@ -12,7 +12,6 @@ from collections import defaultdict
from urllib import quote
from data import model
from data.queue import dockerfile_build_queue
from data.plans import PLANS, get_plan
from app import app
from util.email import (send_confirmation_email, send_recovery_email,
@ -28,9 +27,11 @@ from auth.permissions import (ReadRepositoryPermission,
OrganizationMemberPermission,
ViewTeamPermission,
UserPermission)
from endpoints.common import common_login, get_route_data, truthy_param
from endpoints.common import (common_login, get_route_data, truthy_param,
start_build)
from endpoints.trigger import (BuildTrigger, TriggerActivationException,
TriggerDeactivationException, EmptyRepositoryException)
TriggerDeactivationException,
EmptyRepositoryException)
from util.cache import cache_control
from datetime import datetime, timedelta
@ -1247,28 +1248,10 @@ def request_repo_build(namespace, repository):
# Start the build.
repo = model.get_repository(namespace, repository)
token = model.create_access_token(repo, 'write')
display_name = user_files.get_file_checksum(dockerfile_id)
logger.debug('**********Md5: %s' % display_name)
host = urlparse.urlparse(request.url).netloc
repo_tag_base = '%s/%s/%s' % (host, repo.namespace, repo.name)
job_config = {
'docker_tags': ['latest'],
'build_subdir': '',
'repository': repo_tag_base,
}
build_request = model.create_repository_build(repo, token, job_config,
dockerfile_id, display_name)
dockerfile_build_queue.put(json.dumps({
'build_uuid': build_request.uuid,
'namespace': namespace,
'repository': repository,
}), retries_remaining=1)
log_action('build_dockerfile', namespace,
{'repo': repository, 'namespace': namespace,
'fileid': dockerfile_id}, repo=repo)
build_request = start_build(repo, dockerfile_id, ['latest'], display_name,
'', True)
resp = jsonify(build_status_view(build_request, True))
repo_string = '%s/%s' % (namespace, repository)
@ -1441,8 +1424,8 @@ def activate_build_trigger(namespace, repository, trigger_uuid):
try:
repository_path = '%s/%s' % (trigger.repository.namespace,
trigger.repository.name)
path = url_for('webhooks.build_trigger_webhook', repository=repository_path,
trigger_uuid=trigger.uuid)
path = url_for('webhooks.build_trigger_webhook',
repository=repository_path, trigger_uuid=trigger.uuid)
authed_url = _prepare_webhook_url(app.config['URL_SCHEME'], '$token',
token.code, app.config['URL_HOST'],
path)
@ -1471,6 +1454,44 @@ def activate_build_trigger(namespace, repository, trigger_uuid):
abort(403) # Permission denied
@api.route('/repository/<path:repository>/trigger/<trigger_uuid>/start',
methods=['POST'])
@api_login_required
@parse_repository_name
def manually_start_build_trigger(namespace, repository, trigger_uuid):
permission = AdministerRepositoryPermission(namespace, repository)
if permission.can():
try:
trigger = model.get_build_trigger(namespace, repository, trigger_uuid)
except model.InvalidBuildTriggerException:
abort(404)
return
handler = BuildTrigger.get_trigger_for_service(trigger.service.name)
existing_config_dict = json.loads(trigger.config)
if handler.is_active(existing_config_dict):
abort(400)
return
specs = handler.manual_start(trigger.auth_token,
json.loads(trigger.config))
dockerfile_id, tags, name, subdir = specs
repo = model.get_repository(namespace, repository)
build_request = start_build(repo, dockerfile_id, tags, name, subdir, True)
resp = jsonify(build_status_view(build_request, True))
repo_string = '%s/%s' % (namespace, repository)
resp.headers['Location'] = url_for('api.get_repo_build_status',
repository=repo_string,
build_uuid=build_request.uuid)
resp.status_code = 201
return resp
abort(403) # Permission denied
@api.route('/repository/<path:repository>/trigger/<trigger_uuid>/builds',
methods=['GET'])
@api_login_required