extras-buildsys/server BuildMaster.py, 1.27, 1.28 UserInterface.py, 1.41, 1.42

Daniel Williams (dcbw) fedora-extras-commits at redhat.com
Fri Aug 5 16:24:15 UTC 2005


Author: dcbw

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

Modified Files:
	BuildMaster.py UserInterface.py 
Log Message:
2005-08-05  Dan Williams <dcbw at redhat.com>

    * builder/builder.py
        - (_mock_done): hand-wavy attempt to ensure the mock child process
            is always reaped

    * client/client.py
        - (enqueue, enqueue_srpm): Print out returned job UID
        - (detail_job): remove bogus email argument

    * server/BuildMaster.py
        - (create_job_request): new function to consolidate job request creation
        - (enqueue, enqueue_srpm): consolidate to one enqueue() function since
            the database really makes no distinction between CVS and SRPM jobs
        - (_start_new_jobs): return UID to requester when we become aware of it

    * server/UserInterface.py
        - (_wait_for_uid): new function, waits max 3 seconds for the BuildMaster
            to return the new job's UID
        - (enqueue, enqueue_srpm): use create_job_request(), and wait for the
            job's UID to be returned from the BuildMaster, which we then pass
            back to the client
        - (detail_job): remove bogus email argument
        - (_kill_job): warn user if the job is no longer building or waiting to
            be added to the repo.  We can't kill jobs if they are no longer building.

    * www/job.psp
        - detail_job()'s email argument got removed, remove it here to




Index: BuildMaster.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/BuildMaster.py,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- BuildMaster.py	4 Aug 2005 11:38:19 -0000	1.27
+++ BuildMaster.py	5 Aug 2005 16:24:12 -0000	1.28
@@ -206,31 +206,21 @@
         for repo in self.repos.values():
             repo.stop()
 
-    def _job_desc_template(self, email, package, target, buildreq, time):
-        """ Fill in fields common to both SRPM and CVS jobs """
-
-        job_desc = {}
-        job_desc['email'] = email
-        job_desc['package'] = package
-        job_desc['target'] = target
-        job_desc['buildreq'] = buildreq
-        job_desc['time'] = time
-        return job_desc
-
-    def enqueue(self, email, package, cvs_tag, target, buildreq, time):
-        job_desc = self._job_desc_template(email, package, target, buildreq, time)
-        job_desc['cvs_tag'] = cvs_tag
+    def create_job_request(self, email, package, source, target, buildreq, time):
+        req = {}
+        req['email'] = email
+        req['package'] = package
+        req['target'] = target
+        req['buildreq'] = buildreq
+        req['time'] = time
+        req['source'] = source
+        req['uid_avail'] = False
+        req['uid'] = -1
+        return req
 
+    def enqueue(self, req):
         self._new_queue_lock.acquire()
-        self._new_queue.append(job_desc)
-        self._new_queue_lock.release()
-
-    def enqueue_srpm(self, email, package, srpm_path, target, buildreq, time):
-        job_desc = self._job_desc_template(email, package, target, buildreq, time)
-        job_desc['srpm_path'] = srpm_path
-
-        self._new_queue_lock.acquire()
-        self._new_queue.append(job_desc)
+        self._new_queue.append(req)
         self._new_queue_lock.release()
 
     def queue_job_status_update(self, uid, attrdict):
@@ -362,18 +352,10 @@
         self._new_queue_lock.acquire()
 
         for item in self._new_queue:
-            if item.has_key('cvs_tag'):
-                locator = item['cvs_tag']
-            elif item.has_key('srpm_path'):
-                locator = item['srpm_path']
-            else:
-                print "Error: '%s' incorrect job type, needs to either be cvs_tag or srpm_path" % item['package']
-                continue
-
             self.curs.execute('INSERT INTO jobs (uid, username, package,' \
                     ' cvs_tag, target, buildreq, starttime, endtime, status, result)' \
                     ' VALUES (NULL, "%s", "%s", "%s", "%s", "%s", %d, 0, "%s", "")' \
-                    % (item['email'], item['package'], locator, item['target'], \
+                    % (item['email'], item['package'], item['source'], item['target'], \
                     item['buildreq'], item['time'], 'initialize'))
             self.dbcx.commit()
 
@@ -381,7 +363,7 @@
             self.curs.execute('SELECT uid FROM jobs WHERE username="%s" AND' \
                     ' package="%s" AND cvs_tag="%s" AND target="%s" AND' \
                     ' buildreq="%s" AND starttime=%d AND status="initialize"' \
-                    % (item['email'], item['package'], locator, item['target'], \
+                    % (item['email'], item['package'], item['source'], item['target'], \
                     item['buildreq'], item['time']))
             self.dbcx.commit()
 
@@ -391,10 +373,13 @@
             row = data[len(data) - 1]
             repo = self.repos[item['target']]
             job = PackageJob.PackageJob(row['uid'], item['email'], item['package'],
-                    locator, repo, self, self.hostname)
+                    item['source'], repo, self, self.hostname)
 
             print "%s (%s): Starting tag '%s' on target '%s'" % (row['uid'], \
-                    item['package'], locator, item['target'])
+                    item['package'], item['source'], item['target'])
+
+            item['uid'] = row['uid']
+            item['uid_avail'] = True
 
             self._building_jobs_lock.acquire()
             self._building_jobs[row['uid']] = job


Index: UserInterface.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/UserInterface.py,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- UserInterface.py	4 Aug 2005 21:12:42 -0000	1.41
+++ UserInterface.py	5 Aug 2005 16:24:13 -0000	1.42
@@ -117,6 +117,17 @@
         self._builder_manager = builder_manager
         self._bm = build_master
 
+    def _wait_for_uid(self, req):
+        """ Wait a bit to see if the UID comes back to us """
+        starttime = time.time()
+        while req['uid_avail'] == False:
+            time.sleep(0.2)
+            # Wait at most 3 seconds for the uid to come back
+            if time.time() > starttime + 3:
+                break
+
+        uid = int(req['uid'])
+        return uid
 
     def enqueue(self, email, package, cvs_tag, target, buildreq=None):
         """ Accept a job to build and stuff it into the job database """
@@ -144,8 +155,10 @@
             return (-1, "This build server does not support the target %s." % target)
         else:
             print "Request to enqueue '%s' tag '%s' for target '%s' (user '%s')" % (package, cvs_tag, real_target, email)
-            self._bm.enqueue(email, package, cvs_tag, real_target, buildreq, time.time())
-            return (0, "Success: package has been queued.")
+            req = self._bm.create_job_request(email, package, cvs_tag, real_target, buildreq, time.time())
+            self._bm.enqueue(req)
+            uid = self._wait_for_uid(req)
+            return (0, "Success: package has been queued.", uid)
 
     def enqueue_srpm(self, email, package, srpm_file, target, buildreq=None):
         """ Accept a job to build from SRPM file and stuff it into the job database """
@@ -180,8 +193,10 @@
             return (-1, "This build server does not support the target %s." % target)
         else:
             print "Request to enqueue '%s' file '%s' for target '%s' (user '%s')" % (package, srpm_file, real_target, email)
-            self._bm.enqueue_srpm(email, package, srpm_file, real_target, buildreq, time.time())
-            return (0, "Success: package has been queued.")
+            req = self._bm.create_job_request(email, package, srpm_file, real_target, buildreq, time.time())
+            self._bm.enqueue(req)
+            uid = self._wait_for_uid(req)
+            return (0, "Success: package has been queued.", uid)
 
     def requeue(self, uid):
         uid = validate_uid(uid)
@@ -540,8 +555,12 @@
             return (-1, "Insufficient privileges.")
         jobid = int(jobid)
         job = self._bm.get_job(jobid)
-        if job and not user.job_admin and user.email != job.username:
-            return (-1, "Insufficient privileges.")
+        if job:
+            # Only the job owner and job_admins can kill jobs
+            if user.email != job.username and not user.job_admin:
+                return (-1, "Insufficient privileges.")
+        else:
+            return (-1, "Job %s is not currently building and therefore cannot be killed." % jobid)
         return self._kill_job(user.email, job, jobid)
 
 
@@ -550,7 +569,7 @@
         return UserInterface.list_jobs(self, args_dict)
 
 
-    def detail_job(self, email, jobid):
+    def detail_job(self, jobid):
         user = AuthedXMLRPCServer.get_authinfo()
         return UserInterface.detail_job(self, jobid)
 




More information about the fedora-extras-commits mailing list