From d6abb299445fee35eff17002eca7f71388e45e01 Mon Sep 17 00:00:00 2001 From: Jiri Popelka Date: Fri, 6 May 2022 18:54:08 +0200 Subject: [PATCH] Parse also Gitlab-MR-closed event I need this for hardly, where we want to react when a source-git MR gets closed. https://github.com/packit/hardly/pull/62 --- packit_service/worker/events/enums.py | 7 +- packit_service/worker/handlers/copr.py | 8 + packit_service/worker/handlers/koji.py | 8 + .../worker/handlers/testing_farm.py | 8 + packit_service/worker/parser.py | 2 +- tests/data/webhooks/gitlab/mr_closed.json | 143 ++++++++++++++++++ tests/unit/test_events.py | 10 ++ 7 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 tests/data/webhooks/gitlab/mr_closed.json diff --git a/packit_service/worker/events/enums.py b/packit_service/worker/events/enums.py index 10197c15f5..5d1fd95f5c 100644 --- a/packit_service/worker/events/enums.py +++ b/packit_service/worker/events/enums.py @@ -11,9 +11,10 @@ class PullRequestAction(Enum): class GitlabEventAction(Enum): - opened = "opened" - reopen = "reopen" - update = "update" + opened = "opened" # from state + closed = "closed" # from state + reopen = "reopen" # from action + update = "update" # from action class PullRequestCommentAction(Enum): diff --git a/packit_service/worker/handlers/copr.py b/packit_service/worker/handlers/copr.py index e4b53aa1e1..a1c5debdcc 100644 --- a/packit_service/worker/handlers/copr.py +++ b/packit_service/worker/handlers/copr.py @@ -44,6 +44,7 @@ ) from packit_service.service.urls import get_copr_build_info_url, get_srpm_build_info_url from packit_service.utils import dump_job_config, dump_package_config +from packit_service.worker.events.enums import GitlabEventAction from packit_service.worker.helpers.build import CoprBuildJobHelper from packit_service.worker.handlers.abstract import ( JobHandler, @@ -137,6 +138,13 @@ def run(self) -> TaskResults: return self.copr_build_helper.run_copr_build() def pre_check(self) -> bool: + if ( + self.data.event_type == MergeRequestGitlabEvent.__name__ + and self.data.action == GitlabEventAction.closed.value + ): + # Not interested in closed merge requests + return False + if self.data.event_type in ( PushGitHubEvent.__name__, PushGitlabEvent.__name__, diff --git a/packit_service/worker/handlers/koji.py b/packit_service/worker/handlers/koji.py index 6774c54ff6..4362586931 100644 --- a/packit_service/worker/handlers/koji.py +++ b/packit_service/worker/handlers/koji.py @@ -25,6 +25,7 @@ from packit_service.service.urls import ( get_koji_build_info_url, ) +from packit_service.worker.events.enums import GitlabEventAction from packit_service.worker.helpers.build.koji_build import KojiBuildJobHelper from packit_service.worker.events import ( CheckRerunCommitEvent, @@ -104,6 +105,13 @@ def run(self) -> TaskResults: return self.koji_build_helper.run_koji_build() def pre_check(self) -> bool: + if ( + self.data.event_type == MergeRequestGitlabEvent.__name__ + and self.data.action == GitlabEventAction.closed.value + ): + # Not interested in closed merge requests + return False + if self.data.event_type in ( PushGitHubEvent.__name__, PushGitlabEvent.__name__, diff --git a/packit_service/worker/handlers/testing_farm.py b/packit_service/worker/handlers/testing_farm.py index 9ce888da55..faefc8ec3e 100644 --- a/packit_service/worker/handlers/testing_farm.py +++ b/packit_service/worker/handlers/testing_farm.py @@ -36,6 +36,7 @@ get_testing_farm_info_url, get_copr_build_info_url, ) +from packit_service.worker.events.enums import GitlabEventAction from packit_service.worker.handlers import JobHandler from packit_service.worker.handlers.abstract import ( TaskName, @@ -119,6 +120,13 @@ def check_if_actor_can_run_job_and_report(self, actor: str) -> bool: return True def pre_check(self) -> bool: + if ( + self.data.event_type == MergeRequestGitlabEvent.__name__ + and self.data.action == GitlabEventAction.closed.value + ): + # Not interested in closed merge requests + return False + return not ( self.testing_farm_job_helper.skip_build and self.is_copr_build_comment_event() diff --git a/packit_service/worker/parser.py b/packit_service/worker/parser.py index aecdb614bf..5af0c235e1 100644 --- a/packit_service/worker/parser.py +++ b/packit_service/worker/parser.py @@ -151,7 +151,7 @@ def parse_mr_event(event) -> Optional[MergeRequestGitlabEvent]: return None state = event["object_attributes"]["state"] - if state != "opened": + if state not in {"opened", "closed"}: return None action = nested_get(event, "object_attributes", "action") if action not in {"reopen", "update"}: diff --git a/tests/data/webhooks/gitlab/mr_closed.json b/tests/data/webhooks/gitlab/mr_closed.json new file mode 100644 index 0000000000..ba5b6301d7 --- /dev/null +++ b/tests/data/webhooks/gitlab/mr_closed.json @@ -0,0 +1,143 @@ +{ + "object_kind": "merge_request", + "event_type": "merge_request", + "user": { + "id": 2952463, + "name": "Jiri Popelka", + "username": "jpopelka", + "avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/2952463/avatar.png", + "email": "[REDACTED]" + }, + "project": { + "id": 19258958, + "name": "hello-world", + "description": "The most progressive command-line tool in the world.", + "web_url": "https://gitlab.com/packit-service/hello-world", + "avatar_url": null, + "git_ssh_url": "git@gitlab.com:packit-service/hello-world.git", + "git_http_url": "https://gitlab.com/packit-service/hello-world.git", + "namespace": "packit-service", + "visibility_level": 20, + "path_with_namespace": "packit-service/hello-world", + "default_branch": "master", + "ci_config_path": "", + "homepage": "https://gitlab.com/packit-service/hello-world", + "url": "git@gitlab.com:packit-service/hello-world.git", + "ssh_url": "git@gitlab.com:packit-service/hello-world.git", + "http_url": "https://gitlab.com/packit-service/hello-world.git" + }, + "object_attributes": { + "assignee_id": 2952463, + "author_id": 2952463, + "created_at": "2022-05-06 15:08:42 UTC", + "description": "", + "head_pipeline_id": null, + "id": 153884270, + "iid": 19, + "last_edited_at": null, + "last_edited_by_id": null, + "merge_commit_sha": null, + "merge_error": null, + "merge_params": { + "force_remove_source_branch": "1" + }, + "merge_status": "can_be_merged", + "merge_user_id": null, + "merge_when_pipeline_succeeds": false, + "milestone_id": null, + "source_branch": "innocent-change", + "source_project_id": 35945041, + "state_id": 2, + "target_branch": "master", + "target_project_id": 19258958, + "time_estimate": 0, + "title": "ja nic, to samo", + "updated_at": "2022-05-06 15:11:26 UTC", + "updated_by_id": null, + "url": "https://gitlab.com/packit-service/hello-world/-/merge_requests/19", + "source": { + "id": 35945041, + "name": "hello-world", + "description": "The most progressive command-line tool in the world.", + "web_url": "https://gitlab.com/jpopelka/hello-world", + "avatar_url": null, + "git_ssh_url": "git@gitlab.com:jpopelka/hello-world.git", + "git_http_url": "https://gitlab.com/jpopelka/hello-world.git", + "namespace": "Jiri Popelka", + "visibility_level": 20, + "path_with_namespace": "jpopelka/hello-world", + "default_branch": "master", + "ci_config_path": "", + "homepage": "https://gitlab.com/jpopelka/hello-world", + "url": "git@gitlab.com:jpopelka/hello-world.git", + "ssh_url": "git@gitlab.com:jpopelka/hello-world.git", + "http_url": "https://gitlab.com/jpopelka/hello-world.git" + }, + "target": { + "id": 19258958, + "name": "hello-world", + "description": "The most progressive command-line tool in the world.", + "web_url": "https://gitlab.com/packit-service/hello-world", + "avatar_url": null, + "git_ssh_url": "git@gitlab.com:packit-service/hello-world.git", + "git_http_url": "https://gitlab.com/packit-service/hello-world.git", + "namespace": "packit-service", + "visibility_level": 20, + "path_with_namespace": "packit-service/hello-world", + "default_branch": "master", + "ci_config_path": "", + "homepage": "https://gitlab.com/packit-service/hello-world", + "url": "git@gitlab.com:packit-service/hello-world.git", + "ssh_url": "git@gitlab.com:packit-service/hello-world.git", + "http_url": "https://gitlab.com/packit-service/hello-world.git" + }, + "last_commit": { + "id": "769beb0807cf0bafeb3357e787f8c2f8fd3ea42b", + "message": "the best improvement ever seen to mankind\n", + "title": "the best improvement ever seen to mankind", + "timestamp": "2022-05-06T17:06:07+02:00", + "url": "https://gitlab.com/packit-service/hello-world/-/commit/769beb0807cf0bafeb3357e787f8c2f8fd3ea42b", + "author": { + "name": "Jiri Popelka", + "email": "jpopelka@redhat.com" + } + }, + "work_in_progress": false, + "total_time_spent": 0, + "time_change": 0, + "human_total_time_spent": null, + "human_time_change": null, + "human_time_estimate": null, + "assignee_ids": [2952463], + "labels": [], + "state": "closed", + "blocking_discussions_resolved": true, + "action": "close" + }, + "labels": [], + "changes": { + "state_id": { + "previous": 1, + "current": 2 + }, + "updated_at": { + "previous": "2022-05-06 15:08:42 UTC", + "current": "2022-05-06 15:11:26 UTC" + } + }, + "repository": { + "name": "hello-world", + "url": "git@gitlab.com:packit-service/hello-world.git", + "description": "The most progressive command-line tool in the world.", + "homepage": "https://gitlab.com/packit-service/hello-world" + }, + "assignees": [ + { + "id": 2952463, + "name": "Jiri Popelka", + "username": "jpopelka", + "avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/2952463/avatar.png", + "email": "[REDACTED]" + } + ] +} diff --git a/tests/unit/test_events.py b/tests/unit/test_events.py index 749e50da3e..2c3d5877c4 100644 --- a/tests/unit/test_events.py +++ b/tests/unit/test_events.py @@ -136,6 +136,11 @@ def merge_request_update(self): with open(DATA_DIR / "webhooks" / "gitlab" / "mr_update_event.json") as outfile: return json.load(outfile) + @pytest.fixture() + def merge_request_closed(self): + with open(DATA_DIR / "webhooks" / "gitlab" / "mr_closed.json") as outfile: + return json.load(outfile) + @pytest.fixture() def github_pr_comment_empty(self): with open( @@ -334,6 +339,11 @@ def test_parse_mr_action(self, merge_request_update): ).once() assert event_object.package_config + def test_parse_mr_closed(self, merge_request_closed): + event_object = Parser.parse_event(merge_request_closed) + assert isinstance(event_object, MergeRequestGitlabEvent) + assert event_object.action == GitlabEventAction.closed + def test_parse_pr(self, github_pr_webhook): event_object = Parser.parse_event(github_pr_webhook)