diff --git a/swh/web/common/origin_save.py b/swh/web/common/origin_save.py --- a/swh/web/common/origin_save.py +++ b/swh/web/common/origin_save.py @@ -172,7 +172,7 @@ if i != len(visit_dates): visit_date = visit_dates[i] visit_status = origin_visits[i]["status"] - if origin_visits[i]["status"] not in ("full", "partial"): + if origin_visits[i]["status"] not in ("full", "partial", "not_found"): visit_date = None except Exception as exc: sentry_sdk.capture_exception(exc) @@ -187,6 +187,8 @@ save_task_status = SAVE_TASK_SUCCEEDED elif visit_status in ("created", "ongoing"): save_task_status = SAVE_TASK_RUNNING + elif visit_status in ("not_found", "failed"): + save_task_status = SAVE_TASK_FAILED else: time_now = datetime.now(tz=timezone.utc) time_delta = time_now - save_request.request_date @@ -213,8 +215,10 @@ save_task_status in (SAVE_TASK_FAILED, SAVE_TASK_SUCCEEDED) and not visit_date ): - visit_date, _ = _get_visit_info_for_save_request(save_request) + visit_date, visit_status = _get_visit_info_for_save_request(save_request) save_request.visit_date = visit_date + if visit_status in ("failed", "not_found"): + save_task_status = SAVE_TASK_FAILED must_save = True # Check tasks still marked as scheduled / not yet scheduled if save_task_status in (SAVE_TASK_SCHEDULED, SAVE_TASK_NOT_YET_SCHEDULED): diff --git a/swh/web/tests/common/test_origin_save.py b/swh/web/tests/common/test_origin_save.py --- a/swh/web/tests/common/test_origin_save.py +++ b/swh/web/tests/common/test_origin_save.py @@ -229,8 +229,7 @@ mock_get_origin_visits.assert_called_once() -@pytest.mark.django_db -def test_get_save_origin_requests_no_visit_date_found(mocker): +def _get_save_origin_requests(mocker, load_status, visit_status): # create a save request SaveOriginRequest.objects.create( request_date=datetime.now(tz=timezone.utc), @@ -243,7 +242,7 @@ # mock scheduler and archives _mock_scheduler( - mocker, task_status="next_run_scheduled", task_run_status="scheduled" + mocker, task_status="next_run_scheduled", task_run_status=load_status ) mock_archive = mocker.patch("swh.web.common.origin_save.archive") mock_archive.lookup_origin.return_value = {"url": _origin_url} @@ -258,16 +257,35 @@ metadata={}, origin=_origin_url, snapshot=None, - status="created", + status=visit_status, type=_visit_type, url="", visit=34, ) mock_get_origin_visits.return_value = [visit_info] - # check no visit date has been found sors = get_save_origin_requests(_visit_type, _origin_url) + mock_get_origin_visits.assert_called_once() + + return sors + + +@pytest.mark.django_db +def test_get_save_origin_requests_no_visit_date_found(mocker): + sors = _get_save_origin_requests( + mocker, load_status="scheduled", visit_status="created" + ) + # check no visit date has been found assert len(sors) == 1 assert sors[0]["save_task_status"] == SAVE_TASK_RUNNING assert sors[0]["visit_date"] is None - mock_get_origin_visits.assert_called_once() + + +@pytest.mark.django_db +def test_get_save_origin_requests_failed_when_not_found(mocker): + sors = _get_save_origin_requests( + mocker, load_status="uneventful", visit_status="not_found" + ) + assert len(sors) == 1 + assert sors[0]["save_task_status"] == SAVE_TASK_FAILED + assert sors[0]["visit_date"] is not None