blob: ea7a5f370963efb0a5c7ebbc1168a7ee0a65338d [file] [log] [blame]
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +04001#!/usr/bin/env python
2
3import argparse
4import logging
5import os
6import sys
7import traceback
8import warnings
9
10from reporter import Reporter
11
stavrovska28772bc2024-05-22 09:33:50 +020012warnings.simplefilter("always", DeprecationWarning)
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040013logger = logging.getLogger(__name__)
14
15if sys.version_info[0] == 3:
16 str_cls = str
17else:
stavrovska28772bc2024-05-22 09:33:50 +020018 str_cls = eval("unicode")
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040019
20
21def filename(string):
22 if not os.path.exists(string):
23 msg = "%r is not exists" % string
24 raise argparse.ArgumentTypeError(msg)
25 if not os.path.isfile(string):
26 msg = "%r is not a file" % string
27 raise argparse.ArgumentTypeError(msg)
28 return string
29
30
31def parse_args(args):
32 defaults = {
stavrovska28772bc2024-05-22 09:33:50 +020033 "TESTRAIL_URL": "https://mirantis.testrail.com",
34 "TESTRAIL_USER": "user@example.com",
35 "TESTRAIL_PASSWORD": "password",
36 "TESTRAIL_PROJECT": "Mirantis OpenStack",
37 "TESTRAIL_MILESTONE": "9.0",
38 "TESTRAIL_TEST_SUITE": "[{0.testrail_milestone}] MOSQA",
39 "XUNIT_REPORT": "report.xml",
40 "OUTPUT_XUNIT_REPORT": "output_report.xml",
41 "XUNIT_NAME_TEMPLATE": "{id}",
42 "TESTRAIL_NAME_TEMPLATE": "{custom_report_label}",
43 "TRACE_LEN": 100,
44 "ISO_ID": None,
45 "TESTRAIL_PLAN_NAME": None,
46 "ENV_DESCRIPTION": "",
47 "TEST_RESULTS_LINK": "",
48 "PASTE_BASE_URL": None,
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040049 }
50 defaults = {k: os.environ.get(k, v) for k, v in defaults.items()}
51
stavrovska28772bc2024-05-22 09:33:50 +020052 parser = argparse.ArgumentParser(description="xUnit to testrail reporter")
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040053 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020054 "xunit_report",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040055 type=filename,
stavrovska28772bc2024-05-22 09:33:50 +020056 default=defaults["XUNIT_REPORT"],
57 help="xUnit report XML file",
58 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040059
60 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020061 "--output-xunit-report",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040062 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +020063 default=defaults["OUTPUT_XUNIT_REPORT"],
64 help="Output xUnit report XML file after update",
65 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040066
67 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020068 "--xunit-name-template",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040069 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +020070 default=defaults["XUNIT_NAME_TEMPLATE"],
71 help="template for xUnit cases to make id string",
72 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040073 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020074 "--testrail-name-template",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040075 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +020076 default=defaults["TESTRAIL_NAME_TEMPLATE"],
77 help="template for TestRail cases to make id string",
78 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040079
80 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020081 "--env-description",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040082 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +020083 default=defaults["ENV_DESCRIPTION"],
84 help="env deploy type description (for TestRun name)",
85 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040086
87 group = parser.add_mutually_exclusive_group()
88 group.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020089 "--iso-id",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040090 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +020091 default=defaults["ISO_ID"],
92 help="id of build Fuel iso (DEPRECATED)",
93 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040094 group.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +020095 "--testrail-plan-name",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040096 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +020097 default=defaults["TESTRAIL_PLAN_NAME"],
98 help="name of test plan to be displayed in testrail",
99 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400100
101 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200102 "--test-results-link",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400103 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200104 default=defaults["TEST_RESULTS_LINK"],
105 help="link to test job results",
106 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400107 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200108 "--testrail-url",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400109 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200110 default=defaults["TESTRAIL_URL"],
111 help="base url of testrail",
112 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400113 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200114 "--testrail-user",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400115 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200116 default=defaults["TESTRAIL_USER"],
117 help="testrail user",
118 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400119 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200120 "--testrail-password",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400121 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200122 default=defaults["TESTRAIL_PASSWORD"],
123 help="testrail password",
124 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400125 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200126 "--testrail-project",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400127 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200128 default=defaults["TESTRAIL_PROJECT"],
129 help="testrail project name",
130 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400131 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200132 "--testrail-milestone",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400133 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200134 default=defaults["TESTRAIL_MILESTONE"],
135 help="testrail project milestone",
136 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400137 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200138 "--testrail-suite",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400139 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200140 default=defaults["TESTRAIL_TEST_SUITE"],
141 help="testrail project suite name",
142 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400143 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200144 "--trace-len",
Ilya Menkov9533a892021-05-12 19:45:51 +0400145 type=int,
stavrovska28772bc2024-05-22 09:33:50 +0200146 default=defaults["TRACE_LEN"],
147 help="testrail project name",
148 )
Ilya Menkov9533a892021-05-12 19:45:51 +0400149 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200150 "--send-skipped",
151 action="store_true",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400152 default=False,
stavrovska28772bc2024-05-22 09:33:50 +0200153 help="send skipped cases to testrail",
154 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400155 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200156 "--send-duplicates",
157 action="store_true",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400158 default=False,
stavrovska28772bc2024-05-22 09:33:50 +0200159 help="send duplicated cases to testrail",
160 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400161 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200162 "--paste-url",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400163 type=str_cls,
stavrovska28772bc2024-05-22 09:33:50 +0200164 default=defaults["PASTE_BASE_URL"],
165 help=(
166 "pastebin service JSON API URL to send test case logs and trace,"
167 " example: http://localhost:5000/"
168 ),
169 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400170 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200171 "--testrail-run-update",
172 dest="use_test_run_if_exists",
173 action="store_true",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400174 default=False,
stavrovska28772bc2024-05-22 09:33:50 +0200175 help="don't create new test run if such already exists",
176 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400177 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200178 "--dry-run",
179 "-n",
180 action="store_true",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400181 default=False,
stavrovska28772bc2024-05-22 09:33:50 +0200182 help="Just print mapping table",
183 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400184 parser.add_argument(
stavrovska28772bc2024-05-22 09:33:50 +0200185 "--verbose",
186 "-v",
187 action="store_true",
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400188 default=False,
stavrovska28772bc2024-05-22 09:33:50 +0200189 help="Verbose mode",
190 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400191
192 return parser.parse_args(args)
193
194
195def main(args=None):
196
197 args = args or sys.argv[1:]
198
199 args = parse_args(args)
200
201 if not args.testrail_plan_name:
stavrovska28772bc2024-05-22 09:33:50 +0200202 args.testrail_plan_name = (
203 "{0.testrail_milestone} iso " "#{0.iso_id}"
204 ).format(args)
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400205
stavrovska28772bc2024-05-22 09:33:50 +0200206 msg = (
207 "--iso-id parameter is DEPRECATED. "
208 "It is recommended to use --testrail-plan-name parameter."
209 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400210 warnings.warn(msg, DeprecationWarning)
211
212 logger_dict = dict(stream=sys.stderr)
213 if args.verbose:
stavrovska28772bc2024-05-22 09:33:50 +0200214 logger_dict["level"] = logging.DEBUG
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400215
216 logging.basicConfig(**logger_dict)
Ilya Menkov9533a892021-05-12 19:45:51 +0400217 trace_len = args.trace_len
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400218
219 reporter = Reporter(
220 xunit_report=args.xunit_report,
221 output_xunit_report=args.output_xunit_report,
222 env_description=args.env_description,
223 test_results_link=args.test_results_link,
stavrovska28772bc2024-05-22 09:33:50 +0200224 paste_url=args.paste_url,
225 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400226 suite = args.testrail_suite.format(args)
227 reporter.config_testrail(
228 base_url=args.testrail_url,
229 username=args.testrail_user,
230 password=args.testrail_password,
231 project=args.testrail_project,
232 tests_suite=suite,
233 send_skipped=args.send_skipped,
234 send_duplicates=args.send_duplicates,
stavrovska28772bc2024-05-22 09:33:50 +0200235 use_test_run_if_exists=args.use_test_run_if_exists,
236 )
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400237
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400238 empty_classnames = reporter.get_empty_classnames()
Roman Bubyrf71f0062024-03-26 14:16:35 +0100239 all_empty_cases = reporter.get_testcases(empty_classnames)
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400240
241 reporter.update_testcases(all_empty_cases)
242 reporter.delete_duplicates()
Ilya Menkov9533a892021-05-12 19:45:51 +0400243 reporter.cut_long_traces(trace_len)
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400244 reporter.delete_temporary_file()
245
246
stavrovska28772bc2024-05-22 09:33:50 +0200247if __name__ == "__main__":
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400248 try:
249 main()
250 except Exception:
251 traceback.print_exc(file=sys.stdout)
252 sys.exit(1)