Skip to content

Commit 53da665

Browse files
authored
Merges #18 Closes #18
2 parents cd1581d + f9bf3b0 commit 53da665

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ trustable spdx.xml \
5454
--grimoirelab-user user --grimoirelab-password password \
5555
--opensearch-url https://admin:[email protected]:9200 \
5656
--opensearch-index events \
57-
--output metrics.json
57+
--output metrics.json \
58+
--repository-timeout 3600
5859
```
5960

6061
The parameters needed to run the tool are:

tests/unit/test_cli.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,34 @@ def request_callback(request, uri, headers):
9696
return http_requests
9797

9898

99+
def setup_get_never_ending_repositories_mock_server():
100+
"""Setup a mock HTTP server for repository API calls"""
101+
102+
http_requests = []
103+
104+
def request_callback(request, uri, headers):
105+
last_request = httpretty.last_request()
106+
http_requests.append(last_request)
107+
last_run = datetime.datetime.now(tz=datetime.timezone.utc) - datetime.timedelta(days=365)
108+
data = {
109+
"results": [
110+
{
111+
"task": {
112+
"last_run": last_run.isoformat(),
113+
"status": "running",
114+
}
115+
}
116+
]
117+
}
118+
body = json.dumps(data)
119+
120+
return 200, headers, body
121+
122+
httpretty.register_uri(httpretty.GET, REPOSITORIES_URL, responses=[httpretty.Response(body=request_callback)])
123+
124+
return http_requests
125+
126+
99127
class TestCli(unittest.TestCase):
100128
def setUp(self):
101129
logging.getLogger().handlers = []
@@ -348,6 +376,42 @@ def test_server_error(self):
348376
self.assertIn("Error scheduling task", result.output)
349377
self.assertEqual(len(http_requests), 5)
350378

379+
@httpretty.activate
380+
@patch("trustable_cli.cli.get_repository_metrics")
381+
def test_never_ending_repository(self, mock_get_repository_metrics):
382+
"""Check if it returns a warning when a repository task never ends"""
383+
384+
http_requests = setup_add_repository_mock_server()
385+
http_requests_repos = setup_get_never_ending_repositories_mock_server()
386+
mock_get_repository_metrics.return_value = {"metrics": {"num_commits": 10}}
387+
388+
runner = CliRunner()
389+
390+
result = runner.invoke(
391+
trustable_grimoirelab_score,
392+
[
393+
"./data/valid.spdx.xml",
394+
"--grimoirelab-url",
395+
GRIMOIRELAB_URL,
396+
"--opensearch-url",
397+
OPENSEARCH_URL,
398+
"--opensearch-index",
399+
OPENSEARCH_INDEX,
400+
"--output",
401+
self.temp_file.name,
402+
"--repository-timeout",
403+
15,
404+
],
405+
)
406+
407+
self.assertEqual(result.exit_code, 0)
408+
self.assertIn(
409+
"Timeout waiting for repository https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux to be ready",
410+
result.output,
411+
)
412+
self.assertEqual(len(http_requests), 5)
413+
self.assertEqual(len(http_requests_repos), 10)
414+
351415

352416
class TestGetRepository(unittest.TestCase):
353417
def test_valid_git_repository(self):

trustable_cli/cli.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@
5858
)
5959
@click.option("--opensearch-index", help="OpenSearch index", default="events")
6060
@click.option("--output", help="File where the scores will be written", type=click.File("w"), default=sys.stdout)
61+
@click.option(
62+
"--repository-timeout",
63+
type=int,
64+
help="Timeout in seconds to wait for a repository to be analyzed",
65+
default=3600,
66+
)
6167
@click.option(
6268
"--from-date",
6369
type=click.DateTime(formats=["%Y-%m-%d"]),
@@ -79,6 +85,7 @@ def trustable_grimoirelab_score(
7985
opensearch_url: str,
8086
opensearch_index: str,
8187
output: str,
88+
repository_timeout: int,
8289
from_date: datetime.datetime | None = None,
8390
to_date: datetime.datetime | None = None,
8491
verify_certs: bool = False,
@@ -116,7 +123,14 @@ def trustable_grimoirelab_score(
116123
schedule_repositories(git_urls, grimoirelab_client)
117124

118125
metrics = generate_metrics_when_ready(
119-
grimoirelab_client, git_urls, opensearch_url, opensearch_index, from_date, to_date, verify_certs
126+
grimoirelab_client=grimoirelab_client,
127+
repositories=git_urls,
128+
opensearch_url=opensearch_url,
129+
opensearch_index=opensearch_index,
130+
from_date=from_date,
131+
to_date=to_date,
132+
verify_certs=verify_certs,
133+
timeout=repository_timeout,
120134
)
121135

122136
package_metrics = {"packages": {}}
@@ -188,6 +202,7 @@ def generate_metrics_when_ready(
188202
from_date: datetime.datetime | None = None,
189203
to_date: datetime.datetime | None = None,
190204
verify_certs: bool = False,
205+
timeout: int = 3600,
191206
) -> dict[str:Any]:
192207
"""Generate metrics once the repositories have finished the collection.
193208
@@ -198,9 +213,12 @@ def generate_metrics_when_ready(
198213
:param from_date: Start date for metrics.
199214
:param to_date: End date for metrics.
200215
:param verify_certs: Verify SSL/TLS certificates.
216+
:param timeout: Seconds to wait before failing getting metrics
201217
"""
202218
logging.info("Generating metrics")
203219

220+
limit_time = time.time() + timeout
221+
204222
after_date = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=7)
205223
pending_repositories = set(repositories)
206224
metrics = {"repositories": {}}
@@ -221,10 +239,15 @@ def generate_metrics_when_ready(
221239

222240
pending_repositories -= processed
223241

224-
if pending_repositories:
242+
if pending_repositories and time.time() < limit_time:
225243
logging.info(f"Waiting for {len(pending_repositories)} repositories to be ready")
226244
logging.debug(f"Repositories not ready: {pending_repositories}")
227245
time.sleep(25)
246+
else:
247+
break
248+
249+
for repository in pending_repositories:
250+
logging.warning(f"Timeout waiting for repository {repository} to be ready")
228251

229252
return metrics
230253

0 commit comments

Comments
 (0)