Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 65bd8ce

Browse files
committed
Deprecate the "local upload" ReportResults endpoints
This will now return an empty response with a deprecation message, and will not call out to the worker task anymore.
1 parent 28f8d8b commit 65bd8ce

File tree

5 files changed

+25
-164
lines changed

5 files changed

+25
-164
lines changed

services/task/task.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -311,17 +311,6 @@ def update_commit(self, commitid, repoid):
311311
kwargs=dict(commitid=commitid, repoid=repoid),
312312
).apply_async()
313313

314-
def create_report_results(self, commitid, repoid, report_code, current_yaml=None):
315-
self._create_signature(
316-
"app.tasks.reports.save_report_results",
317-
kwargs=dict(
318-
commitid=commitid,
319-
repoid=repoid,
320-
report_code=report_code,
321-
current_yaml=current_yaml,
322-
),
323-
).apply_async()
324-
325314
def http_request(self, url, method="POST", headers=None, data=None, timeout=None):
326315
self._create_signature(
327316
"app.tasks.http_request.HTTPRequest",

upload/serializers.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from codecov_auth.models import Owner
99
from core.models import Commit, Repository
10-
from reports.models import CommitReport, ReportResults, ReportSession, RepositoryFlag
10+
from reports.models import CommitReport, ReportSession, RepositoryFlag
1111
from services.task import TaskService
1212

1313

@@ -178,18 +178,3 @@ def create(self, validated_data: Dict[str, Any]) -> tuple[CommitReport, bool]:
178178
report.save()
179179
return report, False
180180
return super().create(validated_data), True
181-
182-
183-
class ReportResultsSerializer(serializers.ModelSerializer):
184-
report = CommitReportSerializer(read_only=True)
185-
186-
class Meta:
187-
model = ReportResults
188-
read_only_fields = (
189-
"external_id",
190-
"report",
191-
"state",
192-
"result",
193-
"completed_at",
194-
)
195-
fields = read_only_fields

upload/tests/test_serializers.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
from billing.helpers import mock_all_plans_and_tiers
1010
from reports.tests.factories import (
1111
CommitReportFactory,
12-
ReportResultsFactory,
1312
RepositoryFlagFactory,
1413
UploadFactory,
1514
)
1615
from upload.serializers import (
1716
CommitReportSerializer,
1817
CommitSerializer,
19-
ReportResultsSerializer,
2018
UploadSerializer,
2119
)
2220

@@ -237,23 +235,3 @@ def test_commit_report_serializer(transactional_db, mocker):
237235
"code": report.code,
238236
}
239237
assert serializer.data == expected_data
240-
241-
242-
def test_report_results_serializer(transactional_db, mocker):
243-
report_result = ReportResultsFactory.create()
244-
serializer = ReportResultsSerializer(report_result)
245-
expected_data = {
246-
"external_id": str(report_result.external_id),
247-
"report": {
248-
"external_id": str(report_result.report.external_id),
249-
"created_at": report_result.report.created_at.strftime(
250-
"%Y-%m-%dT%H:%M:%S.%fZ"
251-
),
252-
"commit_sha": report_result.report.commit.commitid,
253-
"code": report_result.report.code,
254-
},
255-
"state": report_result.state,
256-
"result": report_result.result,
257-
"completed_at": report_result.completed_at,
258-
}
259-
assert serializer.data == expected_data

upload/tests/views/test_reports.py

Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from reports.models import CommitReport, ReportResults
1414
from reports.tests.factories import ReportResultsFactory
1515
from services.task.task import TaskService
16+
from upload.views.reports import EMPTY_RESPONSE
1617
from upload.views.uploads import CanDoCoverageUploadsPermission
1718

1819

@@ -336,7 +337,6 @@ def test_reports_post_code_as_default(client, db, mocker):
336337

337338

338339
def test_reports_results_post_successful(client, db, mocker):
339-
mocked_task = mocker.patch("services.task.TaskService.create_report_results")
340340
mocker.patch.object(
341341
CanDoCoverageUploadsPermission, "has_permission", return_value=True
342342
)
@@ -362,19 +362,13 @@ def test_reports_results_post_successful(client, db, mocker):
362362
== f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports/code/results"
363363
)
364364
assert response.status_code == 201
365-
assert ReportResults.objects.filter(
366-
report_id=commit_report.id,
367-
).exists()
368-
mocked_task.assert_called_once()
369365

370366

371367
@patch("upload.helpers.jwt.decode")
372368
@patch("upload.helpers.PyJWKClient")
373369
def test_reports_results_post_successful_github_oidc_auth(
374370
mock_jwks_client, mock_jwt_decode, client, db, mocker
375371
):
376-
mocked_task = mocker.patch("services.task.TaskService.create_report_results")
377-
mock_prometheus_metrics = mocker.patch("upload.metrics.API_UPLOAD_COUNTER.labels")
378372
mocker.patch.object(
379373
CanDoCoverageUploadsPermission, "has_permission", return_value=True
380374
)
@@ -410,22 +404,6 @@ def test_reports_results_post_successful_github_oidc_auth(
410404
== f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports/code/results"
411405
)
412406
assert response.status_code == 201
413-
assert ReportResults.objects.filter(
414-
report_id=commit_report.id,
415-
).exists()
416-
mocked_task.assert_called_once()
417-
mock_prometheus_metrics.assert_called_with(
418-
**{
419-
"agent": "cli",
420-
"version": "0.4.7",
421-
"action": "coverage",
422-
"endpoint": "create_report_results",
423-
"repo_visibility": "private",
424-
"is_using_shelter": "no",
425-
"position": "end",
426-
"upload_version": None,
427-
},
428-
)
429407

430408

431409
@pytest.mark.parametrize("private", [False, True])
@@ -449,7 +427,6 @@ def test_reports_results_post_upload_token_required_auth_check(
449427
branch_sent,
450428
upload_token_required_for_public_repos,
451429
):
452-
mocked_task = mocker.patch("services.task.TaskService.create_report_results")
453430
repository = RepositoryFactory(
454431
name="the_repo",
455432
author__username="codecov",
@@ -462,6 +439,7 @@ def test_reports_results_post_upload_token_required_auth_check(
462439
commit.branch = branch
463440
repository.save()
464441
commit.save()
442+
commit_report.save()
465443

466444
client = APIClient()
467445
url = reverse(
@@ -492,20 +470,12 @@ def test_reports_results_post_upload_token_required_auth_check(
492470
or authorized_by_tokenless_auth_class
493471
):
494472
assert response.status_code == 201
495-
assert ReportResults.objects.filter(
496-
report_id=commit_report.id,
497-
).exists()
498-
mocked_task.assert_called_once()
499473
else:
500474
assert response.status_code == 401
501-
assert not ReportResults.objects.filter(
502-
report_id=commit_report.id,
503-
).exists()
504475
assert response.json().get("detail") == "Not valid tokenless upload"
505476

506477

507478
def test_reports_results_already_exists_post_successful(client, db, mocker):
508-
mocked_task = mocker.patch("services.task.TaskService.create_report_results")
509479
mocker.patch.object(
510480
CanDoCoverageUploadsPermission, "has_permission", return_value=True
511481
)
@@ -535,10 +505,6 @@ def test_reports_results_already_exists_post_successful(client, db, mocker):
535505
== f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports/code/results"
536506
)
537507
assert response.status_code == 201
538-
assert ReportResults.objects.filter(
539-
report_id=commit_report.id, state=ReportResults.ReportResultsStates.PENDING
540-
).exists()
541-
mocked_task.assert_called_once()
542508

543509

544510
def test_report_results_get_successful(client, db, mocker):
@@ -568,18 +534,7 @@ def test_report_results_get_successful(client, db, mocker):
568534
== f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports/code/results"
569535
)
570536
assert response.status_code == 200
571-
assert response.json() == {
572-
"external_id": str(commit_report_results.external_id),
573-
"report": {
574-
"external_id": str(commit_report.external_id),
575-
"created_at": commit_report.created_at.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
576-
"commit_sha": commit_report.commit.commitid,
577-
"code": commit_report.code,
578-
},
579-
"state": commit_report_results.state,
580-
"result": {},
581-
"completed_at": None,
582-
}
537+
assert response.json() == EMPTY_RESPONSE
583538

584539

585540
def test_report_results_get_unsuccessful(client, db, mocker):
@@ -605,5 +560,5 @@ def test_report_results_get_unsuccessful(client, db, mocker):
605560
url
606561
== f"/upload/github/codecov::::the_repo/commits/{commit.commitid}/reports/code/results"
607562
)
608-
assert response.status_code == 400
609-
assert response.json() == ["Report Results not found"]
563+
assert response.status_code == 200
564+
assert response.json() == EMPTY_RESPONSE

upload/views/reports.py

Lines changed: 19 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
from typing import Any, Callable
33

44
from django.http import HttpRequest, HttpResponseNotAllowed
5-
from rest_framework.exceptions import ValidationError
6-
from rest_framework.generics import CreateAPIView, ListCreateAPIView, RetrieveAPIView
5+
from rest_framework import status
6+
from rest_framework.generics import ListCreateAPIView
77
from rest_framework.response import Response
8+
from rest_framework.views import APIView
89
from shared.metrics import inc_counter
910

1011
from codecov_auth.authentication.repo_auth import (
@@ -17,14 +18,14 @@
1718
repo_auth_custom_exception_handler,
1819
)
1920
from core.models import Commit, Repository
20-
from reports.models import CommitReport, ReportResults
21+
from reports.models import CommitReport
2122
from services.task import TaskService
2223
from upload.helpers import (
2324
generate_upload_prometheus_metrics_labels,
2425
validate_activated_repo,
2526
)
2627
from upload.metrics import API_UPLOAD_COUNTER
27-
from upload.serializers import CommitReportSerializer, ReportResultsSerializer
28+
from upload.serializers import CommitReportSerializer
2829
from upload.views.base import GetterMixin
2930
from upload.views.uploads import CanDoCoverageUploadsPermission
3031

@@ -102,12 +103,16 @@ def list(
102103
return HttpResponseNotAllowed(permitted_methods=["POST"])
103104

104105

105-
class ReportResultsView(
106-
CreateAPIView,
107-
RetrieveAPIView,
108-
GetterMixin,
109-
):
110-
serializer_class = ReportResultsSerializer
106+
EMPTY_RESPONSE = {
107+
"state": "completed",
108+
"result": {
109+
"state": "deprecated",
110+
"message": 'The "local upload" functionality has been deprecated.',
111+
},
112+
}
113+
114+
115+
class ReportResultsView(APIView):
111116
permission_classes = [CanDoCoverageUploadsPermission]
112117
authentication_classes = [
113118
UploadTokenRequiredAuthenticationCheck,
@@ -121,59 +126,8 @@ class ReportResultsView(
121126
def get_exception_handler(self) -> Callable[[Exception, dict[str, Any]], Response]:
122127
return repo_auth_custom_exception_handler
123128

124-
def perform_create(self, serializer: ReportResultsSerializer) -> ReportResults:
125-
inc_counter(
126-
API_UPLOAD_COUNTER,
127-
labels=generate_upload_prometheus_metrics_labels(
128-
action="coverage",
129-
endpoint="create_report_results",
130-
request=self.request,
131-
is_shelter_request=self.is_shelter_request(),
132-
position="start",
133-
),
134-
)
135-
repository = self.get_repo()
136-
commit = self.get_commit(repository)
137-
report = self.get_report(commit)
138-
instance = ReportResults.objects.filter(report=report).first()
139-
if not instance:
140-
instance = serializer.save(
141-
report=report, state=ReportResults.ReportResultsStates.PENDING
142-
)
143-
else:
144-
instance.state = ReportResults.ReportResultsStates.PENDING
145-
instance.save()
146-
TaskService().create_report_results(
147-
commitid=commit.commitid,
148-
repoid=repository.repoid,
149-
report_code=report.code,
150-
)
151-
inc_counter(
152-
API_UPLOAD_COUNTER,
153-
labels=generate_upload_prometheus_metrics_labels(
154-
action="coverage",
155-
endpoint="create_report_results",
156-
request=self.request,
157-
repository=repository,
158-
is_shelter_request=self.is_shelter_request(),
159-
position="end",
160-
),
161-
)
162-
return instance
129+
def get(self, request, *args, **kwargs):
130+
return Response(EMPTY_RESPONSE)
163131

164-
def get_object(self) -> ReportResults:
165-
repository = self.get_repo()
166-
commit = self.get_commit(repository)
167-
report = self.get_report(commit)
168-
try:
169-
report_results = ReportResults.objects.get(report=report)
170-
except ReportResults.DoesNotExist:
171-
log.info(
172-
"Report Results not found",
173-
extra=dict(
174-
commit_sha=commit.commitid,
175-
report_code=self.kwargs.get("report_code"),
176-
),
177-
)
178-
raise ValidationError("Report Results not found")
179-
return report_results
132+
def post(self, request, *args, **kwargs):
133+
return Response(EMPTY_RESPONSE, status=status.HTTP_201_CREATED)

0 commit comments

Comments
 (0)