[bitbake-devel] [PATCH 1/6] toaster: api / project Cancel any in progress builds before project delete

bavery brian.avery at intel.com
Thu Oct 6 00:08:49 UTC 2016


From: Michael Wood <michael.g.wood at intel.com>

Before we finally delete any project make sure we send the cancel command to
any in-progress builds. This ensures that an inaccessible build doesn't block
up the system and that we don't get errors after deletion.

[YOCTO #10289]

Signed-off-by: Michael Wood <michael.g.wood at intel.com>
Signed-off-by: bavery <brian.avery at intel.com>
---
 lib/toaster/toastergui/api.py                 | 55 +++++++++++++++++----------
 lib/toaster/toastergui/templates/project.html | 12 +++---
 2 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/lib/toaster/toastergui/api.py b/lib/toaster/toastergui/api.py
index 3a05d66..b01d4ba 100644
--- a/lib/toaster/toastergui/api.py
+++ b/lib/toaster/toastergui/api.py
@@ -49,6 +49,28 @@ class XhrBuildRequest(View):
     def get(self, request, *args, **kwargs):
         return HttpResponse()
 
+    @staticmethod
+    def cancel_build(br):
+        """Cancel a build request"""
+        try:
+            bbctrl = bbcontroller.BitbakeController(br.environment)
+            bbctrl.forceShutDown()
+        except:
+            # We catch a bunch of exceptions here because
+            # this is where the server has not had time to start up
+            # and the build request or build is in transit between
+            # processes.
+            # We can safely just set the build as cancelled
+            # already as it never got started
+            build = br.build
+            build.outcome = Build.CANCELLED
+            build.save()
+
+        # We now hand over to the buildinfohelper to update the
+        # build state once we've finished cancelling
+        br.state = BuildRequest.REQ_CANCELLING
+        br.save()
+
     def post(self, request, *args, **kwargs):
         """
           Build control
@@ -74,26 +96,7 @@ class XhrBuildRequest(View):
             for i in request.POST['buildCancel'].strip().split(" "):
                 try:
                     br = BuildRequest.objects.get(project=project, pk=i)
-
-                    try:
-                        bbctrl = bbcontroller.BitbakeController(br.environment)
-                        bbctrl.forceShutDown()
-                    except:
-                        # We catch a bunch of exceptions here because
-                        # this is where the server has not had time to start up
-                        # and the build request or build is in transit between
-                        # processes.
-                        # We can safely just set the build as cancelled
-                        # already as it never got started
-                        build = br.build
-                        build.outcome = Build.CANCELLED
-                        build.save()
-
-                    # We now hand over to the buildinfohelper to update the
-                    # build state once we've finished cancelling
-                    br.state = BuildRequest.REQ_CANCELLING
-                    br.save()
-
+                    self.cancel_build(br)
                 except BuildRequest.DoesNotExist:
                     return error_response('No such build request id %s' % i)
 
@@ -823,11 +826,21 @@ class XhrProject(View):
         return HttpResponse()
 
     def delete(self, request, *args, **kwargs):
+        """Delete a project. Cancels any builds in progress"""
         try:
-            Project.objects.get(pk=kwargs['project_id']).delete()
+            project = Project.objects.get(pk=kwargs['project_id'])
+            # Cancel any builds in progress
+            for br in BuildRequest.objects.filter(
+                    project=project,
+                    state=BuildRequest.REQ_INPROGRESS):
+                XhrBuildRequest.cancel_build(br)
+
+            project.delete()
+
         except Project.DoesNotExist:
             return error_response("Project %s does not exist" %
                                   kwargs['project_id'])
+
         return JsonResponse({
             "error": "ok",
             "gotoUrl": reverse("all-projects", args=[])
diff --git a/lib/toaster/toastergui/templates/project.html b/lib/toaster/toastergui/templates/project.html
index 7644dad..5abe241 100644
--- a/lib/toaster/toastergui/templates/project.html
+++ b/lib/toaster/toastergui/templates/project.html
@@ -31,12 +31,14 @@
         <h4>Are you sure you want to delete this project?</h4>
       </div>
       <div class="modal-body">
-        <p>Deleting the <strong class="project-name"></strong> project will remove forever:</p>
+        <p>Deleting the <strong class="project-name"></strong> project
+        will:</p>
         <ul>
-          <li>Its configuration information</li>
-          <li>Its imported layers</li>
-          <li>Its custom images</li>
-          <li>All its build information</li>
+          <li>Cancel its builds currently in progress</li>
+          <li>Remove its configuration information</li>
+          <li>Remove its imported layers</li>
+          <li>Remove its custom images</li>
+          <li>Remove all its build information</li>
         </ul>
       </div>
       <div class="modal-footer">
-- 
1.9.1




More information about the bitbake-devel mailing list