~camptocamp/openerp-command/7.0-oca_buildbot_fixes-afe

« back to all changes in this revision

Viewing changes to runbot-job

  • Committer: Vo Minh Thu
  • Date: 2012-11-19 16:41:17 UTC
  • Revision ID: vmt@openerp.com-20121119164117-zez28evl59jym3k8
[IMP] Added runbot-job script.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env python
 
2
"""
 
3
runbot-job is a small script intended to perform tasks on OpenERP projects,
 
4
in particular testing.
 
5
"""
 
6
import argparse
 
7
from contextlib import contextmanager
 
8
import json
 
9
import os
 
10
import re
 
11
import subprocess
 
12
import time
 
13
 
 
14
install_base = False
 
15
install_all = False
 
16
javascript_tests = True
 
17
install_base_log_path = 'install-base.log'
 
18
install_all_log_path = 'install-all.log'
 
19
server_log_path = 'server.log'
 
20
javascript_tests_log_path = 'javascript_tests.log'
 
21
 
 
22
ORIGINAL_PATH = os.environ.get('PATH','').split(':')
 
23
 
 
24
def oe(env, log_path, command):
 
25
    if log_path is None:
 
26
        log_file = None
 
27
    else:
 
28
        log_file = open(log_path, 'w')
 
29
    p = subprocess.Popen(['oe'] + command.split(), stdout=log_file, stderr=log_file, close_fds=True, env=env)
 
30
    return p.wait()
 
31
 
 
32
def wait_until_server_is_ready():
 
33
    for _ in xrange(20):
 
34
        with open(server_log_path, 'r') as f:
 
35
            for line in f:
 
36
                if re.search('HTTP service (.*) running on', line):
 
37
                    return
 
38
        time.sleep(1)
 
39
 
 
40
def check_install_success(log_path):
 
41
    with open(log_path, 'r') as f:
 
42
        for line in f:
 
43
            if re.search('openerp.modules.loading: Modules loaded.', line):
 
44
                return True
 
45
    return False
 
46
 
 
47
@contextmanager
 
48
def server(args):
 
49
    env = env_from_args(args, 'base')
 
50
    log_file = open(server_log_path, 'w')
 
51
    cmd = 'python2 %s/openerp-server --addons-path %s --pidfile server-pid.txt' % \
 
52
        (args.server_path, env['OPENERP_ADDONS'].replace(':', ','))
 
53
    p = subprocess.Popen(cmd.split(), stdout=log_file, stderr=log_file, close_fds=True)
 
54
    server_pid = p.pid
 
55
    wait_until_server_is_ready() # TODO will blow if the server failed to start
 
56
    yield p
 
57
    try:
 
58
        os.kill(server_pid, 9)
 
59
    except OSError:
 
60
        pass
 
61
 
 
62
def env_from_args(args, database_suffix):
 
63
    paths = [args.server_path, args.command_path]
 
64
    addons = [args.addons_path, os.path.join(args.web_path, 'addons'), os.path.join(args.server_path, 'openerp/tests/addons')]
 
65
    e = {
 
66
        'PYTHONPATH': ':'.join(paths),
 
67
        'PATH': ':'.join(paths + ORIGINAL_PATH),
 
68
        'OPENERP_DATABASE': '%s_%s' % (args.prefix, database_suffix),
 
69
        'OPENERP_ADDONS': ':'.join(addons),
 
70
        'OPENERP_HOST': '127.0.0.1',
 
71
        'OPENERP_PORT': args.test_port,
 
72
    }
 
73
    return e
 
74
 
 
75
def run(args):
 
76
    results = {}
 
77
 
 
78
    if install_base:
 
79
        env = env_from_args(args, 'base')
 
80
        oe(env, os.path.join(args.prefix, install_base_log_path), 'initialize --tests')
 
81
        r = check_install_success(os.path.join(args.prefix, install_base_log_path))
 
82
        results['install_base'] = 0 if r else 1
 
83
 
 
84
    if install_all:
 
85
        env = env_from_args(args, 'all')
 
86
        oe(env, os.path.join(args.prefix, install_all_log_path), 'initialize --all-modules --exclude auth_ldap --tests')
 
87
        r = check_install_success(os.path.join(args.prefix, install_all_log_path))
 
88
        results['install_all'] = 0 if r else 1
 
89
 
 
90
    if javascript_tests:
 
91
        env = env_from_args(args, 'all')
 
92
        with server(args) as p:
 
93
            r = oe(env, os.path.join(args.prefix, javascript_tests_log_path), 'run-tests -d %s -m web.test_js' % env['OPENERP_DATABASE'])
 
94
            results['javascript_tests'] = r
 
95
 
 
96
    print json.dumps(results)
 
97
 
 
98
if __name__ == '__main__':
 
99
 
 
100
    parser = argparse.ArgumentParser(
 
101
        description=__doc__)
 
102
 
 
103
    parser.add_argument('--prefix', metavar='PREFIX',
 
104
        required=True,
 
105
        help='the prefix is used to create a working directory and to name databases')
 
106
    parser.add_argument('--server-path', metavar='PATH',
 
107
        required=True,
 
108
        help='path to the server library and executable')
 
109
    parser.add_argument('--addons-path', metavar='PATH',
 
110
        required=True,
 
111
        help='path to the addons')
 
112
    parser.add_argument('--web-path', metavar='PATH',
 
113
        required=True,
 
114
        help='path to the web addons')
 
115
    parser.add_argument('--command-path', metavar='PATH',
 
116
        required=True,
 
117
        help='path to the command library and executable')
 
118
    parser.add_argument('--test-port', metavar='PORT',
 
119
        required=True,
 
120
        help='port used to run the javascript tests')
 
121
 
 
122
    parser.set_defaults(run=run)
 
123
    args = parser.parse_args()
 
124
    args.run(args)
 
125
    
 
126