-
Notifications
You must be signed in to change notification settings - Fork 0
/
bugzilla_utils.py
112 lines (93 loc) · 3.89 KB
/
bugzilla_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env python
# encoding: utf-8
"""
@version: v1.0
@author: Gaivin Wang
@license: Apache Licence
@contact: gaivin@outlook.com
@site:
@software: PyCharm
@file: bugzilla_utils.py
@time: 3/26/2019 9:30 AM
"""
import requests, json
import fire
from logger_utils import get_logger
import urllib3
urllib3.disable_warnings()
logger = get_logger("Bugzilla")
class Bugzilla():
def __init__(self, host):
self.host = host
def login(self, user_name, password):
self.session = requests.session()
login_url = "%s/index.cgi" % self.host
goahead_and_login = [1, "Log+in"]
data = self._generate_form_data(Bugzilla_login=user_name, Bugzilla_password=password,
Bugzilla_restrictlogin="on",
GoAheadAndLogin=goahead_and_login)
response = self.session.post(login_url, files=data, verify=False)
if response.status_code != 200:
logger.error("Login Bugzilla failed. Please check your user and password (%s/%s). " % (user_name, password))
logger.error("%s" % response.text)
raise Exception(message="Login failed")
logger.info("Login Bugzilla successfully!")
return self.session
def _generate_form_data(self, **form_data_kwargs):
form_data = dict()
for key, value in form_data_kwargs.items():
if isinstance(value, str):
form_data[key] = (None, value)
else:
form_data[key] = (None, json.dumps(value))
return form_data
def export_bugs_to_csv_by_bug_id(self, bug_ids, fields, csv_file=None):
logger.info("Export bugs %s with fields %s" % (bug_ids, fields))
parameters = dict()
parameters["j_top"] = "OR"
parameters["ctype"] = "csv"
parameters["human"] = "1"
parameters["query_format"] = "advanced"
for index, bug_id in enumerate(bug_ids):
filed = "f%s" % index
operate = "o%s" % index
value = "v%s" % index
parameters[filed] = "bug_id"
parameters[operate] = "equals"
parameters[value] = bug_id
columnlist = ",".join(fields)
parameters["columnlist"] = columnlist
self.session.params = parameters
return self._export_bugs_with_parameters(parameters=parameters, csv_file=csv_file)
def export_bugs_to_csv_by_product(self, product, fields, csv_file=None):
logger.info("Export bugs by product %s" % product)
parameters = dict()
parameters["ctype"] = "csv"
parameters["human"] = "1"
parameters["query_format"] = "advanced"
parameters["product"] = product
columnlist = ",".join(fields)
parameters["columnlist"] = columnlist
return self._export_bugs_with_parameters(parameters=parameters, csv_file=csv_file)
def _export_bugs_with_parameters(self, parameters, csv_file=None):
logger.info("Export bugs with parameters: %s" % parameters)
self.session.params = parameters
response = self.session.get("%s/buglist.cgi" % self.host)
if response.status_code != 200:
logger.error("Get bug list failed with parameters" % parameters)
logger.error(response.text)
raise Exception(message="Get bugs failed")
if csv_file is None:
csv_file = self._get_file_name_from_header(response)
with open(csv_file, "w", encoding="utf-8") as csvfile:
csvfile.write(response.text)
return csv_file
def _get_file_name_from_header(self, response):
disposition = response.headers.get("Content-disposition", None)
csv_file = "NotFound"
if disposition:
if "filename=" in disposition:
csv_file = disposition.replace('"', '').split("filename=")[1]
return csv_file
if __name__ == "__main__":
fire.Fire(Bugzilla)