extras-buildsys/builder builder.py,1.32,1.33
Daniel Williams (dcbw)
fedora-extras-commits at redhat.com
Mon Aug 29 17:48:15 UTC 2005
Author: dcbw
Update of /cvs/fedora/extras-buildsys/builder
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv4707/builder
Modified Files:
builder.py
Log Message:
2005-08-29 Dan Williams <dcbw at redhat.com>
* Make more stuff actually work
Index: builder.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/builder/builder.py,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- builder.py 25 Aug 2005 18:15:13 -0000 1.32
+++ builder.py 29 Aug 2005 17:48:13 -0000 1.33
@@ -77,9 +77,10 @@
"""puts things together for an arch - baseclass for handling builds for
other arches"""
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
+ self._controller = controller
self.buildarch = buildarch
- self._started = time.time()
+ self._starttime = time.time()
self._uniqid = uniqid
self._status = 'init'
self._die = False
@@ -114,7 +115,7 @@
Target: %s
UID: %s
Architecture: %s
- SRPM: %s\n\n""" % (time.asctime(time.gmtime()), target_str, self._uniqid, self.buildarch, srpm_url))
+ SRPM: %s\n\n""" % (time.asctime(time.localtime(self._starttime)), target_str, self._uniqid, self.buildarch, srpm_url))
try:
srpm_filename = FileDownloader.get_base_filename_from_url(srpm_url, ['.src.rpm'])
@@ -127,6 +128,9 @@
self._srpm_path = os.path.join(work_dir, self._uniqid, "source", srpm_filename)
threading.Thread.__init__(self)
+ def starttime(self):
+ return self._starttime
+
def die(self, sig=15):
if self.is_done_status() or self._done_status == 'killed':
return
@@ -137,7 +141,7 @@
# Don't try to kill a running cleanup process
if self._status != 'cleanup' and self._pobj and self._pobj.pid:
try:
- os.kill(self._pobj.pid, sig)
+ os.kill(self._pobj.pid, 15)
except OSError, e:
self.log("Couldn't kill process %d: %s\n" % (self._pobj.pid, e))
@@ -186,7 +190,8 @@
os.makedirs(self._result_dir)
mock_args = "-r %s --arch %s --resultdir=%s --statedir=%s --uniqueext=%s %s" % (self.buildroot,
self.buildarch, self._result_dir, self._state_dir, self._uniqid, self._srpm_path)
- cmd = '%s %s %s' % (self.arch_command, config_opts['builder_cmd'], mock_args)
+ builder_cmd = self._builder_cfg.get_str("General", "builder_cmd")
+ cmd = '%s %s %s' % (self.arch_command, builder_cmd, mock_args)
self.log(" %s\n" % cmd)
self._pobj = popen2.Popen4(cmd=cmd, bufsize=1024)
fcntl.fcntl(self._pobj.fromchild.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
@@ -223,9 +228,9 @@
def _start_cleanup(self):
self.log("Cleaning up the buildroot...\n")
+ builder_cmd = self._builder_cfg.get_str("General", "builder_cmd")
cmd = '%s %s clean --uniqueext=%s -r %s' % (self.arch_command,
- config_opts['builder_cmd'], self._uniqid,
- self.buildroot)
+ builder_cmd, self._uniqid, self.buildroot)
self.log(" %s\n" % cmd)
self._pobj = popen2.Popen4(cmd=cmd)
self._status = 'cleanup'
@@ -414,13 +419,16 @@
time.sleep(3)
+ print "Done with job loop: %s" % self._status
+ self._controller.notify_job_done(self)
+
def _find_files(self):
# Grab the list of files in our job's result dir and URL encode them
files_in_dir = os.listdir(self._result_dir)
file_list = []
self.log("\n\nOutput File List:\n-----------------\n")
for f in files_in_dir:
- file_url = get_url_for_file(os.path.join(self._result_dir, f))
+ file_url = get_url_for_file(self._builder_cfg, os.path.join(self._result_dir, f))
if file_url:
file_list.append(file_url)
self.log(" Output File: %s\n" % urllib.unquote(file_url))
@@ -449,34 +457,34 @@
class InvalidTargetError(exceptions.Exception): pass
class i386Arch(BuilderMock):
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
self.arch_command = '/usr/bin/setarch i686'
- BuilderMock.__init__(self, uniqid, target_cfg, buildarch, srpm_url)
+ BuilderMock.__init__(self, controller, uniqid, target_cfg, buildarch, srpm_url)
class x86_64Arch(BuilderMock):
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
self.arch_command = ''
- BuilderMock.__init__(self, uniqid, target_cfg, buildarch, srpm_url)
+ BuilderMock.__init__(self, controller, uniqid, target_cfg, buildarch, srpm_url)
class PPCArch(BuilderMock):
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
self.arch_command = '/usr/bin/setarch ppc32'
- BuilderMock.__init__(self, uniqid, target_cfg, buildarch, srpm_url)
+ BuilderMock.__init__(self, controller, uniqid, target_cfg, buildarch, srpm_url)
class PPC64Arch(BuilderMock):
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
self.arch_command = ''
- BuilderMock.__init__(self, uniqid, target_cfg, buildarch, srpm_url)
+ BuilderMock.__init__(self, controller, uniqid, target_cfg, buildarch, srpm_url)
class SparcArch(BuilderMock):
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
self.arch_command = '/usr/bin/sparc32'
- BuilderMock.__init__(self, uniqid, target_cfg, buildarch, srpm_url)
+ BuilderMock.__init__(self, controller, uniqid, target_cfg, buildarch, srpm_url)
class Sparc64Arch(BuilderMock):
- def __init__(self, uniqid, target_cfg, buildarch, srpm_url):
+ def __init__(self, controller, uniqid, target_cfg, buildarch, srpm_url):
self.arch_command = '/usr/bin/sparc64'
- BuilderMock.__init__(self, uniqid, target_cfg, buildarch, srpm_url)
+ BuilderMock.__init__(self, controller, uniqid, target_cfg, buildarch, srpm_url)
# Keep this global scope, used in __main__
builder_dict = {'i386': i386Arch,
@@ -496,22 +504,12 @@
'sparc64': Sparc64Arch
}
-def get_arch_builder_instance(uniqid, target_cfg, buildarch, srpm_url):
- """hand it an arch it hands you back the builder instance you need"""
-
- if buildarch != 'noarch' and not builder_dict.has_key(buildarch):
- return None
-
- builder = None
- if buildarch == 'noarch':
- builder = builder_dict[target_cfg.arches()[0]]
- else:
- if buildarch in target_cfg.arches():
- builder = builder_dict[buildarch]
-
- if builder:
- return builder(uniqid, target_cfg, buildarch, srpm_url)
- return None
+def check_job_type(obj):
+ """ Verify that an object is of the same type as one of our builder objects """
+ for item in builder_dict.values():
+ if type(obj) == type(item):
+ return True
+ return False
class XMLRPCBuilderServer:
@@ -555,6 +553,23 @@
return target_cfg
+ def _get_arch_builder_instance(self, uniqid, target_cfg, buildarch, srpm_url):
+ """hand it an arch it hands you back the builder instance you need"""
+
+ if buildarch != 'noarch' and not builder_dict.has_key(buildarch):
+ return None
+
+ builder = None
+ if buildarch == 'noarch':
+ builder = builder_dict[target_cfg.arches()[0]]
+ else:
+ if buildarch in target_cfg.arches():
+ builder = builder_dict[buildarch]
+
+ if builder:
+ return builder(self, uniqid, target_cfg, buildarch, srpm_url)
+ return None
+
def start_new_job(self, target_dict, srpm_url):
target_str = "%s-%s-%s-%s" % (target_dict['distro'], target_dict['target'], target_dict['arch'], target_dict['repo'])
@@ -573,7 +588,7 @@
return 0
uniqid = self._generate_uniqid(target_str, srpm_url)
- job = get_arch_builder_instance(uniqid, target_cfg, target_dict['arch'], srpm_url)
+ job = self._get_arch_builder_instance(uniqid, target_cfg, target_dict['arch'], srpm_url)
if job != None:
self._all_jobs[uniqid] = job
self._building_jobs_lock.acquire()
@@ -582,14 +597,25 @@
job.start()
filename = os.path.basename(srpm_url)
self.log("%s: started %s on %s arch %s at time %d" % (uniqid, filename,
- target, arch, cur_time))
+ target_str, target_dict['arch'], job.starttime()))
else:
- self.log("%s: Failed request for %s on %s UNSUPPORTED arch %s at time %d" %
+ self.log("%s: Failed request for %s on %s UNSUPPORTED arch %s" %
(uniqid, srpm_url, target_str, target_dict['arch'], cur_time))
uniqid = 0
return uniqid
+ def notify_job_done(self, archjob):
+ if check_job_type(archjob):
+ self._building_jobs_lock.acquire()
+ if archjob in self._building_jobs:
+ self._building_jobs.remove(archjob)
+ else:
+ print "Job not in building list!"
+ self._building_jobs_lock.release()
+ else:
+ print "bad job type!"
+
def die(self, uniqid):
try:
job = self._all_jobs[uniqid]
@@ -611,14 +637,18 @@
job.repo_unlocked()
except KeyError:
pass
-
+ return 0
+
def building_jobs(self):
jobs = {}
self._building_jobs_lock.acquire()
+ building = 0
for job in self._building_jobs:
- jobs[job.uniqid()] = jobs.status()
+ jobs[job.uniqid()] = job.status()
+ building = building + 1
+ free = self._max_jobs - building
self._building_jobs_lock.release()
- return jobs
+ return (jobs, free)
def job_status(self, uniqid):
try:
@@ -628,13 +658,6 @@
pass
return ''
- def free_slots(self):
- free = 0
- self._building_jobs_lock.acquire()
- free = self._max_jobs - len(self._building_jobs)
- self._building_jobs_lock.release()
- return free
-
def supported_targets(self):
targets = []
for t in self._cfg.targets():
@@ -843,15 +866,19 @@
xmlserver.handle_request()
except KeyboardInterrupt, e:
print "Shutting down..."
- building_jobs = bcs.building_jobs()
+ (building_jobs, free) = bcs.building_jobs()
for jobid in building_jobs.keys():
bcs.die(jobid)
# wait for the jobs to clean up before quitting
while True:
- building_jobs = bcs.building_jobs()
- if len(building_jobs) == 0:
+ (building_jobs, free) = bcs.building_jobs()
+ if len(building_jobs.keys()) == 0:
+ break
+ try:
+ print "Waiting for building jobs to stop"
+ time.sleep(1)
+ except KeyboardInterrupt:
break
- time.sleep(1)
http_server.stop()
os._exit(0)
More information about the fedora-extras-commits
mailing list