diff options
author | Magnus Hagander | 2018-06-19 12:17:12 +0000 |
---|---|---|
committer | Magnus Hagander | 2018-06-19 12:17:57 +0000 |
commit | 3d9bc13b06c2d11431f288d7d66bca67cfe2f718 (patch) | |
tree | 77d44ccae2e3ddd402ac09f8ebfe903c4da23436 /pgcommitfest/commitfest/api.py | |
parent | 02eaccccf8ddd502bc514e7ce272196c45b5aeb9 (diff) |
First stab at tracking build results
Diffstat (limited to 'pgcommitfest/commitfest/api.py')
-rw-r--r-- | pgcommitfest/commitfest/api.py | 63 |
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) |