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 scm-commits mailing list