Skip to content

Commit

Permalink
Don't overwrite final state of Copr build
Browse files Browse the repository at this point in the history
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 packit#2252
  • Loading branch information
lbarcziova committed Mar 1, 2024
1 parent 1ed0574 commit 9d4cd67
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 1 deletion.
4 changes: 4 additions & 0 deletions packit_service/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down
13 changes: 12 additions & 1 deletion packit_service/worker/handlers/copr.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
54 changes: 54 additions & 0 deletions tests/integration/test_listen_to_fedmsg.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit 9d4cd67

Please sign in to comment.