diff --git a/codecov-cli/codecov_cli/commands/upload.py b/codecov-cli/codecov_cli/commands/upload.py index 87380910..d1649b08 100644 --- a/codecov-cli/codecov_cli/commands/upload.py +++ b/codecov-cli/codecov_cli/commands/upload.py @@ -2,18 +2,27 @@ import os import pathlib import typing + import click import sentry_sdk from codecov_cli.fallbacks import CodecovOption, FallbackFieldEnum from codecov_cli.helpers.args import get_cli_args from codecov_cli.helpers.options import global_options +from codecov_cli.helpers.upload_type import ReportType, report_type_from_str from codecov_cli.services.upload import do_upload_logic from codecov_cli.types import CommandContext -from codecov_cli.helpers.upload_type import report_type_from_str, ReportType logger = logging.getLogger("codecovcli") +DEFAULT_URL_PATHS = { + ReportType.COVERAGE: { + "upload_coverage": "/upload/{git_service}/{encoded_slug}/upload-coverage", + "uploads": "/upload/{git_service}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/uploads", + }, + ReportType.TEST_RESULTS: "/upload/test_results/v1", +} + def _turn_env_vars_into_dict(ctx, params, value): return dict((v, os.getenv(v, None)) for v in value) @@ -264,6 +273,8 @@ def do_upload( ci_adapter = ctx.obj.get("ci_adapter") enterprise_url = ctx.obj.get("enterprise_url") args = get_cli_args(ctx) + + url_paths = ctx.obj.get("url_paths", DEFAULT_URL_PATHS) logger.debug( "Starting upload processing", extra=dict( @@ -276,6 +287,7 @@ def do_upload( cli_config, versioning_system, ci_adapter, + url_paths, branch=branch, build_code=build_code, build_url=build_url, diff --git a/codecov-cli/codecov_cli/commands/upload_coverage.py b/codecov-cli/codecov_cli/commands/upload_coverage.py index 4e0defff..7a6081d1 100644 --- a/codecov-cli/codecov_cli/commands/upload_coverage.py +++ b/codecov-cli/codecov_cli/commands/upload_coverage.py @@ -7,11 +7,15 @@ from codecov_cli.commands.commit import create_commit from codecov_cli.commands.report import create_report -from codecov_cli.commands.upload import do_upload, global_upload_options +from codecov_cli.commands.upload import ( + DEFAULT_URL_PATHS, + do_upload, + global_upload_options, +) from codecov_cli.helpers.args import get_cli_args from codecov_cli.helpers.options import global_options +from codecov_cli.helpers.upload_type import ReportType, report_type_from_str from codecov_cli.opentelemetry import close_telem -from codecov_cli.helpers.upload_type import report_type_from_str, ReportType from codecov_cli.services.upload_coverage import upload_coverage_logic from codecov_cli.types import CommandContext @@ -83,11 +87,13 @@ def upload_coverage( ci_adapter = ctx.obj.get("ci_adapter") enterprise_url = ctx.obj.get("enterprise_url") args = get_cli_args(ctx) + url_paths = ctx.obj.get("url_paths", DEFAULT_URL_PATHS) ctx.invoke( upload_coverage_logic, cli_config, versioning_system, ci_adapter, + url_paths=url_paths, branch=branch, build_code=build_code, build_url=build_url, diff --git a/codecov-cli/codecov_cli/services/upload/__init__.py b/codecov-cli/codecov_cli/services/upload/__init__.py index a21a8b56..fb98897c 100644 --- a/codecov-cli/codecov_cli/services/upload/__init__.py +++ b/codecov-cli/codecov_cli/services/upload/__init__.py @@ -7,8 +7,8 @@ from codecov_cli.fallbacks import FallbackFieldEnum from codecov_cli.helpers.ci_adapters.base import CIAdapterBase from codecov_cli.helpers.request import log_warnings_and_errors_if_any -from codecov_cli.helpers.versioning_systems import VersioningSystemInterface from codecov_cli.helpers.upload_type import ReportType +from codecov_cli.helpers.versioning_systems import VersioningSystemInterface from codecov_cli.plugins import select_preparation_plugins from codecov_cli.services.upload.file_finder import select_file_finder from codecov_cli.services.upload.legacy_upload_sender import LegacyUploadSender @@ -25,6 +25,7 @@ def do_upload_logic( cli_config: typing.Dict, versioning_system: VersioningSystemInterface, ci_adapter: CIAdapterBase, + url_paths: typing.Dict, upload_coverage: bool = False, *, args: dict = None, @@ -141,6 +142,7 @@ def do_upload_logic( token=token, env_vars=env_vars, report_code=report_code, + url_paths=url_paths, report_type=report_type, name=name, branch=branch, diff --git a/codecov-cli/codecov_cli/services/upload/upload_sender.py b/codecov-cli/codecov_cli/services/upload/upload_sender.py index 8454fed1..62994db4 100644 --- a/codecov-cli/codecov_cli/services/upload/upload_sender.py +++ b/codecov-cli/codecov_cli/services/upload/upload_sender.py @@ -10,12 +10,12 @@ from codecov_cli import __version__ as codecov_cli_version from codecov_cli.helpers.config import CODECOV_INGEST_URL from codecov_cli.helpers.encoder import encode_slug -from codecov_cli.helpers.upload_type import ReportType from codecov_cli.helpers.request import ( get_token_header, send_post_request, send_put_request, ) +from codecov_cli.helpers.upload_type import ReportType from codecov_cli.types import ( RequestResult, UploadCollectionResult, @@ -33,6 +33,7 @@ def send_upload_data( token: typing.Optional[str], env_vars: typing.Dict[str, str], report_code: str, + url_paths: typing.Dict, report_type: ReportType = ReportType.COVERAGE, name: typing.Optional[str] = None, branch: typing.Optional[str] = None, @@ -90,6 +91,7 @@ def send_upload_data( encoded_slug, commit_sha, report_code, + url_paths, upload_coverage, ) # Data that goes to storage @@ -212,21 +214,31 @@ def get_url_and_possibly_update_data( encoded_slug, commit_sha, report_code, + url_paths: typing.Dict, upload_coverage=False, file_not_found=False, ): if report_type == ReportType.COVERAGE: - base_url = f"{upload_url}/upload/{git_service}/{encoded_slug}" + coverage_paths = url_paths[report_type] if upload_coverage: - url = f"{base_url}/upload-coverage" + path_template = coverage_paths["upload_coverage"] else: - url = f"{base_url}/commits/{commit_sha}/reports/{report_code}/uploads" + path_template = coverage_paths["uploads"] + + url = upload_url + path_template.format( + git_service=git_service, + encoded_slug=encoded_slug, + commit_sha=commit_sha, + report_code=report_code, + ) elif report_type == ReportType.TEST_RESULTS: data["slug"] = encoded_slug data["branch"] = branch data["commit"] = commit_sha data["service"] = git_service data["file_not_found"] = file_not_found - url = f"{upload_url}/upload/test_results/v1" + + path_template = url_paths[report_type] + url = upload_url + path_template return url, data diff --git a/codecov-cli/codecov_cli/services/upload_coverage/__init__.py b/codecov-cli/codecov_cli/services/upload_coverage/__init__.py index 54f62b11..36402e2e 100644 --- a/codecov-cli/codecov_cli/services/upload_coverage/__init__.py +++ b/codecov-cli/codecov_cli/services/upload_coverage/__init__.py @@ -2,15 +2,16 @@ import typing from codecov_cli.helpers.ci_adapters.base import CIAdapterBase +from codecov_cli.helpers.upload_type import ReportType from codecov_cli.helpers.versioning_systems import VersioningSystemInterface from codecov_cli.services.upload import do_upload_logic -from codecov_cli.helpers.upload_type import ReportType def upload_coverage_logic( cli_config: typing.Dict, versioning_system: VersioningSystemInterface, ci_adapter: CIAdapterBase, + url_paths: typing.Dict, *, branch: typing.Optional[str], build_code: typing.Optional[str], @@ -53,6 +54,7 @@ def upload_coverage_logic( cli_config=cli_config, versioning_system=versioning_system, ci_adapter=ci_adapter, + url_paths=url_paths, upload_coverage=True, args=args, branch=branch, diff --git a/codecov-cli/tests/helpers/test_upload_sender.py b/codecov-cli/tests/helpers/test_upload_sender.py index f04eb77a..74b938f4 100644 --- a/codecov-cli/tests/helpers/test_upload_sender.py +++ b/codecov-cli/tests/helpers/test_upload_sender.py @@ -1,22 +1,23 @@ import json import re +from copy import deepcopy from pathlib import Path -from copy import deepcopy import pytest import responses from responses import matchers from codecov_cli import __version__ as codecov_cli_version +from codecov_cli.commands.upload import DEFAULT_URL_PATHS from codecov_cli.helpers.encoder import encode_slug +from codecov_cli.helpers.upload_type import ReportType from codecov_cli.services.upload.upload_sender import UploadSender from codecov_cli.types import ( UploadCollectionResult, - UploadCollectionResultFileFixer, UploadCollectionResultFile, + UploadCollectionResultFileFixer, ) from tests.data import reports_examples -from codecov_cli.helpers.upload_type import ReportType upload_collection = UploadCollectionResult(["1", "apple.py", "3"], [], []) random_token = "f359afb9-8a2a-42ab-a448-c3d267ff495b" @@ -26,6 +27,7 @@ "report_type": ReportType.COVERAGE, "report_code": "report_code", "env_vars": {}, + "url_paths": DEFAULT_URL_PATHS, "name": "name", "branch": "branch", "slug": "org/repo", @@ -41,6 +43,7 @@ "report_type": ReportType.TEST_RESULTS, "report_code": "report_code", "env_vars": {}, + "url_paths": DEFAULT_URL_PATHS, "name": "name", "branch": "branch", "slug": "org/repo", @@ -351,7 +354,10 @@ def test_upload_sender_post_called_with_right_parameters_tokenless( ] sending_result = UploadSender().send_upload_data( - upload_collection, random_sha, None, **named_upload_data + upload_collection, + random_sha, + None, + **named_upload_data, ) assert sending_result.error is None assert sending_result.warnings == [] @@ -374,7 +380,10 @@ def test_upload_sender_put_called_with_right_parameters( self, mocked_responses, mocked_legacy_upload_endpoint, mocked_storage_server ): sending_result = UploadSender().send_upload_data( - upload_collection, random_sha, random_token, **named_upload_data + upload_collection, + random_sha, + random_token, + **named_upload_data, ) assert sending_result.error is None assert sending_result.warnings == [] @@ -388,7 +397,10 @@ def test_upload_sender_result_success( self, mocked_responses, mocked_legacy_upload_endpoint, mocked_storage_server ): sender = UploadSender().send_upload_data( - upload_collection, random_sha, random_token, **named_upload_data + upload_collection, + random_sha, + random_token, + **named_upload_data, ) # default status for both put and post is 200 @@ -402,7 +414,10 @@ def test_upload_sender_result_fail_post_400( mocked_legacy_upload_endpoint.status = 400 sender = UploadSender().send_upload_data( - upload_collection, random_sha, random_token, **named_upload_data + upload_collection, + random_sha, + random_token, + **named_upload_data, ) assert len(mocked_responses.calls) == 1 @@ -439,7 +454,10 @@ def test_upload_sender_result_fail_put_400( mocked_storage_server.status = 400 sender = UploadSender().send_upload_data( - upload_collection, random_sha, random_token, **named_upload_data + upload_collection, + random_sha, + random_token, + **named_upload_data, ) assert len(mocked_responses.calls) == 2 @@ -455,7 +473,10 @@ def test_upload_sender_http_error_with_invalid_sha( mocked_legacy_upload_endpoint.status = 400 sender = UploadSender().send_upload_data( - upload_collection, random_sha, random_token, **named_upload_data + upload_collection, + random_sha, + random_token, + **named_upload_data, ) assert sender.error is not None diff --git a/codecov-cli/tests/services/upload/test_upload_service.py b/codecov-cli/tests/services/upload/test_upload_service.py index 3609a82f..1061a558 100644 --- a/codecov-cli/tests/services/upload/test_upload_service.py +++ b/codecov-cli/tests/services/upload/test_upload_service.py @@ -2,6 +2,7 @@ import pytest from click.testing import CliRunner +from codecov_cli.commands.upload import DEFAULT_URL_PATHS from codecov_cli.helpers.upload_type import ReportType from codecov_cli.services.upload import ( LegacyUploadSender, @@ -48,6 +49,7 @@ def test_do_upload_logic_happy_path_legacy_uploader(mocker): cli_config, versioning_system, ci_adapter, + DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, commit_sha="commit_sha", report_code="report_code", @@ -116,6 +118,7 @@ def test_do_upload_logic_happy_path_legacy_uploader(mocker): token="token", env_vars=None, report_code="report_code", + url_paths=DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, name="name", branch="branch", @@ -165,6 +168,7 @@ def test_do_upload_logic_happy_path(mocker): cli_config, versioning_system, ci_adapter, + DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, commit_sha="commit_sha", report_code="report_code", @@ -231,6 +235,7 @@ def test_do_upload_logic_happy_path(mocker): token="token", env_vars=None, report_code="report_code", + url_paths=DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, name="name", branch="branch", @@ -276,6 +281,7 @@ def test_do_upload_logic_dry_run(mocker): cli_config, versioning_system, ci_adapter, + DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, commit_sha="commit_sha", report_code="report_code", @@ -362,6 +368,7 @@ def test_do_upload_logic_verbose(mocker, use_verbose_option): cli_config, versioning_system, ci_adapter, + DEFAULT_URL_PATHS, branch="branch", build_code="build_code", build_url="build_url", @@ -444,6 +451,7 @@ def side_effect(*args, **kwargs): cli_config, versioning_system, ci_adapter, + DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, commit_sha="commit_sha", report_code="report_code", @@ -550,6 +558,7 @@ def side_effect(*args, **kwargs): cli_config, versioning_system, ci_adapter, + DEFAULT_URL_PATHS, report_type=ReportType.COVERAGE, commit_sha="commit_sha", report_code="report_code", @@ -640,6 +649,7 @@ def test_do_upload_logic_happy_path_test_results(mocker): cli_config, versioning_system, ci_adapter, + url_paths={ReportType.TEST_RESULTS: "upload/test_results/v1"}, args={"args": "fake_args"}, branch="branch", build_code="build_code", @@ -694,6 +704,7 @@ def test_do_upload_logic_happy_path_test_results(mocker): commit_sha="commit_sha", token="token", env_vars=None, + url_paths={ReportType.TEST_RESULTS: "upload/test_results/v1"}, report_code="report_code", report_type=ReportType.TEST_RESULTS, name="name", diff --git a/prevent-cli/src/prevent_cli/main.py b/prevent-cli/src/prevent_cli/main.py index 214c7d13..1243a80c 100644 --- a/prevent-cli/src/prevent_cli/main.py +++ b/prevent-cli/src/prevent_cli/main.py @@ -14,12 +14,13 @@ from codecov_cli.commands.process_test_results import process_test_results from codecov_cli.commands.report import create_report from codecov_cli.commands.send_notifications import send_notifications -from codecov_cli.commands.upload import do_upload +from codecov_cli.commands.upload import DEFAULT_URL_PATHS, do_upload from codecov_cli.commands.upload_coverage import upload_coverage from codecov_cli.commands.upload_process import upload_process from codecov_cli.helpers.ci_adapters import get_ci_adapter, get_ci_providers_list from codecov_cli.helpers.config import load_cli_config from codecov_cli.helpers.logging_utils import configure_logger +from codecov_cli.helpers.upload_type import ReportType from codecov_cli.helpers.versioning_systems import get_versioning_system from codecov_cli.opentelemetry import init_telem @@ -83,6 +84,10 @@ def cli( ctx.obj["disable_telem"] = disable_telem ctx.obj["branding"] = branding + custom_url_paths = deepcopy(DEFAULT_URL_PATHS) + custom_url_paths[ReportType.TEST_RESULTS] = "/upload/test_analytics/v1" + ctx.obj["url_paths"] = custom_url_paths + init_telem(ctx.obj) @@ -100,18 +105,18 @@ def cli( break -cli.add_command(do_upload) -cli.add_command(create_commit) -cli.add_command(create_report) cli.add_command(pr_base_picking) cli.add_command(empty_upload) -cli.add_command(upload_coverage) cli.add_command(upload) -cli.add_command(upload_process) cli.add_command(send_notifications) -cli.add_command(process_test_results) # deprecated commands: +cli.add_command(do_upload) +cli.add_command(create_commit) +cli.add_command(create_report) +cli.add_command(upload_coverage) +cli.add_command(upload_process) +cli.add_command(process_test_results) cli.add_command(create_report_results) cli.add_command(get_report_results)