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/>.
27 from urllib
.parse
import urljoin
28 from urllib
.request
import urlretrieve
30 from jinja2
import Environment
, FileSystemLoader
, meta
32 USERNAME
= 'lava-jenkins'
33 HOSTNAME
= 'lava-master-02.internal.efficios.com'
34 OBJSTORE_URL
= "https://obj.internal.efficios.com/lava/results/"
37 baremetal_benchmarks
=1
42 'baremetal-benchmarks' : baremetal_benchmarks
,
43 'baremetal-tests' : baremetal_tests
,
44 'kvm-tests' : kvm_tests
,
45 'kvm-fuzzing-tests' : kvm_fuzzing_tests
,
56 def get_job_bundle_content(server
, job
):
58 bundle_sha
= server
.scheduler
.job_status(str(job
))['bundle_sha1']
59 bundle
= server
.dashboard
.get(bundle_sha
)
60 except xmlrpc
.client
.Fault
as f
:
61 print('Error while fetching results bundle', f
.faultString
)
64 return json
.loads(bundle
['content'])
66 # Parse the results bundle to see the run-tests testcase
67 # of the lttng-kernel-tests passed successfully
68 def check_job_all_test_cases_state_count(server
, job
):
69 print("Testcase result:")
70 content
= server
.results
.get_testjob_results_yaml(str(job
))
71 testcases
= yaml
.load(content
)
75 for testcase
in testcases
:
76 if testcase
['result'] != 'pass':
77 print("\tFAILED {}\n\t\t See http://{}{}".format(
85 return (passed_tests
, failed_tests
)
87 # Get the benchmark results from the objstore
88 # save them as CSV files localy
89 def fetch_benchmark_results(build_id
):
90 testcases
= ['processed_results_close.csv',
91 'processed_results_ioctl.csv',
92 'processed_results_open_efault.csv',
93 'processed_results_open_enoent.csv',
94 'processed_results_dup_close.csv',
95 'processed_results_raw_syscall_getpid.csv',
96 'processed_results_lttng_test_filter.csv']
97 for testcase
in testcases
:
98 url
= urljoin(OBJSTORE_URL
, "{:s}/{:s}".format(build_id
, testcase
))
99 urlretrieve(url
, testcase
)
101 # Parse the attachment of the testcase to fetch the stdout of the test suite
102 def print_test_output(server
, job
):
103 job_finished
, log
= server
.scheduler
.jobs
.logs(str(job
))
104 logs
= yaml
.load(log
.data
.decode('ascii'))
107 if line
['lvl'] != 'target':
109 if line
['msg'] == '<LAVA_SIGNAL_STARTTC run-tests>':
110 print('---- TEST SUITE OUTPUT BEGIN ----')
113 if line
['msg'] == '<LAVA_SIGNAL_ENDTC run-tests>':
114 print('----- TEST SUITE OUTPUT END -----')
117 print("{} {}".format(line
['dt'], line
['msg']))
119 def get_vlttng_cmd(device
, lttng_tools_commit
, lttng_ust_commit
=None):
121 vlttng_cmd
= 'vlttng --jobs=$(nproc) --profile urcu-master' \
122 ' --override projects.babeltrace.build-env.PYTHON=python3' \
123 ' --override projects.babeltrace.build-env.PYTHON_CONFIG=python3-config' \
124 ' --profile babeltrace-stable-1.4' \
125 ' --profile babeltrace-python' \
126 ' --profile lttng-tools-master' \
127 ' --override projects.lttng-tools.checkout='+lttng_tools_commit
+ \
128 ' --profile lttng-tools-no-man-pages'
130 if lttng_ust_commit
is not None:
131 vlttng_cmd
+= ' --profile lttng-ust-master ' \
132 ' --override projects.lttng-ust.checkout='+lttng_ust_commit
+ \
133 ' --profile lttng-ust-no-man-pages'
135 vlttng_path
= '/tmp/virtenv'
137 vlttng_cmd
+= ' ' + vlttng_path
142 nfsrootfs
= "https://obj.internal.efficios.com/lava/rootfs/rootfs_amd64_xenial_2018-12-05.tar.gz"
144 parser
= argparse
.ArgumentParser(description
='Launch baremetal test using Lava')
145 parser
.add_argument('-t', '--type', required
=True)
146 parser
.add_argument('-j', '--jobname', required
=True)
147 parser
.add_argument('-k', '--kernel', required
=True)
148 parser
.add_argument('-lm', '--lmodule', required
=True)
149 parser
.add_argument('-tc', '--tools-commit', required
=True)
150 parser
.add_argument('-id', '--build-id', required
=True)
151 parser
.add_argument('-uc', '--ust-commit', required
=False)
152 parser
.add_argument('-d', '--debug', required
=False, action
='store_true')
153 args
= parser
.parse_args()
155 if args
.type not in TestType
.values
:
156 print('argument -t/--type {} unrecognized.'.format(args
.type))
157 print('Possible values are:')
158 for k
in TestType
.values
:
159 print('\t {}'.format(k
))
165 lava_api_key
= os
.environ
['LAVA2_JENKINS_TOKEN']
166 except Exception as e
:
167 print('LAVA2_JENKINS_TOKEN not found in the environment variable. Exiting...', e
)
170 jinja_loader
= FileSystemLoader(os
.path
.dirname(os
.path
.realpath(__file__
)))
171 jinja_env
= Environment(loader
=jinja_loader
, trim_blocks
=True,
173 jinja_template
= jinja_env
.get_template('template_lava_job.jinja2')
174 template_source
= jinja_env
.loader
.get_source(jinja_env
, 'template_lava_job.jinja2')
175 parsed_content
= jinja_env
.parse(template_source
)
176 undef
= meta
.find_undeclared_variables(parsed_content
)
178 test_type
= TestType
.values
[args
.type]
180 if test_type
in [TestType
.baremetal_benchmarks
, TestType
.baremetal_tests
]:
181 device_type
= DeviceType
.x86
183 device_type
= DeviceType
.kvm
185 vlttng_path
= '/tmp/virtenv'
187 vlttng_cmd
= get_vlttng_cmd(device_type
, args
.tools_commit
, args
.ust_commit
)
190 context
['DeviceType'] = DeviceType
191 context
['TestType'] = TestType
193 context
['job_name'] = args
.jobname
194 context
['test_type'] = test_type
195 context
['random_seed'] = random
.randint(0, 1000000)
196 context
['device_type'] = device_type
198 context
['vlttng_cmd'] = vlttng_cmd
199 context
['vlttng_path'] = vlttng_path
201 context
['kernel_url'] = args
.kernel
202 context
['nfsrootfs_url'] = nfsrootfs
203 context
['lttng_modules_url'] = args
.lmodule
204 context
['jenkins_build_id'] = args
.build_id
206 context
['kprobe_round_nb'] = 10
208 render
= jinja_template
.render(context
)
210 print('Job to be submitted:')
217 server
= xmlrpc
.client
.ServerProxy('http://%s:%s@%s/RPC2' % (USERNAME
, lava_api_key
, HOSTNAME
))
219 jobid
= server
.scheduler
.submit_job(render
)
221 print('Lava jobid:{}'.format(jobid
))
222 print('Lava job URL: http://lava-master-02.internal.efficios.com/scheduler/job/{}'.format(jobid
))
224 #Check the status of the job every 30 seconds
225 jobstatus
= server
.scheduler
.job_state(jobid
)['job_state']
227 while jobstatus
in ['Submitted','Scheduling','Scheduled','Running']:
228 if not running
and jobstatus
== 'Running':
229 print('Job started running')
233 jobstatus
= server
.scheduler
.job_state(jobid
)['job_state']
234 except xmlrpc
.client
.ProtocolError
as e
:
235 print('Protocol error, retring')
236 print('Job ended with {} status.'.format(jobstatus
))
238 if jobstatus
!= 'Finished':
241 if test_type
is TestType
.kvm_tests
or test_type
is TestType
.baremetal_tests
:
242 print_test_output(server
, jobid
)
243 elif test_type
is TestType
.baremetal_benchmarks
:
244 fetch_benchmark_results(args
.build_id
)
246 passed
, failed
=check_job_all_test_cases_state_count(server
, jobid
)
247 print('With {} passed and {} failed Lava test cases.'.format(passed
, failed
))
254 if __name__
== "__main__":
This page took 0.060838 seconds and 4 git commands to generate.