source: trunk/packages/invirt-dev/invirt-submit-build

Last change on this file was 3036, checked in by gdb, 14 years ago

Added reporting

  • Property svn:executable set to *
File size: 2.2 KB
Line 
1#!/usr/bin/python
2
3"""Validate and add a new item to the Invirt build queue.
4
5This script, intended to be invoked by remctl, first validates the
6build submitted parameters, and then adds a new item to the
7Invirtibuilder build queue, triggering the Invirtibuilder to start the
8build.
9
10The expected arguments are
11
12  pocket package commit
13
14This script will also automatically extract the Kerberos principal
15used to submit the job, and include that in the queue file for records
16keeping.
17"""
18
19
20import datetime
21import optparse
22import os
23import sys
24import tempfile
25import uuid
26
27import invirt.builder as b
28
29
30def main():
31    parser = optparse.OptionParser('Usage: %prog pocket package commit')
32    opts, args = parser.parse_args()
33    if len(args) != 3:
34        parser.print_help()
35        return 1
36    pocket, package, commit = args
37    principal = os.environ['REMOTE_USER']
38    request_time = datetime.datetime.utcnow()
39    q_path = os.path.join(b._QUEUE_DIR,
40                          '%s_%s' % (request_time.strftime('%Y%m%d%H%M%S'),
41                                     uuid.uuid4()))
42
43    try:
44        # TODO: clean up this interface.
45        b.ensureValidPackage(package)
46        commit = b.canonicalize_commit(package, commit)
47        b.validateBuild(pocket, package, commit)
48    except b.InvalidBuild, e:
49        msg = "E: %s" % e
50        print >>sys.stderr, msg
51        # Prevent an attack by submitting excessively long arguments
52        args = [arg[:min(len(arg), 80)] for arg in (pocket, package, commit)]
53        b.runHook('failed-submit', args + [principal], stdin_str=msg)
54        sys.exit(1)
55
56    # To keep from triggering the Invirtibuilder before we've actually
57    # written the file out, first write the queue entry to a temporary
58    # file, and then move it into the queue directory.
59    q_fd, q_name = tempfile.mkstemp()
60    q = os.fdopen(q_fd, 'r+')
61    print >>q, "%s %s %s %s" % (pocket, package, commit, principal)
62    q.close()
63    os.rename(q_name, q_path)
64    short_commit = b.canonicalize_commit(package, commit, shorten=True)
65    b.runHook('post-submit', [pocket, package, short_commit, principal])
66    print '%s, your job to build %s for %s:%s has been submitted!' % (principal, short_commit, package, pocket)
67
68
69if __name__ == '__main__':
70    main()
Note: See TracBrowser for help on using the repository browser.