[Pkg-debile-commits] [debile-master] 27/126: nice

Sylvestre Ledru sylvestre at alioth.debian.org
Mon Aug 19 14:56:08 UTC 2013


This is an automated email from the git hooks/post-receive script.

sylvestre pushed a commit to branch scan-build-html
in repository debile-master.

commit a70df70314c17ba7ed2954335b69b3c32f78fc65
Author: Paul Tagliamonte <tag at pault.ag>
Date:   Sun May 26 17:36:18 2013 -0400

    nice
---
 lucy/incoming.py        |    3 ++
 lucy/models/__init__.py |    1 +
 lucy/models/job.py      |    1 +
 lucy/server.py          |  128 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 133 insertions(+)

diff --git a/lucy/incoming.py b/lucy/incoming.py
index c1a057e..cbb9f0a 100644
--- a/lucy/incoming.py
+++ b/lucy/incoming.py
@@ -53,6 +53,9 @@ def accept_source(config, changes):
     path = move_to_pool(config, obj, changes)
     os.unlink(changes.get_filename())
 
+    obj['path'] = path
+    obj.save()
+
     print("ACCEPT: {source}/{version} for {owner} as {_id}".format(**obj))
     add_jobs(obj, 'source', config['job_classes']['source'])
 
diff --git a/lucy/models/__init__.py b/lucy/models/__init__.py
index f9f3dd8..b26733e 100644
--- a/lucy/models/__init__.py
+++ b/lucy/models/__init__.py
@@ -46,6 +46,7 @@ class LucyObject(dict):
     def query(cls, what):
         table = _get_table(cls._type)
         for x in table.find(what):
+            print(x)
             yield cls(**x)
 
     @classmethod
diff --git a/lucy/models/job.py b/lucy/models/job.py
index 769d3dd..cb25ace 100644
--- a/lucy/models/job.py
+++ b/lucy/models/job.py
@@ -29,6 +29,7 @@ class Job(LucyObject):
             builder=builder,
             finished_at=finished_at,
             assigned_at=assigned_at,
+            package_type=package_type,
             **kwargs)
 
     def get_builder(self):
diff --git a/lucy/server.py b/lucy/server.py
new file mode 100644
index 0000000..4a81306
--- /dev/null
+++ b/lucy/server.py
@@ -0,0 +1,128 @@
+from lucy import Machine, Job, Source
+from lucy.core import get_config
+
+from xmlrpc.server import SimpleXMLRPCServer
+from xmlrpc.server import SimpleXMLRPCRequestHandler
+
+from base64 import b64decode
+import datetime as dt
+import socketserver
+import threading
+
+NAMESPACE = threading.local()
+
+
+def get_builder_id():
+    return NAMESPACE.machine['_id']
+
+
+class LucyAuthMixIn(SimpleXMLRPCRequestHandler):
+    def authenticate(self):
+        (basic, _, encoded) = self.headers.get('Authorization').partition(' ')
+        if basic.lower() != 'basic':
+            self.send_error(401, 'Only allowed basic type thing')
+
+        machine, password = b64decode(encoded.encode()).decode().split(":", 1)
+        machine = Machine.load(machine)
+        if machine.auth(password):
+            NAMESPACE.machine = machine
+            return True
+        NAMESPACE.machine = None
+        return False
+
+    def parse_request(self, *args):
+        if super(LucyAuthMixIn, self).parse_request(*args):
+            if self.authenticate():
+                return True
+            else:
+                self.send_error(401, 'Authentication failed')
+        return False
+
+
+class AsyncXMLRPCServer(socketserver.ThreadingMixIn, LucyAuthMixIn):
+    pass
+
+
+class LucyInterface(object):
+    def version(self):
+        return "1.0"
+
+    def identify(self):
+        return get_builder_id()
+
+    def get_next_job(self, job_type):
+        ajobs = list(Job.assigned_jobs(get_builder_id()))
+        if ajobs != []:
+            return dict(ajobs[0])
+
+        try:
+            job = Job.next_job(type=job_type)
+        except KeyError:
+            return None
+
+        job['builder'] = get_builder_id()
+        job['assigned_at'] = dt.datetime.utcnow()
+        job.save()
+        return dict(job)
+
+    def get_dsc_url(self, package):
+        config = get_config()
+        package = Source.load(package)
+        url = "{public}/{path}/{source}_{version}.dsc".format(
+            public=config['public'],
+            path=package['path'],
+            source=package['source'],
+            version=package['version'])
+        return url
+
+    def get_source(self, package):
+        return dict(Source.load(package))
+
+    def submit_report(self, job, report):
+        job = Job.load(job)
+        if job.is_finished():
+            raise ValueError("Job is finished")
+
+        builder = job.get_builder()
+        builder = builder['_id'] if builder else None
+
+        if builder != get_builder_id():
+            raise ValueError("Machine isn't assigned.")
+
+        r = Report(builder=get_builder_id(),
+                   job=job['_id'],
+                   report=report,
+                   package=job['package'])
+        return r.save()
+
+    def close_job(self, job):
+        job = Job.load(job)
+        if job.is_finished():
+            raise ValueError("job is already closed")
+
+        builder = job.get_builder()
+        builder = builder['_id'] if builder else None
+
+        if builder != get_builder_id():
+            raise ValueError("Machine isn't assigned.")
+
+        job['finished_at'] = dt.datetime.utcnow()
+        return job.save()
+
+
+def serve(server, port):
+    print("Serving on `{server}' on port `{port}'".format(**locals()))
+    server = SimpleXMLRPCServer((server, port),
+                                requestHandler=AsyncXMLRPCServer,
+                                allow_none=True)
+    server.register_introspection_functions()
+    server.register_instance(LucyInterface())
+    server.serve_forever()
+
+
+def main():
+    serve("localhost", 20017)
+
+
+if __name__ == "__main__":
+    main()

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-debile/debile-master.git



More information about the Pkg-debile-commits mailing list