diff options
-rw-r--r-- | bitbake/lib/toaster/toastergui/api.py | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/toastergui/api.py index 1b1f59813f..42901f750a 100644 --- a/bitbake/lib/toaster/toastergui/api.py +++ b/bitbake/lib/toaster/toastergui/api.py | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | # Temporary home for the UI's misc API | 20 | # Temporary home for the UI's misc API |
21 | 21 | ||
22 | from orm.models import Project, ProjectTarget | 22 | from orm.models import Project, ProjectTarget, Build |
23 | from bldcontrol.models import BuildRequest | 23 | from bldcontrol.models import BuildRequest |
24 | from bldcontrol import bbcontroller | 24 | from bldcontrol import bbcontroller |
25 | from django.http import HttpResponse, JsonResponse | 25 | from django.http import HttpResponse, JsonResponse |
@@ -32,18 +32,54 @@ class XhrBuildRequest(View): | |||
32 | return HttpResponse() | 32 | return HttpResponse() |
33 | 33 | ||
34 | def post(self, request, *args, **kwargs): | 34 | def post(self, request, *args, **kwargs): |
35 | """ Process HTTP POSTs which make build requests """ | 35 | """ |
36 | Build control | ||
37 | |||
38 | Entry point: /xhr_buildrequest/<project_id> | ||
39 | Method: POST | ||
40 | |||
41 | Args: | ||
42 | id: id of build to change | ||
43 | buildCancel = build_request_id ... | ||
44 | buildDelete = id ... | ||
45 | targets = recipe_name ... | ||
46 | |||
47 | Returns: | ||
48 | {"error": "ok"} | ||
49 | or | ||
50 | {"error": <error message>} | ||
51 | """ | ||
36 | 52 | ||
37 | project = Project.objects.get(pk=kwargs['pid']) | 53 | project = Project.objects.get(pk=kwargs['pid']) |
38 | 54 | ||
39 | if 'buildCancel' in request.POST: | 55 | if 'buildCancel' in request.POST: |
40 | for i in request.POST['buildCancel'].strip().split(" "): | 56 | for i in request.POST['buildCancel'].strip().split(" "): |
41 | try: | 57 | try: |
42 | br = BuildRequest.objects.select_for_update().get(project = project, pk = i, state__lte = BuildRequest.REQ_QUEUED) | 58 | br = BuildRequest.objects.get(project=project, pk=i) |
43 | br.state = BuildRequest.REQ_DELETED | 59 | |
60 | try: | ||
61 | bbctrl = bbcontroller.BitbakeController(br.environment) | ||
62 | bbctrl.forceShutDown() | ||
63 | except: | ||
64 | # We catch a bunch of exceptions here because | ||
65 | # this is where the server has not had time to start up | ||
66 | # and the build request or build is in transit between | ||
67 | # processes. | ||
68 | # We can safely just set the build as cancelled | ||
69 | # already as it never got started | ||
70 | build = br.build | ||
71 | build.outcome = Build.CANCELLED | ||
72 | build.save() | ||
73 | |||
74 | # We now hand over to the buildinfohelper to update the | ||
75 | # build state once we've finished cancelling | ||
76 | br.state = BuildRequest.REQ_CANCELLING | ||
44 | br.save() | 77 | br.save() |
78 | |||
45 | except BuildRequest.DoesNotExist: | 79 | except BuildRequest.DoesNotExist: |
46 | pass | 80 | return JsonResponse({'error':'No such build id %s' % i}) |
81 | |||
82 | return JsonResponse({'error': 'ok'}) | ||
47 | 83 | ||
48 | if 'buildDelete' in request.POST: | 84 | if 'buildDelete' in request.POST: |
49 | for i in request.POST['buildDelete'].strip().split(" "): | 85 | for i in request.POST['buildDelete'].strip().split(" "): |
@@ -51,6 +87,7 @@ class XhrBuildRequest(View): | |||
51 | BuildRequest.objects.select_for_update().get(project = project, pk = i, state__lte = BuildRequest.REQ_DELETED).delete() | 87 | BuildRequest.objects.select_for_update().get(project = project, pk = i, state__lte = BuildRequest.REQ_DELETED).delete() |
52 | except BuildRequest.DoesNotExist: | 88 | except BuildRequest.DoesNotExist: |
53 | pass | 89 | pass |
90 | return JsonResponse({'error': 'ok' }) | ||
54 | 91 | ||
55 | if 'targets' in request.POST: | 92 | if 'targets' in request.POST: |
56 | ProjectTarget.objects.filter(project = project).delete() | 93 | ProjectTarget.objects.filter(project = project).delete() |
@@ -66,9 +103,8 @@ class XhrBuildRequest(View): | |||
66 | task = task) | 103 | task = task) |
67 | project.schedule_build() | 104 | project.schedule_build() |
68 | 105 | ||
69 | # redirect back to builds page so any new builds in progress etc. | 106 | return JsonResponse({'error': 'ok' }) |
70 | # are visible | 107 | |
71 | response = HttpResponse() | 108 | response = HttpResponse() |
72 | response.status_code = 302 | 109 | response.status_code = 500 |
73 | response['Location'] = request.build_absolute_uri() | ||
74 | return response | 110 | return response |