|
| 1 | +import json |
1 | 2 | import urllib |
2 | 3 | from datetime import datetime, timedelta |
| 4 | +from functools import wraps |
3 | 5 |
|
4 | 6 | import requests |
5 | 7 |
|
|
8 | 10 | DASHBOARD_API = "https://dashboard.kernelci.org/api/" |
9 | 11 |
|
10 | 12 |
|
11 | | -def dashboard_api_fetch(endpoint, params, use_json, max_retries=3): |
12 | | - base_url = urllib.parse.urljoin(DASHBOARD_API, endpoint) |
13 | | - url = "{}?{}".format(base_url, urllib.parse.urlencode(params)) |
14 | | - retries = 0 |
15 | | - |
16 | | - # Status codes that should trigger a retry |
17 | | - RETRY_STATUS_CODES = [429, 500, 502, 503, 504, 507] |
18 | | - |
19 | | - while retries <= max_retries: |
20 | | - try: |
21 | | - r = requests.get(url) |
22 | | - |
23 | | - if r.status_code in RETRY_STATUS_CODES: |
24 | | - retries += 1 |
25 | | - if retries <= max_retries: |
26 | | - continue |
27 | | - else: |
28 | | - kci_err(f"Failed after {max_retries} retries with 500 error.") |
| 13 | +def _dashboard_request(func): |
| 14 | + @wraps(func) |
| 15 | + def wrapper(endpoint, params, use_json, body=None, max_retries=3): |
| 16 | + base_url = urllib.parse.urljoin(DASHBOARD_API, endpoint) |
| 17 | + url = "{}?{}".format(base_url, urllib.parse.urlencode(params)) |
| 18 | + retries = 0 |
| 19 | + |
| 20 | + # Status codes that should trigger a retry |
| 21 | + RETRY_STATUS_CODES = [429, 500, 502, 503, 504, 507] |
| 22 | + |
| 23 | + while retries <= max_retries: |
| 24 | + try: |
| 25 | + r = func(url, params, use_json, body) |
| 26 | + if r.status_code in RETRY_STATUS_CODES: |
| 27 | + retries += 1 |
| 28 | + if retries <= max_retries: |
| 29 | + continue |
| 30 | + else: |
| 31 | + kci_err(f"Failed after {max_retries} retries with 500 error.") |
| 32 | + raise click.Abort() |
| 33 | + |
| 34 | + r.raise_for_status() |
| 35 | + |
| 36 | + data = r.json() |
| 37 | + if "error" in data: |
| 38 | + if use_json: |
| 39 | + kci_msg(data) |
| 40 | + else: |
| 41 | + kci_msg("json error: " + str(data["error"])) |
29 | 42 | raise click.Abort() |
| 43 | + return data |
30 | 44 |
|
31 | | - r.raise_for_status() |
32 | | - |
33 | | - data = r.json() |
34 | | - if "error" in data: |
35 | | - if use_json: |
36 | | - kci_msg(data) |
37 | | - else: |
38 | | - kci_msg("json error: " + str(data["error"])) |
| 45 | + except requests.exceptions.RequestException as e: |
| 46 | + kci_err(f"Failed to fetch from {DASHBOARD_API}: {str(e)}.") |
39 | 47 | raise click.Abort() |
40 | | - return data |
41 | 48 |
|
42 | | - except requests.exceptions.RequestException as e: |
43 | | - kci_err(f"Failed to fetch from {DASHBOARD_API}: {str(e)}.") |
44 | | - raise click.Abort() |
| 49 | + kci_err("Unexpected failure in API request") |
| 50 | + raise click.Abort() |
| 51 | + |
| 52 | + return wrapper |
| 53 | + |
45 | 54 |
|
46 | | - kci_err("Unexpected failure in API request") |
47 | | - raise click.Abort() |
| 55 | +@_dashboard_request |
| 56 | +def dashboard_api_post(endpoint, params, use_json, body, max_retries=3): |
| 57 | + return requests.post(endpoint, json=body) |
| 58 | + |
| 59 | + |
| 60 | +@_dashboard_request |
| 61 | +def dashboard_api_fetch(endpoint, params, use_json, max_retries=3): |
| 62 | + return requests.get(endpoint) |
48 | 63 |
|
49 | 64 |
|
50 | 65 | def dashboard_fetch_summary(origin, giturl, branch, commit, arch, use_json): |
@@ -122,3 +137,19 @@ def dashboard_fetch_hardware_list(origin, use_json): |
122 | 137 | "startTimestampInSeconds": int(last_week.timestamp()), |
123 | 138 | } |
124 | 139 | return dashboard_api_fetch("hardware/", params, use_json) |
| 140 | + |
| 141 | + |
| 142 | +def dashboard_fetch_hardware_summary(name, origin, use_json): |
| 143 | + # TODO: add extra filters: Commits, date, filter, origin |
| 144 | + now = datetime.today() |
| 145 | + last_week = now - timedelta(days=7) |
| 146 | + body = { |
| 147 | + "origin": origin, |
| 148 | + "endTimestampInSeconds": str(int(now.timestamp())), |
| 149 | + "startTimestampInSeconds": str(int(last_week.timestamp())), |
| 150 | + "selectedCommits": {}, |
| 151 | + "filter": {}, |
| 152 | + } |
| 153 | + return dashboard_api_post( |
| 154 | + f"hardware/{urllib.parse.quote_plus(name)}/summary", {}, use_json, body |
| 155 | + ) |
0 commit comments