2 # Copyright (C) 2016 - Francis Deslauriers <francis.deslauriers@efficios.com>
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.
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.
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/>.
25 from urllib
.parse
import urljoin
26 from urllib
.request
import urlretrieve
28 from jinja2
import Environment
, FileSystemLoader
30 USERNAME
= 'lava-jenkins'
31 HOSTNAME
= os
.environ
.get('LAVA_HOST', 'lava-master-03.internal.efficios.com')
32 PROTO
= os
.environ
.get('LAVA_PROTO', 'https')
33 OBJSTORE_URL
= "https://obj.internal.efficios.com/lava/results/"
35 def parse_stable_version(stable_version_string
):
36 # Get the major and minor version numbers from the lttng version string.
37 version_match
= re
.search('stable-(\d).(\d\d)', stable_version_string
)
39 if version_match
is not None:
40 major_version
= int(version_match
.group(1))
41 minor_version
= int(version_match
.group(2))
43 # Setting to zero to make the comparison below easier.
46 return major_version
, minor_version
50 """ Enum like for test type """
55 'baremetal-tests': baremetal_tests
,
56 'kvm-tests': kvm_tests
,
61 """ Enum like for device type """
65 values
= {'kvm': kvm
, 'x86': x86
}
68 def get_job_bundle_content(server
, job
):
70 bundle_sha
= server
.scheduler
.job_status(str(job
))['bundle_sha1']
71 bundle
= server
.dashboard
.get(bundle_sha
)
72 except xmlrpc
.client
.Fault
as error
:
73 print('Error while fetching results bundle', error
.faultString
)
76 return json
.loads(bundle
['content'])
79 def check_job_all_test_cases_state_count(server
, job
):
81 Parse the results bundle to see the run-tests testcase
82 of the lttng-kernel-tests passed successfully
84 print("Testcase result:")
85 content
= server
.results
.get_testjob_results_yaml(str(job
))
86 testcases
= yaml
.unsafe_load(content
)
90 for testcase
in testcases
:
91 if testcase
['result'] != 'pass':
93 "\tFAILED {}\n\t\t See {}://{}{}".format(
94 testcase
['name'], PROTO
, HOSTNAME
, testcase
['url']
100 return (passed_tests
, failed_tests
)
103 def print_test_output(server
, job
):
105 Parse the attachment of the testcase to fetch the stdout of the test suite
107 job_finished
, log
= server
.scheduler
.jobs
.logs(str(job
))
108 logs
= yaml
.unsafe_load(log
.data
.decode('ascii'))
111 if line
['lvl'] != 'target':
113 if line
['msg'] == '<LAVA_SIGNAL_STARTTC run-tests>':
114 print('---- TEST SUITE OUTPUT BEGIN ----')
117 if line
['msg'] == '<LAVA_SIGNAL_ENDTC run-tests>':
118 print('----- TEST SUITE OUTPUT END -----')
122 print("{} {}".format(line
['dt'], line
['msg']))
126 lttng_version
, lttng_tools_url
, lttng_tools_commit
, lttng_ust_url
=None, lttng_ust_commit
=None
129 Return vlttng cmd to be used in the job template for setup.
132 major_version
, minor_version
= parse_stable_version(lttng_version
)
135 if lttng_version
== 'master' or (major_version
>= 2 and minor_version
>= 11):
136 urcu_profile
= "urcu-master"
138 urcu_profile
= "urcu-stable-0.12"
140 # Starting with 2.14, babeltrace2 is the reader for testing.
141 if lttng_version
== 'master' or (major_version
>= 2 and minor_version
>= 14):
142 babeltrace_profile
= " --profile babeltrace2-stable-2.0 --profile babeltrace2-python"
143 babeltrace_overrides
= " --override projects.babeltrace2.build-env.PYTHON=python3 --override projects.babeltrace2.build-env.PYTHON_CONFIG=python3-config -o projects.babeltrace2.configure+=--disable-man-pages"
145 babeltrace_profile
= " --profile babeltrace-stable-1.5 --profile babeltrace-python"
146 babeltrace_overrides
= " --override projects.babeltrace.build-env.PYTHON=python3 --override projects.babeltrace.build-env.PYTHON_CONFIG=python3-config"
150 'vlttng --jobs=$(nproc) --profile ' + urcu_profile
152 + babeltrace_overrides
153 + ' --profile lttng-tools-master'
154 ' --override projects.lttng-tools.source='
156 + ' --override projects.lttng-tools.checkout='
158 + ' --profile lttng-tools-no-man-pages'
161 if lttng_ust_commit
is not None:
163 ' --profile lttng-ust-master '
164 ' --override projects.lttng-ust.source='
166 + ' --override projects.lttng-ust.checkout='
168 + ' --profile lttng-ust-no-man-pages'
172 if lttng_version
== 'master' or (major_version
>= 2 and minor_version
>= 11):
174 ' --override projects.lttng-tools.configure+=--enable-test-sdt-uprobe'
177 vlttng_path
= '/tmp/virtenv'
179 vlttng_cmd
+= ' ' + vlttng_path
185 send_retry_limit
= 10
187 parser
= argparse
.ArgumentParser(description
='Launch baremetal test using Lava')
188 parser
.add_argument('-t', '--type', required
=True)
189 parser
.add_argument('-lv', '--lttng-version', required
=True)
190 parser
.add_argument('-j', '--jobname', required
=True)
191 parser
.add_argument('-k', '--kernel', required
=True)
192 parser
.add_argument('-lm', '--lmodule', required
=True)
193 parser
.add_argument('-tu', '--tools-url', required
=True)
194 parser
.add_argument('-tc', '--tools-commit', required
=True)
195 parser
.add_argument('-id', '--build-id', required
=True)
196 parser
.add_argument('-uu', '--ust-url', required
=False)
197 parser
.add_argument('-uc', '--ust-commit', required
=False)
198 parser
.add_argument('-d', '--debug', required
=False, action
='store_true')
200 '-r', '--rootfs-url', required
=False,
201 default
="https://obj.internal.efficios.com/lava/rootfs/rootfs_amd64_jammy_2023-05-18.tar.gz"
203 parser
.add_argument('--ci-repo', required
=False, default
='https://github.com/lttng/lttng-ci.git')
204 parser
.add_argument('--ci-branch', required
=False, default
='master')
205 args
= parser
.parse_args()
207 if args
.type not in TestType
.values
:
208 print('argument -t/--type {} unrecognized.'.format(args
.type))
209 print('Possible values are:')
210 for k
in TestType
.values
:
211 print('\t {}'.format(k
))
217 lava_api_key
= os
.environ
['LAVA2_JENKINS_TOKEN']
218 except Exception as error
:
220 'LAVA2_JENKINS_TOKEN not found in the environment variable. Exiting...',
225 jinja_loader
= FileSystemLoader(os
.path
.dirname(os
.path
.realpath(__file__
)))
226 jinja_env
= Environment(loader
=jinja_loader
, trim_blocks
=True, lstrip_blocks
=True)
227 jinja_template
= jinja_env
.get_template('template_lava_job.jinja2')
229 test_type
= TestType
.values
[args
.type]
231 if test_type
is TestType
.baremetal_tests
:
232 device_type
= DeviceType
.x86
234 device_type
= DeviceType
.kvm
236 vlttng_path
= '/tmp/virtenv'
238 vlttng_cmd
= get_vlttng_cmd(
239 args
.lttng_version
, args
.tools_url
, args
.tools_commit
, args
.ust_url
, args
.ust_commit
242 if args
.lttng_version
== "master":
243 lttng_version_string
= "master"
244 elif args
.lttng_version
== "canary":
245 lttng_version_string
= "2.13"
247 major
, minor
= parse_stable_version(args
.lttng_version
)
248 lttng_version_string
= str(major
) + "." + str(minor
)
252 context
['DeviceType'] = DeviceType
253 context
['TestType'] = TestType
255 context
['job_name'] = args
.jobname
256 context
['test_type'] = test_type
257 context
['random_seed'] = random
.randint(0, 1000000)
258 context
['device_type'] = device_type
260 context
['vlttng_cmd'] = vlttng_cmd
261 context
['vlttng_path'] = vlttng_path
262 context
['lttng_version_string'] = lttng_version_string
264 context
['kernel_url'] = args
.kernel
265 context
['nfsrootfs_url'] = args
.rootfs_url
266 context
['lttng_modules_url'] = args
.lmodule
267 context
['jenkins_build_id'] = args
.build_id
269 context
['kprobe_round_nb'] = 10
271 context
['ci_repo'] = args
.ci_repo
272 context
['ci_branch'] = args
.ci_branch
274 render
= jinja_template
.render(context
)
276 print('Job to be submitted:')
283 server
= xmlrpc
.client
.ServerProxy(
284 '%s://%s:%s@%s/RPC2' % (PROTO
, USERNAME
, lava_api_key
, HOSTNAME
)
287 for attempt
in range(1, send_retry_limit
+ 1):
289 jobid
= server
.scheduler
.submit_job(render
)
290 except xmlrpc
.client
.ProtocolError
as error
:
292 'Protocol error on submit, sleeping and retrying. Attempt #{}'.format(
300 # Early exit when the maximum number of retry is reached.
301 if attempt
== send_retry_limit
:
303 'Protocol error on submit, maximum number of retry reached ({})'.format(
309 print('Lava jobid:{}'.format(jobid
))
311 'Lava job URL: {}://{}/scheduler/job/{}'.format(
312 PROTO
, HOSTNAME
, jobid
316 # Check the status of the job every 30 seconds
317 jobstatus
= server
.scheduler
.job_state(jobid
)['job_state']
319 while jobstatus
in ['Submitted', 'Scheduling', 'Scheduled', 'Running']:
320 if not running
and jobstatus
== 'Running':
321 print('Job started running')
325 jobstatus
= server
.scheduler
.job_state(jobid
)['job_state']
326 except xmlrpc
.client
.ProtocolError
as error
:
327 print('Protocol error, retrying')
329 print('Job ended with {} status.'.format(jobstatus
))
331 if jobstatus
!= 'Finished':
334 if test_type
is TestType
.kvm_tests
or test_type
is TestType
.baremetal_tests
:
335 print_test_output(server
, jobid
)
337 passed
, failed
= check_job_all_test_cases_state_count(server
, jobid
)
338 print('With {} passed and {} failed Lava test cases.'.format(passed
, failed
))
346 if __name__
== "__main__":
This page took 0.073457 seconds and 4 git commands to generate.