]> git.ipfire.org Git - pbs.git/commitdiff
hub: Allow to get a job without long-polling
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 14 Nov 2017 23:33:53 +0000 (23:33 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 14 Nov 2017 23:33:53 +0000 (23:33 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/hub/__init__.py
src/hub/handlers.py

index 20bef7ffa5600fe6977239dcfd0d01cf997bbb68..360349d0c113406a0b10707fd05ec17b0f2411b5 100644 (file)
@@ -38,6 +38,7 @@ class Application(tornado.web.Application):
 
                        # Builders
                        (r"/builders/info", handlers.BuildersInfoHandler),
+                       (r"/builders/jobs/get", handlers.BuildersGetNextJobHandler),
                        (r"/builders/jobs/queue", handlers.BuildersJobsQueueHandler),
                        (r"/builders/jobs/(.*)/addfile/(.*)", handlers.BuildersJobsAddFileHandler),
                        (r"/builders/jobs/(.*)/buildroot", handlers.BuildersJobsBuildrootHandler),
index aa4802c25ce3fb7e6fa500325d745ae6f9bd9cfb..ce79ffb09f9ccb46836e87d21e3983ce50b7f6a6 100644 (file)
@@ -534,6 +534,48 @@ class BuildersKeepaliveHandler(BuildersBaseHandler):
                self.finish("OK")
 
 
+class BuildersGetNextJobHandler(BuildersBaseHandler):
+       @tornado.web.authenticated
+       def get(self):
+               # XXX Set keepalive
+
+               # If the builder is disabled, we don't need to do anything
+               # but will ask it to return after 5 min
+               if not self.builder.enabled:
+                       self.set_header("Retry-After", "300")
+                       return
+
+               # If the builder has too many jobs running,
+               # we will tell it to return after 1 min
+               if self.builder.too_many_jobs:
+                       self.set_header("Retry-After", "60")
+                       return
+
+               # Okay, we are ready for the next job
+               job = self.builder.get_next_job()
+
+               # If we got no job, we will ask the builder
+               # to return after 30 seconds
+               if not job:
+                       self.set_header("Retry-After", "30")
+                       return
+
+               # If we got a job, we will serialise it
+               # and send it to the builder
+               with self.db.transaction():
+                       job.start(builder=self.builder)
+
+                       ret = {
+                               "id"                 : job.uuid,
+                               "arch"               : job.arch,
+                               "source_url"         : job.build.source_download,
+                               "source_hash_sha512" : job.build.source_hash_sha512,
+                               "type"               : "test" if job.test else "release",
+                               "config"             : job.get_config(),
+                       }
+                       self.finish(ret)
+
+
 class BuildersJobsQueueHandler(BuildersBaseHandler):
        @tornado.web.asynchronous
        @tornado.web.authenticated