LAVA: get linux modules and embed them in lttng-modules tarball
[lttng-ci.git] / scripts / system-tests / lava2-submit.py
CommitLineData
878b4840
JR
1#!/usr/bin/python
2# Copyright (C) 2016 - Francis Deslauriers <francis.deslauriers@efficios.com>
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17import argparse
18import base64
19import json
20import os
21import random
22import sys
23import time
4cb5cc4f 24import yaml
878b4840 25import xmlrpc.client
ef84c6ec
JR
26import pprint
27
4cb5cc4f 28from jinja2 import Environment, FileSystemLoader, meta
878b4840 29
ef84c6ec
JR
30USERNAME = 'lava-jenkins'
31HOSTNAME = 'lava-master-02.internal.efficios.com'
0425e1dd 32OBJSTORE_URL = "https://obj.internal.efficios.com/lava/results/"
878b4840
JR
33
34class TestType():
35 baremetal_benchmarks=1
36 baremetal_tests=2
37 kvm_tests=3
38 kvm_fuzzing_tests=4
39 values = {
40 'baremetal-benchmarks' : baremetal_benchmarks,
41 'baremetal-tests' : baremetal_tests,
42 'kvm-tests' : kvm_tests,
43 'kvm-fuzzin-tests' : kvm_fuzzing_tests,
44 }
45
4cb5cc4f
JR
46class DeviceType():
47 x86 = 'x86'
f9a184a9 48 kvm = 'qemu'
4cb5cc4f
JR
49 values = {
50 'kvm' : kvm,
51 'x86' : x86,
52 }
53
878b4840
JR
54def get_job_bundle_content(server, job):
55 try:
56 bundle_sha = server.scheduler.job_status(str(job))['bundle_sha1']
57 bundle = server.dashboard.get(bundle_sha)
58 except xmlrpc.client.Fault as f:
59 print('Error while fetching results bundle', f.faultString)
60 raise f
61
62 return json.loads(bundle['content'])
63
64# Parse the results bundle to see the run-tests testcase
65# of the lttng-kernel-tests passed successfully
66def check_job_all_test_cases_state_count(server, job):
0425e1dd
JR
67 print("Testcase result:")
68 content = server.results.get_testjob_results_yaml(str(job))
69 testcases = yaml.load(content)
878b4840
JR
70
71 passed_tests=0
72 failed_tests=0
0425e1dd
JR
73 for testcase in testcases:
74 if testcase['result'] != 'pass':
75 print("\tFAILED {}\n\t\t See http://{}{}".format(
76 testcase['name'],
77 HOSTNAME,
78 testcase['url']
79 ))
80 failed_tests+=1
81 else:
82 passed_tests+=1
878b4840
JR
83 return (passed_tests, failed_tests)
84
0425e1dd 85# Get the benchmark results from the objstore
878b4840 86# save them as CSV files localy
0425e1dd 87def fetch_benchmark_results(build_id):
878b4840
JR
88 testcases = ['processed_results_close.csv',
89 'processed_results_ioctl.csv',
90 'processed_results_open_efault.csv',
91 'processed_results_open_enoent.csv',
92 'processed_results_dup_close.csv',
93 'processed_results_raw_syscall_getpid.csv',
94 'processed_results_lttng_test_filter.csv']
0425e1dd
JR
95 for testcase in testcases:
96 url = urljoin(OBJSTORE_URL, "{:s}/{:s}".format(build_id, testcase))
97 urlretrieve(url, testcase)
878b4840
JR
98
99# Parse the attachment of the testcase to fetch the stdout of the test suite
100def print_test_output(server, job):
0425e1dd
JR
101 job_finished, log = server.scheduler.jobs.logs(str(job))
102 logs = yaml.load(log.data.decode('ascii'))
103 print_line = False
104 for line in logs:
105 if line['lvl'] != 'target':
106 continue
107 if line['msg'] == '<LAVA_SIGNAL_STARTTC run-tests>':
108 print('---- TEST SUITE OUTPUT BEGIN ----')
109 print_line = True
110 continue
111 if line['msg'] == '<LAVA_SIGNAL_ENDTC run-tests>':
112 print('----- TEST SUITE OUTPUT END -----')
113 break
114 if print_line:
115 print("{} {}".format(line['dt'], line['msg']))
878b4840 116
c11ec858 117def get_vlttng_cmd(device, lttng_tools_commit, lttng_ust_commit=None):
878b4840
JR
118
119 vlttng_cmd = 'vlttng --jobs=$(nproc) --profile urcu-master' \
120 ' --override projects.babeltrace.build-env.PYTHON=python3' \
121 ' --override projects.babeltrace.build-env.PYTHON_CONFIG=python3-config' \
122 ' --profile babeltrace-stable-1.4' \
123 ' --profile babeltrace-python' \
124 ' --profile lttng-tools-master' \
125 ' --override projects.lttng-tools.checkout='+lttng_tools_commit + \
126 ' --profile lttng-tools-no-man-pages'
127
128 if lttng_ust_commit is not None:
129 vlttng_cmd += ' --profile lttng-ust-master ' \
130 ' --override projects.lttng-ust.checkout='+lttng_ust_commit+ \
131 ' --profile lttng-ust-no-man-pages'
132
c11ec858
JR
133 if device is DeviceType.kvm:
134 vlttng_path = '/root/virtenv'
135 else:
136 vlttng_path = '/tmp/virtenv'
137
4cb5cc4f 138 vlttng_cmd += ' ' + vlttng_path
878b4840 139
4cb5cc4f 140 return vlttng_cmd
878b4840
JR
141
142def main():
ca08dcdf 143 nfsrootfs = "https://obj.internal.efficios.com/lava/rootfs/rootfs_amd64_bionic_2018-11-29.tar.gz"
878b4840
JR
144 test_type = None
145 parser = argparse.ArgumentParser(description='Launch baremetal test using Lava')
146 parser.add_argument('-t', '--type', required=True)
147 parser.add_argument('-j', '--jobname', required=True)
148 parser.add_argument('-k', '--kernel', required=True)
878b4840
JR
149 parser.add_argument('-lm', '--lmodule', required=True)
150 parser.add_argument('-tc', '--tools-commit', required=True)
6b35e57c 151 parser.add_argument('-id', '--build-id', required=True)
878b4840 152 parser.add_argument('-uc', '--ust-commit', required=False)
f23dc688 153 parser.add_argument('-d', '--debug', required=False, action='store_true')
878b4840
JR
154 args = parser.parse_args()
155
156 if args.type not in TestType.values:
157 print('argument -t/--type {} unrecognized.'.format(args.type))
158 print('Possible values are:')
159 for k in TestType.values:
160 print('\t {}'.format(k))
161 return -1
878b4840
JR
162
163 lava_api_key = None
f23dc688
JR
164 if not args.debug:
165 try:
ef84c6ec 166 lava_api_key = os.environ['LAVA2_JENKINS_TOKEN']
f23dc688 167 except Exception as e:
ef84c6ec 168 print('LAVA2_JENKINS_TOKEN not found in the environment variable. Exiting...', e )
f23dc688 169 return -1
878b4840 170
4cb5cc4f
JR
171 jinja_loader = FileSystemLoader(os.path.dirname(os.path.realpath(__file__)))
172 jinja_env = Environment(loader=jinja_loader, trim_blocks=True,
173 lstrip_blocks= True)
174 jinja_template = jinja_env.get_template('template_lava_job.jinja2')
175 template_source = jinja_env.loader.get_source(jinja_env, 'template_lava_job.jinja2')
176 parsed_content = jinja_env.parse(template_source)
177 undef = meta.find_undeclared_variables(parsed_content)
178
179 test_type = TestType.values[args.type]
180
181 if test_type in [TestType.baremetal_benchmarks, TestType.baremetal_tests]:
182 device_type = DeviceType.x86
878b4840 183 else:
4cb5cc4f 184 device_type = DeviceType.kvm
e640b6d8
JR
185
186 vlttng_path = '/tmp/virtenv'
4cb5cc4f 187
c11ec858 188 vlttng_cmd = get_vlttng_cmd(device_type, args.tools_commit, args.ust_commit)
4cb5cc4f
JR
189
190 context = dict()
191 context['DeviceType'] = DeviceType
192 context['TestType'] = TestType
193
194 context['job_name'] = args.jobname
195 context['test_type'] = test_type
4cb5cc4f
JR
196 context['random_seed'] = random.randint(0, 1000000)
197 context['device_type'] = device_type
198
199 context['vlttng_cmd'] = vlttng_cmd
200 context['vlttng_path'] = vlttng_path
201
202 context['kernel_url'] = args.kernel
203 context['nfsrootfs_url'] = nfsrootfs
204 context['lttng_modules_url'] = args.lmodule
6b35e57c 205 context['jenkins_build_id'] = args.build_id
4cb5cc4f
JR
206
207 context['kprobe_round_nb'] = 10
208
ef84c6ec
JR
209 render = jinja_template.render(context)
210
ef84c6ec
JR
211 print('Job to be submitted:')
212
213 print(render)
878b4840 214
f23dc688 215 if args.debug:
f23dc688
JR
216 return 0
217
878b4840
JR
218 server = xmlrpc.client.ServerProxy('http://%s:%s@%s/RPC2' % (USERNAME, lava_api_key, HOSTNAME))
219
ef84c6ec 220 jobid = server.scheduler.submit_job(render)
878b4840
JR
221
222 print('Lava jobid:{}'.format(jobid))
0425e1dd 223 print('Lava job URL: http://lava-master-02.internal.efficios.com/scheduler/job/{}'.format(jobid))
878b4840
JR
224
225 #Check the status of the job every 30 seconds
0425e1dd
JR
226 jobstatus = server.scheduler.job_state(jobid)['job_state']
227 running = False
228 while jobstatus in ['Submitted','Scheduling','Scheduled','Running']:
229 if not running and jobstatus == 'Running':
878b4840 230 print('Job started running')
0425e1dd 231 running = True
878b4840 232 time.sleep(30)
0425e1dd 233 jobstatus = server.scheduler.job_state(jobid)['job_state']
878b4840 234 print('Job ended with {} status.'.format(jobstatus))
0425e1dd
JR
235
236 if jobstatus != 'Finished':
878b4840 237 return -1
878b4840 238
0425e1dd
JR
239 if test_type is TestType.kvm_tests or test_type is TestType.baremetal_tests:
240 print_test_output(server, jobid)
241 elif test_type is TestType.baremetal_benchmarks:
242 fetch_benchmark_results(args.build_id)
243
244 passed, failed=check_job_all_test_cases_state_count(server, jobid)
245 print('With {} passed and {} failed Lava test cases.'.format(passed, failed))
246
247 if failed == 0:
248 return 0
249 else:
250 return -1
878b4840
JR
251
252if __name__ == "__main__":
253 sys.exit(main())
This page took 0.032946 seconds and 4 git commands to generate.