Fix: system-tests: canary 2.10 lttng-ust with urcu >= 0.13 is not supported
[lttng-ci.git] / scripts / system-tests / lava2-submit.py
CommitLineData
21fec189 1#!/usr/bin/python3
878b4840
JR
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
878b4840
JR
18import json
19import os
20import random
9356eef7 21import re
878b4840
JR
22import sys
23import time
24import xmlrpc.client
6d3950a9
JR
25from urllib.parse import urljoin
26from urllib.request import urlretrieve
21fec189
JR
27import yaml
28from jinja2 import Environment, FileSystemLoader
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 33
cf1271bb
JR
34def parse_stable_version(stable_version_string):
35 # Get the major and minor version numbers from the lttng version string.
36 version_match = re.search('stable-(\d).(\d\d)', stable_version_string)
37
38 if version_match is not None:
39 major_version = int(version_match.group(1))
40 minor_version = int(version_match.group(2))
41 else:
42 # Setting to zero to make the comparison below easier.
43 major_version = 0
44 minor_version = 0
45 return major_version, minor_version
46
f5f36c68
FD
47
48class TestType:
21fec189 49 """ Enum like for test type """
f5f36c68 50
523e784d
FD
51 baremetal_tests = 1
52 kvm_tests = 2
878b4840 53 values = {
f5f36c68
FD
54 'baremetal-tests': baremetal_tests,
55 'kvm-tests': kvm_tests,
878b4840
JR
56 }
57
f5f36c68
FD
58
59class DeviceType:
21fec189 60 """ Enum like for device type """
f5f36c68 61
4cb5cc4f 62 x86 = 'x86'
f9a184a9 63 kvm = 'qemu'
f5f36c68
FD
64 values = {'kvm': kvm, 'x86': x86}
65
4cb5cc4f 66
878b4840
JR
67def get_job_bundle_content(server, job):
68 try:
69 bundle_sha = server.scheduler.job_status(str(job))['bundle_sha1']
70 bundle = server.dashboard.get(bundle_sha)
21fec189
JR
71 except xmlrpc.client.Fault as error:
72 print('Error while fetching results bundle', error.faultString)
73 raise error
878b4840
JR
74
75 return json.loads(bundle['content'])
76
f5f36c68 77
878b4840 78def check_job_all_test_cases_state_count(server, job):
21fec189
JR
79 """
80 Parse the results bundle to see the run-tests testcase
81 of the lttng-kernel-tests passed successfully
82 """
0425e1dd
JR
83 print("Testcase result:")
84 content = server.results.get_testjob_results_yaml(str(job))
c2f8bcb9 85 testcases = yaml.unsafe_load(content)
878b4840 86
21fec189
JR
87 passed_tests = 0
88 failed_tests = 0
0425e1dd
JR
89 for testcase in testcases:
90 if testcase['result'] != 'pass':
f5f36c68
FD
91 print(
92 "\tFAILED {}\n\t\t See http://{}{}".format(
93 testcase['name'], HOSTNAME, testcase['url']
94 )
95 )
21fec189 96 failed_tests += 1
0425e1dd 97 else:
21fec189 98 passed_tests += 1
878b4840
JR
99 return (passed_tests, failed_tests)
100
f5f36c68 101
878b4840 102def print_test_output(server, job):
21fec189
JR
103 """
104 Parse the attachment of the testcase to fetch the stdout of the test suite
105 """
0425e1dd 106 job_finished, log = server.scheduler.jobs.logs(str(job))
be7f51b6 107 logs = yaml.unsafe_load(log.data.decode('ascii'))
0425e1dd
JR
108 print_line = False
109 for line in logs:
110 if line['lvl'] != 'target':
111 continue
112 if line['msg'] == '<LAVA_SIGNAL_STARTTC run-tests>':
113 print('---- TEST SUITE OUTPUT BEGIN ----')
114 print_line = True
115 continue
116 if line['msg'] == '<LAVA_SIGNAL_ENDTC run-tests>':
117 print('----- TEST SUITE OUTPUT END -----')
d132001f
FD
118 print_line = False
119 continue
0425e1dd
JR
120 if print_line:
121 print("{} {}".format(line['dt'], line['msg']))
878b4840 122
f5f36c68
FD
123
124def get_vlttng_cmd(
9356eef7 125 lttng_version, lttng_tools_url, lttng_tools_commit, lttng_ust_url=None, lttng_ust_commit=None
f5f36c68 126):
21fec189
JR
127 """
128 Return vlttng cmd to be used in the job template for setup.
129 """
f1d85a63
JR
130 urcu_profile = ""
131 if lttng_version == 'master' or (major_version >= 2 and minor_version >= 11):
132 urcu_profile = "urcu-master"
133 else:
134 urcu_profile = "urcu-stable-0.12"
878b4840 135
f5f36c68 136 vlttng_cmd = (
f1d85a63
JR
137 'vlttng --jobs=$(nproc) --profile ' + urcu_profile
138 + ' --override projects.babeltrace.build-env.PYTHON=python3'
f5f36c68 139 ' --override projects.babeltrace.build-env.PYTHON_CONFIG=python3-config'
0c4ab1e7 140 ' --profile babeltrace-stable-1.5'
f5f36c68
FD
141 ' --profile babeltrace-python'
142 ' --profile lttng-tools-master'
143 ' --override projects.lttng-tools.source='
144 + lttng_tools_url
145 + ' --override projects.lttng-tools.checkout='
146 + lttng_tools_commit
147 + ' --profile lttng-tools-no-man-pages'
148 )
878b4840
JR
149
150 if lttng_ust_commit is not None:
f5f36c68
FD
151 vlttng_cmd += (
152 ' --profile lttng-ust-master '
153 ' --override projects.lttng-ust.source='
154 + lttng_ust_url
155 + ' --override projects.lttng-ust.checkout='
156 + lttng_ust_commit
157 + ' --profile lttng-ust-no-man-pages'
158 )
878b4840 159
cf1271bb 160 major_version, minor_version = parse_stable_version(lttng_version)
9356eef7
FD
161
162 if lttng_version == 'master' or (major_version >= 2 and minor_version >= 11):
163 vlttng_cmd += (
164 ' --override projects.lttng-tools.configure+=--enable-test-sdt-uprobe'
165 )
166
888b31de 167 vlttng_path = '/tmp/virtenv'
c11ec858 168
4cb5cc4f 169 vlttng_cmd += ' ' + vlttng_path
878b4840 170
4cb5cc4f 171 return vlttng_cmd
878b4840 172
f5f36c68 173
878b4840 174def main():
9a49d69d 175 nfsrootfs = "https://obj.internal.efficios.com/lava/rootfs/rootfs_amd64_xenial_2018-12-05.tar.gz"
878b4840
JR
176 test_type = None
177 parser = argparse.ArgumentParser(description='Launch baremetal test using Lava')
178 parser.add_argument('-t', '--type', required=True)
9356eef7 179 parser.add_argument('-lv', '--lttng-version', required=True)
878b4840
JR
180 parser.add_argument('-j', '--jobname', required=True)
181 parser.add_argument('-k', '--kernel', required=True)
878b4840 182 parser.add_argument('-lm', '--lmodule', required=True)
eb5bdbeb 183 parser.add_argument('-tu', '--tools-url', required=True)
878b4840 184 parser.add_argument('-tc', '--tools-commit', required=True)
6b35e57c 185 parser.add_argument('-id', '--build-id', required=True)
eb5bdbeb 186 parser.add_argument('-uu', '--ust-url', required=False)
878b4840 187 parser.add_argument('-uc', '--ust-commit', required=False)
f23dc688 188 parser.add_argument('-d', '--debug', required=False, action='store_true')
878b4840
JR
189 args = parser.parse_args()
190
191 if args.type not in TestType.values:
192 print('argument -t/--type {} unrecognized.'.format(args.type))
193 print('Possible values are:')
194 for k in TestType.values:
195 print('\t {}'.format(k))
196 return -1
878b4840
JR
197
198 lava_api_key = None
f23dc688
JR
199 if not args.debug:
200 try:
ef84c6ec 201 lava_api_key = os.environ['LAVA2_JENKINS_TOKEN']
21fec189 202 except Exception as error:
f5f36c68
FD
203 print(
204 'LAVA2_JENKINS_TOKEN not found in the environment variable. Exiting...',
205 error,
206 )
f23dc688 207 return -1
878b4840 208
4cb5cc4f 209 jinja_loader = FileSystemLoader(os.path.dirname(os.path.realpath(__file__)))
f5f36c68 210 jinja_env = Environment(loader=jinja_loader, trim_blocks=True, lstrip_blocks=True)
4cb5cc4f 211 jinja_template = jinja_env.get_template('template_lava_job.jinja2')
4cb5cc4f
JR
212
213 test_type = TestType.values[args.type]
214
523e784d 215 if test_type is TestType.baremetal_tests:
4cb5cc4f 216 device_type = DeviceType.x86
878b4840 217 else:
4cb5cc4f 218 device_type = DeviceType.kvm
e640b6d8
JR
219
220 vlttng_path = '/tmp/virtenv'
4cb5cc4f 221
f5f36c68 222 vlttng_cmd = get_vlttng_cmd(
9356eef7 223 args.lttng_version, args.tools_url, args.tools_commit, args.ust_url, args.ust_commit
f5f36c68 224 )
4cb5cc4f 225
cf1271bb
JR
226 if args.lttng_version == "master":
227 lttng_version_string = "master"
7ce9e417
JR
228 elif args.lttng_version == "canary":
229 lttng_version_string = "2.10"
cf1271bb
JR
230 else:
231 major, minor = parse_stable_version(args.lttng_version)
232 lttng_version_string = str(major) + "." + str(minor)
233
234
4cb5cc4f
JR
235 context = dict()
236 context['DeviceType'] = DeviceType
237 context['TestType'] = TestType
238
239 context['job_name'] = args.jobname
240 context['test_type'] = test_type
4cb5cc4f
JR
241 context['random_seed'] = random.randint(0, 1000000)
242 context['device_type'] = device_type
243
244 context['vlttng_cmd'] = vlttng_cmd
245 context['vlttng_path'] = vlttng_path
cf1271bb 246 context['lttng_version_string'] = lttng_version_string
4cb5cc4f
JR
247
248 context['kernel_url'] = args.kernel
249 context['nfsrootfs_url'] = nfsrootfs
250 context['lttng_modules_url'] = args.lmodule
6b35e57c 251 context['jenkins_build_id'] = args.build_id
4cb5cc4f
JR
252
253 context['kprobe_round_nb'] = 10
254
ef84c6ec
JR
255 render = jinja_template.render(context)
256
ef84c6ec
JR
257 print('Job to be submitted:')
258
259 print(render)
878b4840 260
f23dc688 261 if args.debug:
f23dc688
JR
262 return 0
263
f5f36c68
FD
264 server = xmlrpc.client.ServerProxy(
265 'http://%s:%s@%s/RPC2' % (USERNAME, lava_api_key, HOSTNAME)
266 )
878b4840 267
21fec189
JR
268 for attempt in range(10):
269 try:
270 jobid = server.scheduler.submit_job(render)
271 except xmlrpc.client.ProtocolError as error:
f5f36c68
FD
272 print(
273 'Protocol error on submit, sleeping and retrying. Attempt #{}'.format(
274 attempt
275 )
276 )
21fec189
JR
277 time.sleep(5)
278 continue
279 else:
280 break
878b4840
JR
281
282 print('Lava jobid:{}'.format(jobid))
f5f36c68
FD
283 print(
284 'Lava job URL: http://lava-master-02.internal.efficios.com/scheduler/job/{}'.format(
285 jobid
286 )
287 )
878b4840 288
f5f36c68 289 # Check the status of the job every 30 seconds
0425e1dd
JR
290 jobstatus = server.scheduler.job_state(jobid)['job_state']
291 running = False
21fec189 292 while jobstatus in ['Submitted', 'Scheduling', 'Scheduled', 'Running']:
0425e1dd 293 if not running and jobstatus == 'Running':
878b4840 294 print('Job started running')
0425e1dd 295 running = True
878b4840 296 time.sleep(30)
26cbe60b
JR
297 try:
298 jobstatus = server.scheduler.job_state(jobid)['job_state']
21fec189
JR
299 except xmlrpc.client.ProtocolError as error:
300 print('Protocol error, retrying')
301 continue
878b4840 302 print('Job ended with {} status.'.format(jobstatus))
0425e1dd
JR
303
304 if jobstatus != 'Finished':
878b4840 305 return -1
878b4840 306
0425e1dd
JR
307 if test_type is TestType.kvm_tests or test_type is TestType.baremetal_tests:
308 print_test_output(server, jobid)
0425e1dd 309
21fec189 310 passed, failed = check_job_all_test_cases_state_count(server, jobid)
0425e1dd
JR
311 print('With {} passed and {} failed Lava test cases.'.format(passed, failed))
312
21fec189 313 if failed != 0:
0425e1dd 314 return -1
878b4840 315
21fec189
JR
316 return 0
317
f5f36c68 318
878b4840
JR
319if __name__ == "__main__":
320 sys.exit(main())
This page took 0.040222 seconds and 4 git commands to generate.