extras-buildsys/server BuildJob.py, 1.10, 1.11 BuildMaster.py, 1.8, 1.9 UserInterface.py, 1.11, 1.12

Daniel Williams (dcbw) fedora-extras-commits at redhat.com
Wed Jun 29 05:23:03 UTC 2005


Author: dcbw

Update of /cvs/fedora/extras-buildsys/server
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv28014/server

Modified Files:
	BuildJob.py BuildMaster.py UserInterface.py 
Log Message:
2005-06-29  Dan Williams <dcbw at redhat.com>

    * Implement job kill functionality




Index: BuildJob.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/BuildJob.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- BuildJob.py	26 Jun 2005 14:52:30 -0000	1.10
+++ BuildJob.py	29 Jun 2005 05:23:00 -0000	1.11
@@ -350,30 +350,44 @@
         if not self.no_cvs:
             shutil.rmtree(self.checkout_tmpdir, ignore_errors=True)
 
+    def is_done(self):
+        if self.curstage == 'needsign' or self.curstage == 'failed' or self.curstage == 'killed':
+            return True
+        return False
+
+    def die(self, username):
+        # Kill any building jobs
+        for job in self.sub_jobs.values():
+            job.die()
+        self.sub_jobs = {}
+        self.curstage = 'killed'
+        resultstring = "%s (%s): Build on target %s was killed by %s." % (self.uid, self.name, self.target, username)
+        self.email_result(resultstring)
+        self.bm.notify_job_done(self)
+
     def run(self):
-        while self.curstage != 'needsign' and self.curstage != 'failed':
+        while not self.is_done():
             # Advance to next stage based on current stage
             do_sleep = False
-            oldstage = self.curstage
-            if oldstage == 'initialize':
+            if self.curstage == 'initialize':
                 self._checkout()
-            elif oldstage == 'checkout':
+            elif self.curstage == 'checkout':
                 self._make_srpm()
-            elif oldstage == 'make_srpm':
+            elif self.curstage == 'make_srpm':
                 self._prep()
-            elif oldstage == 'prep' or oldstage == 'building':
+            elif self.curstage == 'prep' or self.curstage == 'building':
                 self._monitor()
                 do_sleep = True
-            elif oldstage == 'finished':
+            elif self.curstage == 'finished':
                 self._cleanup()
-            elif oldstage == 'cleanup':
+            elif self.curstage == 'cleanup':
                 if self.failed:
                     self._failed()
                 else:
                     self._add_to_repo()
-            elif oldstage == 'addtorepo':
+            elif self.curstage == 'addtorepo':
                 do_sleep = True
-            elif oldstage == 'repodone':
+            elif self.curstage == 'repodone':
                 self._succeeded()
 
             # Only some stages need to sleep because we stay in


Index: BuildMaster.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/BuildMaster.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- BuildMaster.py	26 Jun 2005 14:52:30 -0000	1.8
+++ BuildMaster.py	29 Jun 2005 05:23:00 -0000	1.9
@@ -72,7 +72,6 @@
     def __init__(self, hostname, client_manager):
         self.bcm = client_manager
         self.hostname = hostname
-        self.building_jobs = []
         self.should_stop = False
         self.repos = {}
         for target in config_opts['targets'].keys():
@@ -90,6 +89,9 @@
         self._query_queue = []
         self._query_queue_lock = threading.Lock()
 
+        self._building_jobs = []
+        self._building_jobs_lock = threading.Lock()
+
         try:
             self.dbcx = sqlite.connect(CONFIG_LOCATION + "jobdb", encoding="utf-8", timeout=3)
         except sqlite.DatabaseError, e:
@@ -155,7 +157,9 @@
             curstage = job.get_cur_stage()
             self._write_status_to_db(job.get_uid(), curstage)
             print "%s (%s): Job finished." % (job.get_uid(), job.package)
-            self.building_jobs.remove(job)
+            self._building_jobs_lock.acquire()
+            self._building_jobs.remove(job)
+            self._building_jobs_lock.release()
 
         self._done_queue = []
         self._done_queue_lock.release()
@@ -220,7 +224,9 @@
             print "%s (%s): Starting tag '%s' on target '%s'" % (row['uid'], \
                     item['package'], locator, item['target'])
 
-            self.building_jobs.append(job)
+            self._building_jobs_lock.acquire()
+            self._building_jobs.append(job)
+            self._building_jobs_lock.release()
             job.start()
 
         self._new_queue = []
@@ -274,6 +280,16 @@
 
         return False
 
+    def get_job(self, jobid):
+        self._building_jobs_lock.acquire()
+        ret_job = None
+        for job in self._building_jobs:
+            if job.uid == jobid:
+                ret_job = job
+                break
+        self._building_jobs_lock.release()
+        return ret_job
+
     def run(self):
         while self.should_stop == False:
             # Write update status for jobs to the database


Index: UserInterface.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/UserInterface.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- UserInterface.py	26 Jun 2005 15:17:41 -0000	1.11
+++ UserInterface.py	29 Jun 2005 05:23:00 -0000	1.12
@@ -105,6 +105,13 @@
             self._bm.enqueue_srpm(email, package, srpm_file, target, buildreq, time.time())
         return (0, "Success: package has been queued.")
 
+    def _kill_job(self, email, job, jobid):
+        if not job:
+            return (-1, "Job %s does not exist." % jobid)
+        if job.is_done():
+            return (-1, "Job %s is already finished." % job.get_uid())
+        job.die(email)
+        return (0, "Success: job %s killed." % job.get_uid())
 
     def list_jobs(self, args_dict):
         sql = 'SELECT uid, username, package, cvs_tag, target, status FROM jobs'
@@ -167,6 +174,18 @@
         return UserInterface.enqueue_srpm(self, user.email, package, srpm_file, target, buildreq)
 
 
+    def kill_job(self, user, email, jobid):
+        if not user.own_jobs:
+            return (-1, "Insufficient privileges.")
+        if user.email != email:
+            return (-1, "Insufficient privileges.")
+        jobid = int(jobid)
+        job = self._bm.get_job(jobid)
+        if job and not user.kill_any_job and user.email != job.username:
+            return (-1, "Insufficient privileges.")
+        return self._kill_job(user.email, job, jobid)
+
+
     def list_jobs(self, user, args_dict):
         return UserInterface.list_jobs(self, args_dict)
 
@@ -187,3 +206,9 @@
     Allow all operations, NULL authentication
     """
 
+    def kill_job(self, email, jobid):
+        jobid = int(jobid)
+        job = self._bm.get_job(jobid)
+        return self._kill_job(self, email, job, jobid)
+
+




More information about the fedora-extras-commits mailing list