| |
@@ -21,6 +21,9 @@
|
| |
# Frantisek Zatloukal <fzatlouk@redhat.com>
|
| |
# Josef Skladanka <jskladan@redhat.com>
|
| |
|
| |
+ from collections import defaultdict
|
| |
+ from json import JSONDecodeError
|
| |
+
|
| |
import json
|
| |
import datetime
|
| |
import requests
|
| |
@@ -28,13 +31,12 @@
|
| |
import bugzilla
|
| |
|
| |
from hawkey._hawkey import ValueException
|
| |
- from json import JSONDecodeError
|
| |
from bodhi.client.bindings import BodhiClient
|
| |
from urllib3.util.retry import Retry
|
| |
from requests.adapters import HTTPAdapter
|
| |
from requests.exceptions import ConnectionError
|
| |
|
| |
- from oraculum import app, db
|
| |
+ from oraculum import app, db, CACHE
|
| |
from oraculum.models.dashboard_users import DashboardUserData
|
| |
|
| |
def update_user_access_time(user):
|
| |
@@ -283,6 +285,24 @@
|
| |
})
|
| |
return data
|
| |
|
| |
+ def get_fti_trackers():
|
| |
+ bzapi = bugzilla.Bugzilla("bugzilla.redhat.com")
|
| |
+ tracker_ids = []
|
| |
+ releases = [CACHE.get('landing_page')["devel"], CACHE.get('landing_page')["stable"]]
|
| |
+ for release in releases:
|
| |
+ bug = bzapi.getbug("F%sFailsToInstall" % release)
|
| |
+ tracker_ids.append(bug.id)
|
| |
+ return tracker_ids
|
| |
+
|
| |
+ def get_ftbfs_trackers():
|
| |
+ bzapi = bugzilla.Bugzilla("bugzilla.redhat.com")
|
| |
+ tracker_ids = []
|
| |
+ releases = [CACHE.get('landing_page')["devel"], CACHE.get('landing_page')["stable"]]
|
| |
+ for release in releases:
|
| |
+ bug = bzapi.getbug("F%sFTBFS" % release)
|
| |
+ tracker_ids.append(bug.id)
|
| |
+ return tracker_ids
|
| |
+
|
| |
def get_package_bugs(package):
|
| |
"""
|
| |
Returns all open Bugs for a single package
|
| |
@@ -292,11 +312,19 @@
|
| |
|
| |
query = bzapi.url_to_query("https://bugzilla.redhat.com/buglist.cgi?bug_status=NEW&bug_status=__open__&"
|
| |
"classification=Fedora&product=Fedora&component=%s" % package)
|
| |
- query["include_fields"] = ["id", "summary", "version", "severity", "status", "last_change_time", "creation_time", "keywords"]
|
| |
+ query["include_fields"] = ['blocks', 'comments', 'creation_time', 'id', 'keywords', 'last_change_time',
|
| |
+ 'severity', 'status', 'summary', 'version']
|
| |
bugs = bzapi.query(query)
|
| |
if len(bugs) == 0:
|
| |
return []
|
| |
+ ftbfs_trackers = set(CACHE.get('ftbfs_trackers'))
|
| |
+ fti_trackers = set(CACHE.get('fti_trackers'))
|
| |
for bug in bugs:
|
| |
+ for blocks in bug.blocks:
|
| |
+ if blocks in ftbfs_trackers and "FTBFS" not in bug.keywords:
|
| |
+ bug.keywords.append("FTBFS")
|
| |
+ if blocks in fti_trackers and "FTI" not in bug.keywords:
|
| |
+ bug.keywords.append("FTI")
|
| |
data.append({
|
| |
"title": bug.summary,
|
| |
"bug_id": bug.id,
|
| |
@@ -306,6 +334,7 @@
|
| |
"reported": str(bug.creation_time),
|
| |
"release": bug.version,
|
| |
"keywords": bug.keywords,
|
| |
+ "comments": (len(bug.comments) - 1), # Let's ignore the first comment that every bug has
|
| |
"url": "https://bugzilla.redhat.com/%s" % bug.id
|
| |
})
|
| |
return data
|
| |
@@ -363,5 +392,69 @@
|
| |
data[package].append(process_override(override))
|
| |
return data
|
| |
|
| |
+ def parse_koschei_data():
|
| |
+ """
|
| |
+ Prepares data from koschei for easier parsing in get_user_koschei_data()
|
| |
+ Returns dict of lists containing dicts: {
|
| |
+ "package_name": [
|
| |
+ {"release": "fedora_release", "status": "koschei status", "url": "https://koschei.fedoraproject.org/package/..."}
|
| |
+ ]
|
| |
+ }
|
| |
+ """
|
| |
+ data = defaultdict(list)
|
| |
+ koschei_resp = get_json(app.config['KOSCHEI_API_URL'])
|
| |
+ for item in koschei_resp:
|
| |
+ data[item["name"]].append({
|
| |
+ "release": item["collection"],
|
| |
+ "status": item["state"],
|
| |
+ "url": "https://koschei.fedoraproject.org/package/%s?collection=%s" % (item["name"], item["collection"])
|
| |
+ })
|
| |
+ return data
|
| |
+
|
| |
+ def get_user_koschei_data(packages):
|
| |
+ """
|
| |
+ Filters out koschei data to contain information only about given pacakges list
|
| |
+ """
|
| |
+ koschei = CACHE.get("koschei_data")
|
| |
+ data = {}
|
| |
+ for package in packages:
|
| |
+ data[package] = koschei.get(package, [])
|
| |
+ return data
|
| |
+
|
| |
+ def get_health_check_data():
|
| |
+ """
|
| |
+ Retrieves json files containing data from fedora-health-check and combines them into dictionary with per-release keys
|
| |
+ Returns dict {
|
| |
+ "FXX": "user_a"...: [package_a, package_b, ...]
|
| |
+ "FXX-testing": "user_b"...: [package_a, package_b. ...]
|
| |
+ "FXX": "user_a"...: [package_b, package_c, ...] # Rawhide releases don't have -testing counterpart
|
| |
+ }
|
| |
+ """
|
| |
+ data = {}
|
| |
+ devel = str(CACHE.get('landing_page')["devel"])
|
| |
+ stable = str(CACHE.get('landing_page')["stable"])
|
| |
+ data[stable] = get_json("https://pagure.io/fedora-health-check/raw/master/f/data/report-%s.json" % stable)["affected"]
|
| |
+ data[stable + "-testing"] = get_json("https://pagure.io/fedora-health-check/raw/master/f/data/report-%s-testing.json" % stable)["affected"]
|
| |
+ data[devel] = get_json("https://pagure.io/fedora-health-check/raw/master/f/data/report-rawhide.json")["affected"]
|
| |
+ return data
|
| |
+
|
| |
+ def get_health_check_user_data(user, packages):
|
| |
+ """
|
| |
+ Parses data from get_health_check_data and returns dict for single user and package list:
|
| |
+ {
|
| |
+ "package_a": {"fails_to_install": True/False, "releases": [list of affected releases]
|
| |
+ ...
|
| |
+ }
|
| |
+ """
|
| |
+ fti_data = CACHE.get('health_check_data')
|
| |
+ data = {}
|
| |
+ for package in packages:
|
| |
+ data[package] = {'fails_to_install': False, 'releases': []}
|
| |
+ for release in fti_data:
|
| |
+ if package in fti_data[release].get(user, []):
|
| |
+ data[package]['fails_to_install'] = True
|
| |
+ data[package]['releases'].append(release)
|
| |
+ return data
|
| |
+
|
| |
if __name__ == "__main__":
|
| |
import ipdb; ipdb.set_trace()
|
| |
I'd try to also improve release numbers detection as a part of this PR.
Currently (if I remember correctly), during branched cycle, devel release returned from oraculum is actually branched number (which is correct for landing page usage).
I'll try to add one more release number - 'rawhide' to make monitoring FTBFS trackers more usable.