From 6adbc63a6c9e34fe2df9d947d44f906532d437ca Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 4 Mar 2026 12:18:11 +0100 Subject: [PATCH 1/8] Remove hardcoded list of supported Fedora CI tests --- packit_service/utils.py | 3 ++- packit_service/worker/jobs.py | 12 ++++++++++-- tests/integration/test_pr_comment.py | 4 ++++ tests/unit/conftest.py | 20 ++++---------------- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/packit_service/utils.py b/packit_service/utils.py index 61be2883d..0467e9ce5 100644 --- a/packit_service/utils.py +++ b/packit_service/utils.py @@ -335,6 +335,7 @@ def get_comment_parser_fedora_ci( prog: Optional[str] = None, description: Optional[str] = None, epilog: Optional[str] = None, + supported_test_types: list[str] = [], ) -> argparse.ArgumentParser: parser = _create_base_parser(prog, description, epilog) @@ -351,7 +352,7 @@ def get_comment_parser_fedora_ci( test_parser.add_argument( "test_identifier", nargs="?", - choices=["installability", "rpmlint", "rpminspect", "custom"], + choices=supported_test_types, help="specific type of tests to run", ) diff --git a/packit_service/worker/jobs.py b/packit_service/worker/jobs.py index 537282db5..95ba5694a 100644 --- a/packit_service/worker/jobs.py +++ b/packit_service/worker/jobs.py @@ -90,7 +90,10 @@ from packit_service.worker.helpers.sync_release.propose_downstream import ( ProposeDownstreamJobHelper, ) -from packit_service.worker.helpers.testing_farm import TestingFarmJobHelper +from packit_service.worker.helpers.testing_farm import ( + DownstreamTestingFarmJobHelper, + TestingFarmJobHelper, +) from packit_service.worker.monitoring import Pushgateway from packit_service.worker.parser import Parser from packit_service.worker.reporting import BaseCommitStatus @@ -265,7 +268,12 @@ def parse_comment( return ParsedComment() if comment.startswith("/packit-ci"): - parser = get_comment_parser_fedora_ci() + supported_test_types = DownstreamTestingFarmJobHelper.get_fedora_ci_tests( + self.service_config, + self.event.project, + EventData.from_event_dict(self.event.get_dict()), + ) + parser = get_comment_parser_fedora_ci(supported_test_types=supported_test_types) else: parser = get_comment_parser() diff --git a/tests/integration/test_pr_comment.py b/tests/integration/test_pr_comment.py index 3598daced..9a3dbff11 100644 --- a/tests/integration/test_pr_comment.py +++ b/tests/integration/test_pr_comment.py @@ -2691,6 +2691,10 @@ def test_downstream_koji_scratch_build_retrigger_via_dist_git_pr_comment( (123, "koji-web-url") ).once() + flexmock(DownstreamTestingFarmJobHelper).should_receive("get_fedora_ci_tests").and_return( + ["installability", "rpmlint", "rpminspect", "custom"] + ) + processing_results = SteveJobs().process_message(pagure_pr_comment_added) event_dict, _, job_config, package_config = get_parameters_from_results( processing_results, diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 9585c185a..82e1d91cf 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -9,12 +9,6 @@ from packit.config.aliases import Distro from packit.config.job_config import JobConfigTriggerType, JobType -from packit_service.constants import ( - HELP_COMMENT_DESCRIPTION, - HELP_COMMENT_EPILOG, - HELP_COMMENT_PROG, - HELP_COMMENT_PROG_FEDORA_CI, -) from packit_service.events.logdetective import Result as LogDetectiveResultEvent from packit_service.models import ( LogDetectiveRunModel, @@ -27,20 +21,14 @@ @pytest.fixture(scope="module") def comment_parser() -> argparse.ArgumentParser: - return get_comment_parser( - prog=HELP_COMMENT_PROG, - description=HELP_COMMENT_DESCRIPTION, - epilog=HELP_COMMENT_EPILOG, - ) + return get_comment_parser() @pytest.fixture(scope="module") def comment_parser_fedora_ci() -> argparse.ArgumentParser: - return get_comment_parser_fedora_ci( - prog=HELP_COMMENT_PROG_FEDORA_CI, - description=HELP_COMMENT_DESCRIPTION, - epilog=HELP_COMMENT_EPILOG, - ) + supported_test_types = ["installability", "rpmlint", "rpminspect", "custom"] + + return get_comment_parser_fedora_ci(supported_test_types=supported_test_types) @pytest.fixture() From e000ad7ff540c3123df7eab160aadda4f0d1d62c Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Tue, 17 Mar 2026 15:45:48 +0100 Subject: [PATCH 2/8] Consider the context when determining available test types It is now taken into consideration that in the "tests" namespace only the `custom` check should be available. When no fmf metadata is available, no test types are supported in the "tests" namespace. The method `get_fedora_ci_tests_available_in_context` retrieves a list of supported test types based on these restrictions. The previously used `get_fedora_ci_tests` method cannot be used for this purpose as it filters out test types based on the user's comment content. In case of the `/packit help` comment, this would lead to all test types being filtered out and the help message wouldn't list any supported test types. --- packit_service/utils.py | 2 +- packit_service/worker/helpers/testing_farm.py | 49 +++++++++++++++++-- packit_service/worker/jobs.py | 10 ++-- tests/integration/test_pr_comment.py | 3 ++ 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/packit_service/utils.py b/packit_service/utils.py index 0467e9ce5..6e27eea8d 100644 --- a/packit_service/utils.py +++ b/packit_service/utils.py @@ -335,7 +335,7 @@ def get_comment_parser_fedora_ci( prog: Optional[str] = None, description: Optional[str] = None, epilog: Optional[str] = None, - supported_test_types: list[str] = [], + supported_test_types: Optional[list[str]] = None, ) -> argparse.ArgumentParser: parser = _create_base_parser(prog, description, epilog) diff --git a/packit_service/worker/helpers/testing_farm.py b/packit_service/worker/helpers/testing_farm.py index ba537d60a..15ca2348f 100644 --- a/packit_service/worker/helpers/testing_farm.py +++ b/packit_service/worker/helpers/testing_farm.py @@ -1330,6 +1330,30 @@ def get_fedora_ci_tests( return [commands[1]] return all_tests + @staticmethod + def get_fedora_ci_tests_available_in_context( + service_config: ServiceConfig, project: GitProject, metadata: EventData + ) -> list[str]: + """ + Gets Fedora CI tests registered using the `@implements_fedora_ci_test()` decorator, + which are relevant in the context of the given project. If in the "tests" namespace + and fmf metadata is defined, then only the `custom` test type is available. If no fmf + metadata is defined inside the "tests" namespace, no tests are available. + + Args: + service_config: Service config. + project: Git project. + metadata: Event metadata. + + Returns: + List of registered Fedora CI test names available in the context of the project. + """ + return [ + name + for name, (_, skipif) in FEDORA_CI_TESTS.items() + if not skipif or not skipif(service_config, project, metadata) + ] + @property def api_url(self) -> str: return ( @@ -1447,7 +1471,12 @@ def prepare_and_send_tf_request( response=response, ) - @implements_fedora_ci_test("installability") + @implements_fedora_ci_test( + "installability", + skipif=lambda _, project, __: DownstreamTestingFarmJobHelper.is_project_in_tests_namespace( + project + ), + ) def _payload_installability(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/fedora-ci/installability-pipeline.git" git_ref = ( @@ -1494,7 +1523,12 @@ def _payload_installability(self, distro: str, compose: str) -> dict: }, } - @implements_fedora_ci_test("rpminspect") + @implements_fedora_ci_test( + "rpminspect", + skipif=lambda _, project, __: DownstreamTestingFarmJobHelper.is_project_in_tests_namespace( + project + ), + ) def _payload_rpminspect(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/fedora-ci/rpminspect-pipeline.git" git_ref = "master" @@ -1509,7 +1543,12 @@ def _payload_rpminspect(self, distro: str, compose: str) -> dict: } return payload - @implements_fedora_ci_test("rpmlint") + @implements_fedora_ci_test( + "rpmlint", + skipif=lambda _, project, __: DownstreamTestingFarmJobHelper.is_project_in_tests_namespace( + project + ), + ) def _payload_rpmlint(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/packit/tmt-plans.git" git_ref = "main" @@ -1536,6 +1575,10 @@ def is_fmf_configured(project: GitProject, metadata: EventData) -> bool: return False return True + @staticmethod + def is_project_in_tests_namespace(project: GitProject) -> bool: + return project.namespace == "tests" + @implements_fedora_ci_test( "custom", skipif=lambda _, project, metadata: not DownstreamTestingFarmJobHelper.is_fmf_configured( diff --git a/packit_service/worker/jobs.py b/packit_service/worker/jobs.py index 95ba5694a..0132cf5ae 100644 --- a/packit_service/worker/jobs.py +++ b/packit_service/worker/jobs.py @@ -268,10 +268,12 @@ def parse_comment( return ParsedComment() if comment.startswith("/packit-ci"): - supported_test_types = DownstreamTestingFarmJobHelper.get_fedora_ci_tests( - self.service_config, - self.event.project, - EventData.from_event_dict(self.event.get_dict()), + supported_test_types = ( + DownstreamTestingFarmJobHelper.get_fedora_ci_tests_available_in_context( + self.service_config, + self.event.project, + EventData.from_event_dict(self.event.get_dict()), + ) ) parser = get_comment_parser_fedora_ci(supported_test_types=supported_test_types) else: diff --git a/tests/integration/test_pr_comment.py b/tests/integration/test_pr_comment.py index 9a3dbff11..befacf384 100644 --- a/tests/integration/test_pr_comment.py +++ b/tests/integration/test_pr_comment.py @@ -2603,6 +2603,9 @@ def test_downstream_koji_scratch_build_retrigger_via_dist_git_pr_comment( .should_receive("get_web_url") .and_return("https://src.fedoraproject.org/rpms/python-teamcity-messages") .mock() + .should_receive("get_file_content") + .and_raise(FileNotFoundError) + .mock() ) service_config = ( flexmock( From 4f81f5d003bc212b4123599d78f9e8eefbb9287f Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 25 Mar 2026 10:28:49 +0100 Subject: [PATCH 3/8] Reuse and modify `get_fedora_ci_tests()` The method has been modified with an additional parameter, which specifies whether to retrieve all Fedora CI test types regardless of the content of user's comment. --- packit_service/worker/helpers/testing_farm.py | 31 +++---------------- packit_service/worker/jobs.py | 11 +++---- 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/packit_service/worker/helpers/testing_farm.py b/packit_service/worker/helpers/testing_farm.py index 15ca2348f..78d055c72 100644 --- a/packit_service/worker/helpers/testing_farm.py +++ b/packit_service/worker/helpers/testing_farm.py @@ -1291,7 +1291,10 @@ def koji_helper(self): @staticmethod def get_fedora_ci_tests( - service_config: ServiceConfig, project: GitProject, metadata: EventData + service_config: ServiceConfig, + project: GitProject, + metadata: EventData, + get_all: Optional[bool] = False, ) -> list[str]: """ Gets relevant Fedora CI tests registered using the `@implements_fedora_ci_test()` decorator. @@ -1312,7 +1315,7 @@ def get_fedora_ci_tests( for name, (_, skipif) in FEDORA_CI_TESTS.items() if not skipif or not skipif(service_config, project, metadata) ] - if metadata.event_type != pagure.pr.Comment.event_type(): + if metadata.event_type != pagure.pr.Comment.event_type() or get_all: return all_tests # TODO: remove this once Fedora CI has its own instances and comment_command_prefixes # comment_command_prefixes for Fedora CI are /packit-ci and /packit-ci-stg @@ -1330,30 +1333,6 @@ def get_fedora_ci_tests( return [commands[1]] return all_tests - @staticmethod - def get_fedora_ci_tests_available_in_context( - service_config: ServiceConfig, project: GitProject, metadata: EventData - ) -> list[str]: - """ - Gets Fedora CI tests registered using the `@implements_fedora_ci_test()` decorator, - which are relevant in the context of the given project. If in the "tests" namespace - and fmf metadata is defined, then only the `custom` test type is available. If no fmf - metadata is defined inside the "tests" namespace, no tests are available. - - Args: - service_config: Service config. - project: Git project. - metadata: Event metadata. - - Returns: - List of registered Fedora CI test names available in the context of the project. - """ - return [ - name - for name, (_, skipif) in FEDORA_CI_TESTS.items() - if not skipif or not skipif(service_config, project, metadata) - ] - @property def api_url(self) -> str: return ( diff --git a/packit_service/worker/jobs.py b/packit_service/worker/jobs.py index 0132cf5ae..87dadb797 100644 --- a/packit_service/worker/jobs.py +++ b/packit_service/worker/jobs.py @@ -268,12 +268,11 @@ def parse_comment( return ParsedComment() if comment.startswith("/packit-ci"): - supported_test_types = ( - DownstreamTestingFarmJobHelper.get_fedora_ci_tests_available_in_context( - self.service_config, - self.event.project, - EventData.from_event_dict(self.event.get_dict()), - ) + supported_test_types = DownstreamTestingFarmJobHelper.get_fedora_ci_tests( + self.service_config, + self.event.project, + EventData.from_event_dict(self.event.get_dict()), + True, ) parser = get_comment_parser_fedora_ci(supported_test_types=supported_test_types) else: From bcd095add6e63988cad4c39d789e89a629833edc Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 25 Mar 2026 11:22:08 +0100 Subject: [PATCH 4/8] Remove the `filter_ci_tests()` method due to redundancy The `filter_ci_tests()` was rendered redundant with the recently added `skipif` option used in some `@implements_fedora_ci` decorators, which implements the same filtering of CI tests. --- .../worker/handlers/testing_farm.py | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/packit_service/worker/handlers/testing_farm.py b/packit_service/worker/handlers/testing_farm.py index 3b18eda42..a6dc693c1 100644 --- a/packit_service/worker/handlers/testing_farm.py +++ b/packit_service/worker/handlers/testing_farm.py @@ -400,20 +400,14 @@ def get_checkers() -> tuple[type[Checker], ...]: PermissionOnDistgitForFedoraCI, ) - @classmethod - def filter_ci_tests(cls, tests: list[str]) -> list[str]: - return tests - @classmethod def get_all_check_names( cls, service_config: ServiceConfig, project: GitProject, metadata: EventData ) -> list[str]: return [ DownstreamTestingFarmJobHelper.get_check_name_from_config(t, service_config) - for t in cls.filter_ci_tests( - DownstreamTestingFarmJobHelper.get_fedora_ci_tests( - service_config, project, metadata - ) + for t in DownstreamTestingFarmJobHelper.get_fedora_ci_tests( + service_config, project, metadata ) ] @@ -493,10 +487,8 @@ def run_for_fedora_ci_test( def _run(self) -> TaskResults: failed: dict[str, str] = {} - fedora_ci_tests = self.filter_ci_tests( - self.downstream_testing_farm_job_helper.get_fedora_ci_tests( - self.service_config, self.project, self.data - ) + fedora_ci_tests = self.downstream_testing_farm_job_helper.get_fedora_ci_tests( + self.service_config, self.project, self.data ) if not fedora_ci_tests: @@ -562,10 +554,6 @@ def get_checkers() -> tuple[type[Checker], ...]: PermissionOnDistgitForFedoraCI, ) - @classmethod - def filter_ci_tests(cls, tests: list[str]) -> list[str]: - return [t for t in tests if t == "custom"] - @configured_as(job_type=JobType.tests) @reacts_to(event=testing_farm.Result) From e2ebb1f6263f84130ab49e3a1f0e491d28d60768 Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 25 Mar 2026 11:38:18 +0100 Subject: [PATCH 5/8] Move checks outside `DownstreamTestingFarmJobHelper` This improves the readability of some `@implements_fedora_ci` decorators. The `is_fmf_configured` method in `TestingFarmJobHelper` now reuses the `is_fmf_configured` function to reduce code duplication. --- packit_service/worker/helpers/testing_farm.py | 55 +++++++------------ 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/packit_service/worker/helpers/testing_farm.py b/packit_service/worker/helpers/testing_farm.py index 78d055c72..4c1896c9c 100644 --- a/packit_service/worker/helpers/testing_farm.py +++ b/packit_service/worker/helpers/testing_farm.py @@ -51,6 +51,21 @@ logger = logging.getLogger(__name__) +def is_fmf_configured(project: GitProject, metadata: EventData) -> bool: + try: + project.get_file_content( + path=".fmf/version", + ref=metadata.commit_sha, + ) + except FileNotFoundError: + return False + return True + + +def is_project_in_tests_namespace(project: GitProject) -> bool: + return project.namespace == "tests" + + class CommentArguments: """ Parse arguments from trigger comment and provide the attributes to Testing Farm helper. @@ -667,14 +682,7 @@ def is_fmf_configured(self) -> bool: if self.custom_fmf: return True - try: - self.project.get_file_content( - path=f"{self.fmf_path}/.fmf/version", - ref=self.metadata.commit_sha, - ) - return True - except FileNotFoundError: - return False + return is_fmf_configured(self.project, self.metadata) def report_missing_build_chroot(self, chroot: str): self.report_status_to_tests_for_chroot( @@ -1452,9 +1460,7 @@ def prepare_and_send_tf_request( @implements_fedora_ci_test( "installability", - skipif=lambda _, project, __: DownstreamTestingFarmJobHelper.is_project_in_tests_namespace( - project - ), + skipif=lambda _, project, __: is_project_in_tests_namespace(project), ) def _payload_installability(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/fedora-ci/installability-pipeline.git" @@ -1504,9 +1510,7 @@ def _payload_installability(self, distro: str, compose: str) -> dict: @implements_fedora_ci_test( "rpminspect", - skipif=lambda _, project, __: DownstreamTestingFarmJobHelper.is_project_in_tests_namespace( - project - ), + skipif=lambda _, project, __: is_project_in_tests_namespace(project), ) def _payload_rpminspect(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/fedora-ci/rpminspect-pipeline.git" @@ -1524,9 +1528,7 @@ def _payload_rpminspect(self, distro: str, compose: str) -> dict: @implements_fedora_ci_test( "rpmlint", - skipif=lambda _, project, __: DownstreamTestingFarmJobHelper.is_project_in_tests_namespace( - project - ), + skipif=lambda _, project, __: is_project_in_tests_namespace(project), ) def _payload_rpmlint(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/packit/tmt-plans.git" @@ -1543,26 +1545,9 @@ def _payload_rpmlint(self, distro: str, compose: str) -> dict: } return payload - @staticmethod - def is_fmf_configured(project: GitProject, metadata: EventData) -> bool: - try: - project.get_file_content( - path=".fmf/version", - ref=metadata.commit_sha, - ) - except FileNotFoundError: - return False - return True - - @staticmethod - def is_project_in_tests_namespace(project: GitProject) -> bool: - return project.namespace == "tests" - @implements_fedora_ci_test( "custom", - skipif=lambda _, project, metadata: not DownstreamTestingFarmJobHelper.is_fmf_configured( - project, metadata - ), + skipif=lambda _, project, metadata: not is_fmf_configured(project, metadata), ) def _payload_custom(self, distro: str, compose: str) -> dict: payload = self._get_tf_base_payload(distro, compose) From 357ce97626df41e79bc4abe1dd60f637af4d4aed Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 25 Mar 2026 12:42:12 +0100 Subject: [PATCH 6/8] Rename ambiguous parameter and list it in docstring --- packit_service/worker/helpers/testing_farm.py | 5 +++-- packit_service/worker/jobs.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packit_service/worker/helpers/testing_farm.py b/packit_service/worker/helpers/testing_farm.py index 4c1896c9c..6241dfadb 100644 --- a/packit_service/worker/helpers/testing_farm.py +++ b/packit_service/worker/helpers/testing_farm.py @@ -1302,7 +1302,7 @@ def get_fedora_ci_tests( service_config: ServiceConfig, project: GitProject, metadata: EventData, - get_all: Optional[bool] = False, + filter_specific_test: bool = True, ) -> list[str]: """ Gets relevant Fedora CI tests registered using the `@implements_fedora_ci_test()` decorator. @@ -1314,6 +1314,7 @@ def get_fedora_ci_tests( service_config: Service config. project: Git project. metadata: Event metadata. + filter_specific_test: Whether to filter tests based on the command in user's comment. Returns: List of registered Fedora CI test names. @@ -1323,7 +1324,7 @@ def get_fedora_ci_tests( for name, (_, skipif) in FEDORA_CI_TESTS.items() if not skipif or not skipif(service_config, project, metadata) ] - if metadata.event_type != pagure.pr.Comment.event_type() or get_all: + if metadata.event_type != pagure.pr.Comment.event_type() or not filter_specific_test: return all_tests # TODO: remove this once Fedora CI has its own instances and comment_command_prefixes # comment_command_prefixes for Fedora CI are /packit-ci and /packit-ci-stg diff --git a/packit_service/worker/jobs.py b/packit_service/worker/jobs.py index 87dadb797..30b8d5332 100644 --- a/packit_service/worker/jobs.py +++ b/packit_service/worker/jobs.py @@ -272,7 +272,7 @@ def parse_comment( self.service_config, self.event.project, EventData.from_event_dict(self.event.get_dict()), - True, + filter_specific_test=False, ) parser = get_comment_parser_fedora_ci(supported_test_types=supported_test_types) else: From 0339e2e3e28036f1d7718ebeec519cc6dd2a9fc7 Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 1 Apr 2026 12:38:33 +0200 Subject: [PATCH 7/8] Turn existing functions into two new Checker sub-classes The two functions `is_project_in_tests_namespace` and `is_fmf_configured` have been removed and replaced with two new checkers `IsFMFConfigMissing` and `IsProjectInTestsNamespace` in order to improve consistency of the code. Additionally, the `@implements_fedora_ci_test` decorator no longer expects a single optional callable `skipif`. Instead, it is possible to specify a list of Checkers, making it possible to specify multiple "skipif" conditions. Changes have been made to the `mixin.py` in order to resolve the circular dependency created because of the aforementioned changes. --- packit_service/worker/checker/testing_farm.py | 28 +++++++++++ packit_service/worker/handlers/mixin.py | 28 +++++++---- packit_service/worker/helpers/testing_farm.py | 50 ++++++++++--------- 3 files changed, 71 insertions(+), 35 deletions(-) diff --git a/packit_service/worker/checker/testing_farm.py b/packit_service/worker/checker/testing_farm.py index ede0e11b1..4601b9582 100644 --- a/packit_service/worker/checker/testing_farm.py +++ b/packit_service/worker/checker/testing_farm.py @@ -328,3 +328,31 @@ def pre_check(self) -> bool: return False return True + + +class IsFMFConfigMissing(_TestingFarmTestTypeChecker): + """ + Check whether FMF configuration is missing in the given project. + """ + + def pre_check(self) -> bool: + try: + commit_sha = self.data.event_dict.get("commit_sha") + + self.project.get_file_content( + path=".fmf/version", + ref=commit_sha, + ) + except FileNotFoundError: + logger.debug("FMF configuration not found in repository.") + return True + return False + + +class IsProjectInTestsNamespace(_TestingFarmTestTypeChecker): + """ + Check whether the current project is located inside the tests namespace. + """ + + def pre_check(self) -> bool: + return self.project.namespace == "tests" diff --git a/packit_service/worker/handlers/mixin.py b/packit_service/worker/handlers/mixin.py index 33dae1044..ed650f4c8 100644 --- a/packit_service/worker/handlers/mixin.py +++ b/packit_service/worker/handlers/mixin.py @@ -5,7 +5,7 @@ from abc import abstractmethod from collections.abc import Iterator from dataclasses import dataclass -from typing import Any, Optional, Protocol, Union +from typing import TYPE_CHECKING, Any, Optional, Protocol, Union from packit.config import JobConfig, PackageConfig from packit.exceptions import PackitException @@ -35,13 +35,15 @@ from packit_service.worker.helpers.build.copr_build import CoprBuildJobHelper from packit_service.worker.helpers.build.koji_build import KojiBuildJobHelper from packit_service.worker.helpers.sidetag import Sidetag, SidetagHelper -from packit_service.worker.helpers.testing_farm import ( - DownstreamTestingFarmJobHelper, - TestingFarmJobHelper, -) from packit_service.worker.mixin import Config, ConfigFromEventMixin, GetBranches from packit_service.worker.monitoring import Pushgateway +if TYPE_CHECKING: + from packit_service.worker.helpers.testing_farm import ( + DownstreamTestingFarmJobHelper, + TestingFarmJobHelper, + ) + logger = logging.getLogger(__name__) @@ -615,7 +617,7 @@ class GetTestingFarmJobHelper(Protocol): @property @abstractmethod - def testing_farm_job_helper(self) -> TestingFarmJobHelper: ... + def testing_farm_job_helper(self) -> "TestingFarmJobHelper": ... class GetTestingFarmJobHelperMixin( @@ -623,11 +625,13 @@ class GetTestingFarmJobHelperMixin( GetCoprBuildMixin, ConfigFromEventMixin, ): - _testing_farm_job_helper: Optional[TestingFarmJobHelper] = None + _testing_farm_job_helper: Optional["TestingFarmJobHelper"] = None @property - def testing_farm_job_helper(self) -> TestingFarmJobHelper: + def testing_farm_job_helper(self) -> "TestingFarmJobHelper": if not self._testing_farm_job_helper: + from packit_service.worker.helpers.testing_farm import TestingFarmJobHelper + self._testing_farm_job_helper = TestingFarmJobHelper( service_config=self.service_config, package_config=self.package_config, @@ -647,7 +651,7 @@ class GetDownstreamTestingFarmJobHelper(Protocol): @property @abstractmethod - def downstream_testing_farm_job_helper(self) -> DownstreamTestingFarmJobHelper: ... + def downstream_testing_farm_job_helper(self) -> "DownstreamTestingFarmJobHelper": ... class GetDownstreamTestingFarmJobHelperMixin( @@ -655,11 +659,13 @@ class GetDownstreamTestingFarmJobHelperMixin( GetKojiBuildFromTaskOrPullRequestMixin, ConfigFromEventMixin, ): - _downstream_testing_farm_job_helper: Optional[DownstreamTestingFarmJobHelper] = None + _downstream_testing_farm_job_helper: Optional["DownstreamTestingFarmJobHelper"] = None @property - def downstream_testing_farm_job_helper(self) -> DownstreamTestingFarmJobHelper: + def downstream_testing_farm_job_helper(self) -> "DownstreamTestingFarmJobHelper": if not self._downstream_testing_farm_job_helper: + from packit_service.worker.helpers.testing_farm import DownstreamTestingFarmJobHelper + self._downstream_testing_farm_job_helper = DownstreamTestingFarmJobHelper( service_config=self.service_config, project=self.project, diff --git a/packit_service/worker/helpers/testing_farm.py b/packit_service/worker/helpers/testing_farm.py index 6241dfadb..3dccce81b 100644 --- a/packit_service/worker/helpers/testing_farm.py +++ b/packit_service/worker/helpers/testing_farm.py @@ -41,6 +41,11 @@ from packit_service.service.urls import get_testing_farm_info_url from packit_service.utils import get_package_nvrs, get_packit_commands_from_comment from packit_service.worker.celery_task import CeleryTask +from packit_service.worker.checker.abstract import Checker +from packit_service.worker.checker.testing_farm import ( + IsFMFConfigMissing, + IsProjectInTestsNamespace, +) from packit_service.worker.handlers.abstract import FedoraCIJobHandler from packit_service.worker.helpers.build import CoprBuildJobHelper from packit_service.worker.helpers.fedora_ci import FedoraCIHelper @@ -51,21 +56,6 @@ logger = logging.getLogger(__name__) -def is_fmf_configured(project: GitProject, metadata: EventData) -> bool: - try: - project.get_file_content( - path=".fmf/version", - ref=metadata.commit_sha, - ) - except FileNotFoundError: - return False - return True - - -def is_project_in_tests_namespace(project: GitProject) -> bool: - return project.namespace == "tests" - - class CommentArguments: """ Parse arguments from trigger comment and provide the attributes to Testing Farm helper. @@ -682,7 +672,9 @@ def is_fmf_configured(self) -> bool: if self.custom_fmf: return True - return is_fmf_configured(self.project, self.metadata) + return not IsFMFConfigMissing( + package_config=None, job_config=None, event=self.metadata.event_dict, task_name=None + ).pre_check() def report_missing_build_chroot(self, chroot: str): self.report_status_to_tests_for_chroot( @@ -1263,9 +1255,11 @@ def cancel_running_tests(self): FEDORA_CI_TESTS = {} -def implements_fedora_ci_test(test_name: str, skipif: Optional[Callable] = None) -> Callable: +def implements_fedora_ci_test( + test_name: str, checkers: Optional[list[type[Checker]]] = None +) -> Callable: def _update_mapping(function: Callable) -> Callable: - FEDORA_CI_TESTS[test_name] = (function, skipif) + FEDORA_CI_TESTS[test_name] = (function, checkers) return function return _update_mapping @@ -1321,8 +1315,16 @@ def get_fedora_ci_tests( """ all_tests = [ name - for name, (_, skipif) in FEDORA_CI_TESTS.items() - if not skipif or not skipif(service_config, project, metadata) + for name, (_, checkers) in FEDORA_CI_TESTS.items() + if not any( + checker( + package_config=None, + job_config=None, + event=metadata.event_dict, + task_name=None, + ).pre_check() + for checker in checkers + ) ] if metadata.event_type != pagure.pr.Comment.event_type() or not filter_specific_test: return all_tests @@ -1461,7 +1463,7 @@ def prepare_and_send_tf_request( @implements_fedora_ci_test( "installability", - skipif=lambda _, project, __: is_project_in_tests_namespace(project), + checkers=[IsProjectInTestsNamespace], ) def _payload_installability(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/fedora-ci/installability-pipeline.git" @@ -1511,7 +1513,7 @@ def _payload_installability(self, distro: str, compose: str) -> dict: @implements_fedora_ci_test( "rpminspect", - skipif=lambda _, project, __: is_project_in_tests_namespace(project), + checkers=[IsProjectInTestsNamespace], ) def _payload_rpminspect(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/fedora-ci/rpminspect-pipeline.git" @@ -1529,7 +1531,7 @@ def _payload_rpminspect(self, distro: str, compose: str) -> dict: @implements_fedora_ci_test( "rpmlint", - skipif=lambda _, project, __: is_project_in_tests_namespace(project), + checkers=[IsProjectInTestsNamespace], ) def _payload_rpmlint(self, distro: str, compose: str) -> dict: git_repo = "https://github.com/packit/tmt-plans.git" @@ -1548,7 +1550,7 @@ def _payload_rpmlint(self, distro: str, compose: str) -> dict: @implements_fedora_ci_test( "custom", - skipif=lambda _, project, metadata: not is_fmf_configured(project, metadata), + checkers=[IsFMFConfigMissing], ) def _payload_custom(self, distro: str, compose: str) -> dict: payload = self._get_tf_base_payload(distro, compose) From 4eaefe7bb7558dfe8519328b0a4f9b5ff8e2014a Mon Sep 17 00:00:00 2001 From: Alzbeta Kucerova Date: Wed, 1 Apr 2026 12:56:42 +0200 Subject: [PATCH 8/8] Move filtering of Fedora CI tests to a dedicated function --- packit_service/worker/helpers/testing_farm.py | 43 +++++++++++-------- packit_service/worker/jobs.py | 2 +- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packit_service/worker/helpers/testing_farm.py b/packit_service/worker/helpers/testing_farm.py index 3dccce81b..1fc3a98e4 100644 --- a/packit_service/worker/helpers/testing_farm.py +++ b/packit_service/worker/helpers/testing_farm.py @@ -1296,7 +1296,7 @@ def get_fedora_ci_tests( service_config: ServiceConfig, project: GitProject, metadata: EventData, - filter_specific_test: bool = True, + filter_specific_tests: bool = True, ) -> list[str]: """ Gets relevant Fedora CI tests registered using the `@implements_fedora_ci_test()` decorator. @@ -1308,11 +1308,31 @@ def get_fedora_ci_tests( service_config: Service config. project: Git project. metadata: Event metadata. - filter_specific_test: Whether to filter tests based on the command in user's comment. + filter_specific_tests: Whether to filter tests based on the command in user's comment. Returns: List of registered Fedora CI test names. """ + + def filter_tests(tests): + if metadata.event_type != pagure.pr.Comment.event_type(): + return tests + # TODO: remove this once Fedora CI has its own instances and comment_command_prefixes + # comment_command_prefixes for Fedora CI are /packit-ci and /packit-ci-stg + comment_command_prefix = ( + "/packit-ci-stg" + if service_config.comment_command_prefix.endswith("-stg") + else "/packit-ci" + ) + commands = get_packit_commands_from_comment( + metadata.event_dict.get("comment"), comment_command_prefix + ) + if not commands: + return [] + if len(commands) > 1 and commands[1] in tests: + return [commands[1]] + return tests + all_tests = [ name for name, (_, checkers) in FEDORA_CI_TESTS.items() @@ -1326,22 +1346,9 @@ def get_fedora_ci_tests( for checker in checkers ) ] - if metadata.event_type != pagure.pr.Comment.event_type() or not filter_specific_test: - return all_tests - # TODO: remove this once Fedora CI has its own instances and comment_command_prefixes - # comment_command_prefixes for Fedora CI are /packit-ci and /packit-ci-stg - comment_command_prefix = ( - "/packit-ci-stg" - if service_config.comment_command_prefix.endswith("-stg") - else "/packit-ci" - ) - commands = get_packit_commands_from_comment( - metadata.event_dict.get("comment"), comment_command_prefix - ) - if not commands: - return [] - if len(commands) > 1 and commands[1] in all_tests: - return [commands[1]] + + if filter_specific_tests: + return filter_tests(all_tests) return all_tests @property diff --git a/packit_service/worker/jobs.py b/packit_service/worker/jobs.py index 30b8d5332..cfe41cb2f 100644 --- a/packit_service/worker/jobs.py +++ b/packit_service/worker/jobs.py @@ -272,7 +272,7 @@ def parse_comment( self.service_config, self.event.project, EventData.from_event_dict(self.event.get_dict()), - filter_specific_test=False, + filter_specific_tests=False, ) parser = get_comment_parser_fedora_ci(supported_test_types=supported_test_types) else: