From 9d4cd67e4fa5603c9b65f85f92015833f0aad9f3 Mon Sep 17 00:00:00 2001 From: Laura Barcziova Date: Fri, 1 Mar 2024 11:23:23 +0100 Subject: [PATCH] Don't overwrite final state of Copr build In case the end was already processed, only set the start time and do not overwrite the end status and do not report this to user. Fixes #2252 --- packit_service/models.py | 4 ++ packit_service/worker/handlers/copr.py | 13 +++++- tests/integration/test_listen_to_fedmsg.py | 54 ++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/packit_service/models.py b/packit_service/models.py index 0199b692a..a812a98b4 100644 --- a/packit_service/models.py +++ b/packit_service/models.py @@ -1610,6 +1610,10 @@ class BuildStatus(str, enum.Enum): waiting_for_srpm = "waiting_for_srpm" retry = "retry" + @staticmethod + def is_final_state(status: "BuildStatus"): + return status in {BuildStatus.success, BuildStatus.failure, BuildStatus.error} + class CoprBuildTargetModel(GroupAndTargetModelConnector, Base): """ diff --git a/packit_service/worker/handlers/copr.py b/packit_service/worker/handlers/copr.py index 02b148e09..018330382 100644 --- a/packit_service/worker/handlers/copr.py +++ b/packit_service/worker/handlers/copr.py @@ -175,10 +175,21 @@ def run(self): return TaskResults(success=False, details={"msg": msg}) if self.build.build_start_time is not None: - logger.debug( + msg = ( f"Copr build start for {self.copr_event.build_id} is already" f" processed." ) + logger.debug(msg) + return TaskResults(success=True, details={"msg": msg}) + + if BuildStatus.is_final_state(self.build.status): + msg = ( + "Copr build start is being processed, but the DB build " + "is already in the final state, setting only start time." + ) + logger.debug(msg) + self.set_start_time() + return TaskResults(success=True, details={"msg": msg}) self.set_logs_url() diff --git a/tests/integration/test_listen_to_fedmsg.py b/tests/integration/test_listen_to_fedmsg.py index ac7e69b85..f834a2677 100644 --- a/tests/integration/test_listen_to_fedmsg.py +++ b/tests/integration/test_listen_to_fedmsg.py @@ -2231,6 +2231,60 @@ def test_copr_build_start(copr_build_start, pc_build_pr, copr_build_pr): ) +def test_copr_build_start_already_ended(copr_build_start, pc_build_pr, copr_build_pr): + copr_build_pr.status = BuildStatus.failure + flexmock(GithubProject).should_receive("is_private").and_return(False) + flexmock(GithubProject).should_receive("get_pr").and_return( + flexmock(source_project=flexmock()) + ) + flexmock(AbstractCoprBuildEvent).should_receive("get_packages_config").and_return( + pc_build_pr + ) + flexmock(CoprHelper).should_receive("get_copr_client").and_return( + Client(config={"username": "packit", "copr_url": "https://dummy.url"}) + ) + flexmock(CoprBuildJobHelper).should_receive("get_build_check").and_return( + EXPECTED_BUILD_CHECK_NAME + ) + + flexmock(CoprBuildTargetModel).should_receive("get_by_build_id").and_return( + copr_build_pr + ) + url = get_copr_build_info_url(1) + flexmock(requests).should_receive("get").and_return(requests.Response()) + flexmock(requests.Response).should_receive("raise_for_status").and_return(None) + + copr_build_pr.should_receive("set_start_time").once() + copr_build_pr.should_call("set_status").with_args(BuildStatus.pending).never() + copr_build_pr.should_receive("get_package_name").and_return(None) + + # check that the outdated status was not reported + flexmock(StatusReporter).should_receive("report").with_args( + state=BaseCommitStatus.running, + description="RPM build is in progress...", + url=url, + check_names=EXPECTED_BUILD_CHECK_NAME, + markdown_content=None, + links_to_external_services=None, + update_feedback_time=object, + ).never() + + flexmock(Signature).should_receive("apply_async").once() + flexmock(Pushgateway).should_receive("push").times(2).and_return() + + processing_results = SteveJobs().process_message(copr_build_start) + event_dict, job, job_config, package_config = get_parameters_from_results( + processing_results + ) + assert json.dumps(event_dict) + + run_copr_build_start_handler( + package_config=package_config, + event=event_dict, + job_config=job_config, + ) + + def test_copr_build_not_comment_on_success(copr_build_end, pc_build_pr, copr_build_pr): flexmock(GithubProject).should_receive("is_private").and_return(False) flexmock(GithubProject).should_receive("get_pr").and_return(