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