summaryrefslogtreecommitdiff
path: root/pgcommitfest/commitfest/api.py
diff options
context:
space:
mode:
authorMagnus Hagander2018-06-19 12:17:12 +0000
committerMagnus Hagander2018-06-19 12:17:57 +0000
commit3d9bc13b06c2d11431f288d7d66bca67cfe2f718 (patch)
tree77d44ccae2e3ddd402ac09f8ebfe903c4da23436 /pgcommitfest/commitfest/api.py
parent02eaccccf8ddd502bc514e7ce272196c45b5aeb9 (diff)
First stab at tracking build results
Diffstat (limited to 'pgcommitfest/commitfest/api.py')
-rw-r--r--pgcommitfest/commitfest/api.py63
1 files changed, 62 insertions, 1 deletions
diff --git a/pgcommitfest/commitfest/api.py b/pgcommitfest/commitfest/api.py
index 1c97ef1..fec46ea 100644
--- a/pgcommitfest/commitfest/api.py
+++ b/pgcommitfest/commitfest/api.py
@@ -6,9 +6,10 @@ from functools import wraps
from django.utils.decorators import available_attrs
from django.db import connection
+import datetime
import json
-from models import CommitFest
+from models import CommitFest, Patch, PatchBuildStatus, BuildProvider
def api_authenticate(view_func):
def _wrapped_view(request, *args, **kwargs):
@@ -74,3 +75,63 @@ GROUP BY p.id, poc.id""".format(wherestring), params)
}
return HttpResponse(json.dumps(res),
content_type='application/json')
+
+
+@csrf_exempt
+@api_authenticate
+def build_result(request, cfid, patchid):
+ if request.method != 'POST':
+ return HttpResponse('Invalid method', status=405)
+ if request.META['CONTENT_TYPE'] != 'application/json':
+ return HttpResponse("Only JSON accepted", status=415)
+ try:
+ obj = json.loads(request.body)
+ except ValueError:
+ return HttpResponse("Invalid data format", status=415)
+
+ commitfest = get_object_or_404(CommitFest, pk=cfid)
+ patch = get_object_or_404(Patch, pk=patchid)
+
+ # Mandatory fields
+ try:
+ provider = BuildProvider.objects.get(urlname=obj['provider'])
+ messageid = obj['messageid']
+ status = obj['status']
+ statustime = obj['timestamp']
+ except BuildProvider.DoesNotExist:
+ return HttpResponse("Invalid build provider", status=422)
+ except KeyError, e:
+ return HttpResponse("Mandatory parameter {0} missing".format(e.args[0]), status=400)
+
+ if not status in PatchBuildStatus._STATUS_MAP:
+ return HttpResponse("Invalid build status {0}".format(status), status=422)
+ try:
+ statustime = datetime.datetime.strptime(statustime, '%Y-%m-%dT%H:%M:%S.%fZ')
+ except ValueError:
+ return HttpResponse("Invalid timestamp {0}".format(statustime), status=422)
+
+ # Optional parameters
+ url = obj.get('url', '')
+ commitid = obj.get('commit', '')
+
+ (buildstatus, created) = PatchBuildStatus.objects.get_or_create(commitfest=commitfest,
+ patch=patch,
+ buildprovider=provider,
+ status_timestamp=statustime,
+ defaults={
+ 'buildmessageid': messageid,
+ 'buildstatus': PatchBuildStatus._STATUS_MAP[status],
+ 'status_url': url,
+ 'master_commit_id': commitid,
+ },
+ )
+ if not created:
+ if buildstatus.buildmessageid == messageid and \
+ buildstatus.buildstatus == PatchBuildStatus._STATUS_MAP[status] and \
+ buildstatus.status_url == url and \
+ buildstatus.master_commit_id == commitid:
+ return HttpResponse("Build status already stored", status=200)
+ return HttpResponse("Conflicting build status already stored", status=409)
+
+ # That's it!
+ return HttpResponse("Stored", status=201)