Skip to content

Commit

Permalink
feat: adjust for tokenless v3
Browse files Browse the repository at this point in the history
we are no longer sending the X-Tokenless-PR header and we are changing
the format of the contents of the X-Tokenless header

Signed-off-by: joseph-sentry <joseph.sawaya@sentry.io>
  • Loading branch information
joseph-sentry committed May 6, 2024
1 parent 88b7c71 commit 627866b
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 79 deletions.
11 changes: 0 additions & 11 deletions codecov_cli/commands/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,6 @@
@click.option(
"--code", help="The code of the report. If unsure, leave default", default="default"
)
@click.option(
"-P",
"--pr",
"--pull-request-number",
"pull_request_number",
help="Specify the pull request number mannually. Used to override pre-existing CI environment variables",
cls=CodecovOption,
fallback_field=FallbackFieldEnum.pull_request_number,
)
@global_options
@click.pass_context
def create_report(
Expand All @@ -32,7 +23,6 @@ def create_report(
git_service: str,
token: str,
fail_on_error: bool,
pull_request_number: int,
):
enterprise_url = ctx.obj.get("enterprise_url")
logger.debug(
Expand All @@ -55,7 +45,6 @@ def create_report(
git_service,
token,
enterprise_url,
pull_request_number,
fail_on_error,
)
if not res.error:
Expand Down
10 changes: 10 additions & 0 deletions codecov_cli/helpers/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from codecov_cli import __version__
from codecov_cli.types import RequestError, RequestResult
import os

logger = logging.getLogger("codecovcli")

Expand Down Expand Up @@ -95,6 +96,15 @@ def get_token_header_or_fail(token: str) -> dict:
return {"Authorization": f"token {token}"}


def get_auth_header(token):
tokenless = os.environ.get("TOKENLESS", None)
if tokenless:
headers = {"X-Tokenless": tokenless}
else:
headers = get_token_header_or_fail(token)
return headers


@retry_request
def send_put_request(
url: str,
Expand Down
16 changes: 4 additions & 12 deletions codecov_cli/services/commit/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import logging
import typing
import os

from codecov_cli.helpers.config import CODECOV_API_URL
from codecov_cli.helpers.encoder import decode_slug, encode_slug
from codecov_cli.helpers.git import get_pull, is_fork_pr
from codecov_cli.helpers.encoder import encode_slug
from codecov_cli.helpers.request import (
get_token_header_or_fail,
get_auth_header,
log_warnings_and_errors_if_any,
send_post_request,
)
Expand Down Expand Up @@ -43,15 +43,7 @@ def create_commit_logic(
def send_commit_data(
commit_sha, parent_sha, pr, branch, slug, token, service, enterprise_url
):
decoded_slug = decode_slug(slug)
pull_dict = get_pull(service, decoded_slug, pr) if not token else None
if is_fork_pr(pull_dict):
headers = {"X-Tokenless": pull_dict["head"]["slug"], "X-Tokenless-PR": pr}
branch = pull_dict["head"]["slug"] + ":" + branch
logger.info("The PR is happening in a forked repo. Using tokenless upload.")
else:
headers = get_token_header_or_fail(token)

headers = get_auth_header(token)
data = {
"commitid": commit_sha,
"parent_commit_id": parent_sha,
Expand Down
17 changes: 3 additions & 14 deletions codecov_cli/services/report/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from codecov_cli.helpers.encoder import decode_slug, encode_slug
from codecov_cli.helpers.git import get_pull, is_fork_pr
from codecov_cli.helpers.request import (
get_auth_header,
get_token_header_or_fail,
log_warnings_and_errors_if_any,
request_result,
Expand All @@ -26,7 +27,6 @@ def create_report_logic(
service: str,
token: str,
enterprise_url: str,
pull_request_number: int,
fail_on_error: bool = False,
):
encoded_slug = encode_slug(slug)
Expand All @@ -37,27 +37,16 @@ def create_report_logic(
token,
encoded_slug,
enterprise_url,
pull_request_number,
)
log_warnings_and_errors_if_any(sending_result, "Report creating", fail_on_error)
return sending_result


def send_create_report_request(
commit_sha, code, service, token, encoded_slug, enterprise_url, pull_request_number
commit_sha, code, service, token, encoded_slug, enterprise_url
):
data = {"code": code}
decoded_slug = decode_slug(encoded_slug)
pull_dict = (
get_pull(service, decoded_slug, pull_request_number) if not token else None
)
if is_fork_pr(pull_dict):
headers = {
"X-Tokenless": pull_dict["head"]["slug"],
"X-Tokenless-PR": pull_request_number,
}
else:
headers = get_token_header_or_fail(token)
headers = get_auth_header(token)
upload_url = enterprise_url or CODECOV_API_URL
url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports"
return send_post_request(url=url, headers=headers, data=data)
Expand Down
16 changes: 2 additions & 14 deletions codecov_cli/services/upload/upload_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from codecov_cli.helpers.encoder import encode_slug
from codecov_cli.helpers.git import get_pull, is_fork_pr
from codecov_cli.helpers.request import (
get_token_header_or_fail,
get_auth_header,
send_post_request,
send_put_request,
)
Expand Down Expand Up @@ -54,18 +54,7 @@ def send_upload_data(
"ci_service": ci_service,
}

# Data to upload to Codecov
pull_dict = (
get_pull(git_service, slug, pull_request_number) if not token else None
)

if is_fork_pr(pull_dict):
headers = {
"X-Tokenless": pull_dict["head"]["slug"],
"X-Tokenless-PR": pull_request_number,
}
else:
headers = get_token_header_or_fail(token)
headers = get_auth_header(token)
encoded_slug = encode_slug(slug)
upload_url = enterprise_url or CODECOV_API_URL
url, data = self.get_url_and_possibly_update_data(
Expand Down Expand Up @@ -100,7 +89,6 @@ def send_upload_data(
extra=dict(extra_log_attributes=dict(response=resp_json_obj)),
)
put_url = resp_json_obj["raw_upload_location"]
logger.debug("Sending upload to storage")
resp_from_storage = send_put_request(put_url, data=reports_payload)
return resp_from_storage

Expand Down
12 changes: 3 additions & 9 deletions tests/helpers/test_upload_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import pytest
import responses
from responses import matchers
import os

from codecov_cli import __version__ as codecov_cli_version
from codecov_cli.helpers.encoder import encode_slug
Expand Down Expand Up @@ -231,19 +232,13 @@ def test_upload_sender_post_called_with_right_parameters_tokenless(
mocked_storage_server,
mocker,
):
headers = {"X-Tokenless": "user-forked/repo", "X-Tokenless-PR": "pr"}
mock_get_pull = mocker.patch(
"codecov_cli.services.upload.upload_sender.get_pull",
return_value={
"head": {"slug": "user-forked/repo"},
"base": {"slug": "org/repo"},
},
)
headers = {"X-Tokenless": "user:branch"}
mocked_legacy_upload_endpoint.match = [
matchers.json_params_matcher(request_data),
matchers.header_matcher(headers),
]

os.environ["TOKENLESS"] = "user:branch"
sending_result = UploadSender().send_upload_data(
upload_collection, random_sha, None, **named_upload_data
)
Expand All @@ -263,7 +258,6 @@ def test_upload_sender_post_called_with_right_parameters_tokenless(
assert (
post_req_made.headers.items() >= headers.items()
) # test dict is a subset of the other
mock_get_pull.assert_called()

def test_upload_sender_put_called_with_right_parameters(
self, mocked_responses, mocked_legacy_upload_endpoint, mocked_storage_server
Expand Down
7 changes: 5 additions & 2 deletions tests/services/commit/test_commit_service.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import json
import os
import uuid

import requests
Expand Down Expand Up @@ -177,6 +178,8 @@ def mock_request(*args, headers={}, **kwargs):
"get",
side_effect=mock_request,
)

os.environ["TOKENLESS"] = "user:branch"
res = send_commit_data(
"commit_sha",
"parent_sha",
Expand All @@ -193,7 +196,7 @@ def mock_request(*args, headers={}, **kwargs):
"commitid": "commit_sha",
"parent_commit_id": "parent_sha",
"pullid": "1",
"branch": "user_forked_repo/codecov-cli:branch",
"branch": "branch",
},
headers={"X-Tokenless": "user_forked_repo/codecov-cli", "X-Tokenless-PR": "1"},
headers={"X-Tokenless": "user:branch"},
)
27 changes: 10 additions & 17 deletions tests/services/report/test_report_service.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import os
import uuid


from click.testing import CliRunner

from codecov_cli.services.report import create_report_logic, send_create_report_request
Expand All @@ -19,14 +21,13 @@ def test_send_create_report_request_200(mocker):
uuid.uuid4(),
"owner::::repo",
"enterprise_url",
1,
)
assert res.error is None
assert res.warnings == []
mocked_response.assert_called_once()


def test_send_create_report_request_200_tokneless(mocker):
def test_send_create_report_request_200_tokenless(mocker):
mocked_response = mocker.patch(
"codecov_cli.services.report.send_post_request",
return_value=RequestResult(
Expand All @@ -37,30 +38,24 @@ def test_send_create_report_request_200_tokneless(mocker):
),
)

mocked_get_pull = mocker.patch(
"codecov_cli.services.report.get_pull",
return_value={
"head": {"slug": "user-forked/repo"},
"base": {"slug": "org/repo"},
},
)
os.environ["TOKENLESS"] = "user:branch"
res = send_create_report_request(
"commit_sha",
"code",
"github",
None,
"owner::::repo",
"enterprise_url",
1,
)
assert res.error is None
assert res.warnings == []
mocked_response.assert_called_with(
url=f"enterprise_url/upload/github/owner::::repo/commits/commit_sha/reports",
headers={"X-Tokenless": "user-forked/repo", "X-Tokenless-PR": 1},
headers={
"X-Tokenless": "user:branch",
},
data={"code": "code"},
)
mocked_get_pull.assert_called()


def test_send_create_report_request_403(mocker):
Expand All @@ -69,7 +64,7 @@ def test_send_create_report_request_403(mocker):
return_value=mocker.MagicMock(status_code=403, text="Permission denied"),
)
res = send_create_report_request(
"commit_sha", "code", "github", uuid.uuid4(), "owner::::repo", None, 1
"commit_sha", "code", "github", uuid.uuid4(), "owner::::repo", None
)
assert res.error == RequestError(
code="HTTP Error 403",
Expand Down Expand Up @@ -98,7 +93,6 @@ def test_create_report_command_with_warnings(mocker):
service="github",
token="token",
enterprise_url=None,
pull_request_number=1,
)

out_bytes = parse_outstreams_into_log_lines(outstreams[0].getvalue())
Expand All @@ -114,7 +108,7 @@ def test_create_report_command_with_warnings(mocker):
text="",
)
mocked_send_request.assert_called_with(
"commit_sha", "code", "github", "token", "owner::::repo", None, 1
"commit_sha", "code", "github", "token", "owner::::repo", None
)


Expand All @@ -140,7 +134,6 @@ def test_create_report_command_with_error(mocker):
slug="owner/repo",
service="github",
token="token",
pull_request_number=1,
enterprise_url="enterprise_url",
)

Expand All @@ -160,5 +153,5 @@ def test_create_report_command_with_error(mocker):
warnings=[],
)
mock_send_report_data.assert_called_with(
"commit_sha", "code", "github", "token", "owner::::repo", "enterprise_url", 1
"commit_sha", "code", "github", "token", "owner::::repo", "enterprise_url"
)

0 comments on commit 627866b

Please sign in to comment.