Skip to content

Commit

Permalink
Make the mapping of handlers to events work and easier to use
Browse files Browse the repository at this point in the history
Signed-off-by: Frantisek Lachman <flachman@redhat.com>
  • Loading branch information
lachmanfrantisek committed Mar 10, 2020
1 parent d9766f3 commit a134fe2
Show file tree
Hide file tree
Showing 10 changed files with 345 additions and 69 deletions.
2 changes: 2 additions & 0 deletions packit_service/service/events.py
Expand Up @@ -87,6 +87,8 @@ class TheJobTriggerType(str, enum.Enum):
testing_farm_results = "testing_farm_results"
pr_comment = "pr_comment"
issue_comment = "issue_comment"
copr_start = "copr_start"
copr_end = "copr_end"


class TestResult(dict):
Expand Down
8 changes: 4 additions & 4 deletions packit_service/trigger_mapping.py
Expand Up @@ -20,20 +20,20 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

from typing import Dict, Optional
from typing import Dict

from packit.config import JobConfigTriggerType, JobConfig, JobType

from packit_service.service.events import TheJobTriggerType

JOB_TRIGGER_TO_CONFIG_MAPPING: Dict[
TheJobTriggerType, Optional[JobConfigTriggerType]
] = {
JOB_TRIGGER_TO_CONFIG_MAPPING: Dict[TheJobTriggerType, JobConfigTriggerType] = {
TheJobTriggerType.commit: JobConfigTriggerType.commit,
TheJobTriggerType.release: JobConfigTriggerType.release,
TheJobTriggerType.pull_request: JobConfigTriggerType.pull_request,
TheJobTriggerType.push: JobConfigTriggerType.commit,
TheJobTriggerType.pr_comment: JobConfigTriggerType.pull_request,
TheJobTriggerType.copr_start: JobConfigTriggerType.pull_request,
TheJobTriggerType.copr_end: JobConfigTriggerType.pull_request,
}


Expand Down
8 changes: 4 additions & 4 deletions packit_service/worker/handlers/__init__.py
Expand Up @@ -45,8 +45,8 @@
GitHubIssueCommentProposeUpdateHandler,
GitHubPullRequestCommentCoprBuildHandler,
GitHubPullRequestCommentTestingFarmHandler,
GithubPullRequestHandler,
GithubReleaseHandler,
PullRequestGithubCheckDownstreamHandler,
ProposeDownstreamHandler,
GithubTestingFarmHandler,
)

Expand All @@ -67,8 +67,8 @@
GitHubIssueCommentProposeUpdateHandler.__name__,
GitHubPullRequestCommentCoprBuildHandler.__name__,
GitHubPullRequestCommentTestingFarmHandler.__name__,
GithubPullRequestHandler.__name__,
GithubReleaseHandler.__name__,
PullRequestGithubCheckDownstreamHandler.__name__,
ProposeDownstreamHandler.__name__,
GithubTestingFarmHandler.__name__,
Handler.__name__,
JobHandler.__name__,
Expand Down
40 changes: 33 additions & 7 deletions packit_service/worker/handlers/abstract.py
Expand Up @@ -25,32 +25,58 @@
"""
import logging
import shutil
from collections import defaultdict
from os import getenv
from pathlib import Path
from typing import Dict, Optional, Type, List
from typing import Dict, Optional, Type, List, Set

from packit.api import PackitAPI
from packit.config import JobConfig, JobType
from packit.local_project import LocalProject

from packit_service.config import ServiceConfig
from packit_service.sentry_integration import push_scope_to_sentry
from packit_service.service.events import Event, TheJobTriggerType
from packit_service.worker.result import HandlerResults
from packit_service.sentry_integration import push_scope_to_sentry

logger = logging.getLogger(__name__)

JOB_NAME_HANDLER_MAPPING: Dict[JobType, Type["JobHandler"]] = {}
JOB_REQUIRED_MAPPING: Dict[JobType, Set[Type["JobHandler"]]] = defaultdict(set)

MAP_EVENT_TRIGGER_TO_HANDLER: Dict[
TheJobTriggerType, Set[Type["JobHandler"]]
] = defaultdict(set)

MAP_HANDLER_TO_JOB_TYPES: Dict[Type["JobHandler"], Set[JobType]] = defaultdict(set)


def add_to_mapping(kls: Type["JobHandler"]):
JOB_NAME_HANDLER_MAPPING[kls.name] = kls
for trigger in kls.triggers:
MAP_EVENT_TRIGGER_TO_HANDLER[trigger].add(kls)
return kls


def add_to_mapping_for_job(job_type: JobType):
def add_alias(job_type: JobType):
def _add_to_mapping(kls: Type["JobHandler"]):
for trigger in kls.triggers:
MAP_EVENT_TRIGGER_TO_HANDLER[trigger].add(kls)
MAP_HANDLER_TO_JOB_TYPES[kls].add(job_type)
return kls

return _add_to_mapping


def required_by(job_type: JobType):
def _add_to_mapping(kls: Type["JobHandler"]):
JOB_REQUIRED_MAPPING[job_type].add(kls)
return kls

return _add_to_mapping


def use_for(job_type: JobType):
def _add_to_mapping(kls: Type["JobHandler"]):
JOB_NAME_HANDLER_MAPPING[job_type] = kls
MAP_HANDLER_TO_JOB_TYPES[kls].add(job_type)
return kls

return _add_to_mapping
Expand Down Expand Up @@ -132,7 +158,7 @@ def clean(self):
class JobHandler(Handler):
""" Generic interface to handle different type of inputs """

name: JobType
type: JobType
triggers: List[TheJobTriggerType]

def __init__(
Expand Down
4 changes: 2 additions & 2 deletions packit_service/worker/handlers/comment_action_handler.py
Expand Up @@ -47,7 +47,7 @@ class CommentAction(enum.Enum):


def add_to_comment_action_mapping(kls: Type["CommentActionHandler"]):
COMMENT_ACTION_HANDLER_MAPPING[kls.name] = kls
COMMENT_ACTION_HANDLER_MAPPING[kls.type] = kls
return kls


Expand All @@ -62,7 +62,7 @@ def add_to_comment_action_mapping_with_name_inner(


class CommentActionHandler(Handler):
name: CommentAction
type: CommentAction

def __init__(
self,
Expand Down
10 changes: 6 additions & 4 deletions packit_service/worker/handlers/fedmsg_handlers.py
Expand Up @@ -51,7 +51,7 @@
from packit_service.service.urls import get_log_url
from packit_service.worker.build.copr_build import CoprBuildJobHelper
from packit_service.worker.copr_db import CoprBuildDB
from packit_service.worker.handlers.abstract import JobHandler
from packit_service.worker.handlers.abstract import JobHandler, use_for
from packit_service.worker.handlers.abstract import add_to_mapping
from packit_service.worker.handlers.github_handlers import GithubTestingFarmHandler
from packit_service.worker.result import HandlerResults
Expand Down Expand Up @@ -123,11 +123,11 @@ def run(self) -> HandlerResults:

@add_topic
@add_to_mapping
@use_for(job_type=JobType.sync_from_downstream)
class NewDistGitCommitHandler(FedmsgHandler):
"""Sync new changes to upstream after a new git push in the dist-git."""

topic = "org.fedoraproject.prod.git.receive"
name = JobType.sync_from_downstream
triggers = [TheJobTriggerType.commit]

def __init__(
Expand Down Expand Up @@ -174,9 +174,10 @@ def run(self) -> HandlerResults:

@add_topic
@add_to_mapping
@use_for(job_type=JobType.copr_build)
class CoprBuildEndHandler(FedmsgHandler):
topic = "org.fedoraproject.prod.copr.build.end"
name = JobType.copr_build_finished
triggers = [TheJobTriggerType.copr_end]

def __init__(
self,
Expand Down Expand Up @@ -302,9 +303,10 @@ def run(self):

@add_topic
@add_to_mapping
@use_for(job_type=JobType.copr_build)
class CoprBuildStartHandler(FedmsgHandler):
topic = "org.fedoraproject.prod.copr.build.start"
name = JobType.copr_build_started
triggers = [TheJobTriggerType.copr_start]

def __init__(
self,
Expand Down
40 changes: 25 additions & 15 deletions packit_service/worker/handlers/github_handlers.py
Expand Up @@ -59,7 +59,9 @@
)
from packit_service.worker.handlers.abstract import (
add_to_mapping,
add_to_mapping_for_job,
required_by,
add_alias,
use_for,
)
from packit_service.worker.handlers.comment_action_handler import (
add_to_comment_action_mapping,
Expand All @@ -78,8 +80,9 @@ class AbstractGithubJobHandler(JobHandler, GithubPackageConfigGetter):


@add_to_mapping
class GithubPullRequestHandler(AbstractGithubJobHandler):
name = JobType.check_downstream
@use_for(job_type=JobType.check_downstream)
class PullRequestGithubCheckDownstreamHandler(AbstractGithubJobHandler):
type = JobType.check_downstream
triggers = [TheJobTriggerType.pull_request]

# https://developer.github.com/v3/activity/events/types/#events-api-payload-28
Expand Down Expand Up @@ -112,7 +115,7 @@ def run(self) -> HandlerResults:

@add_to_mapping
class GithubAppInstallationHandler(AbstractGithubJobHandler):
name = JobType.add_to_whitelist
type = JobType.add_to_whitelist
triggers = [TheJobTriggerType.installation]

# https://developer.github.com/v3/activity/events/types/#events-api-payload-28
Expand Down Expand Up @@ -169,8 +172,9 @@ def run(self) -> HandlerResults:


@add_to_mapping
class GithubReleaseHandler(AbstractGithubJobHandler):
name = JobType.propose_downstream
@use_for(job_type=JobType.propose_downstream)
class ProposeDownstreamHandler(AbstractGithubJobHandler):
type = JobType.propose_downstream
triggers = [TheJobTriggerType.release]
event: ReleaseEvent

Expand Down Expand Up @@ -239,7 +243,7 @@ def run(self) -> HandlerResults:


class AbstractGithubCoprBuildHandler(AbstractGithubJobHandler):
name = JobType.copr_build
type = JobType.copr_build
event: Union[PullRequestEvent, ReleaseEvent, PushGitHubEvent]

def __init__(
Expand Down Expand Up @@ -312,7 +316,9 @@ def pre_check(self) -> bool:


@add_to_mapping
@add_to_mapping_for_job(job_type=JobType.tests)
@add_alias(job_type=JobType.build)
@required_by(job_type=JobType.tests)
@use_for(job_type=JobType.copr_build)
class ReleaseGithubCoprBuildHandler(AbstractGithubCoprBuildHandler):
triggers = [
TheJobTriggerType.release,
Expand All @@ -335,7 +341,9 @@ def pre_check(self) -> bool:


@add_to_mapping
@add_to_mapping_for_job(job_type=JobType.tests)
@add_alias(job_type=JobType.build)
@required_by(job_type=JobType.tests)
@use_for(job_type=JobType.copr_build)
class PullRequestGithubCoprBuildHandler(AbstractGithubCoprBuildHandler):
triggers = [
TheJobTriggerType.pull_request,
Expand All @@ -348,7 +356,7 @@ def __init__(
super().__init__(config=config, job_config=job_config, event=event)

def run(self) -> HandlerResults:
if isinstance(self.event, GithubPullRequestHandler):
if isinstance(self.event, PullRequestEvent):
collaborators = self.project.who_can_merge_pr()
if self.event.github_login not in collaborators | self.config.admins:
self.copr_build_helper.report_status_to_all(
Expand All @@ -369,7 +377,8 @@ def pre_check(self) -> bool:


@add_to_mapping
@add_to_mapping_for_job(job_type=JobType.tests)
@add_alias(job_type=JobType.build)
@required_by(job_type=JobType.tests)
class PushGithubCoprBuildHandler(AbstractGithubCoprBuildHandler):
triggers = [
TheJobTriggerType.commit,
Expand Down Expand Up @@ -409,7 +418,6 @@ class GithubTestingFarmHandler(AbstractGithubJobHandler):
trigger is finished copr build.
"""

name = JobType.tests
triggers = [TheJobTriggerType.pull_request]
event: Union[CoprBuildEvent, PullRequestCommentEvent]

Expand Down Expand Up @@ -457,7 +465,8 @@ class GitHubPullRequestCommentCoprBuildHandler(
):
""" Handler for PR comment `/packit copr-build` """

name = CommentAction.copr_build
type = CommentAction.copr_build
triggers = [TheJobTriggerType.pr_comment]
event: PullRequestCommentEvent

def __init__(self, config: ServiceConfig, event: PullRequestCommentEvent):
Expand Down Expand Up @@ -495,7 +504,7 @@ class GitHubIssueCommentProposeUpdateHandler(
):
""" Handler for issue comment `/packit propose-update` """

name = CommentAction.propose_update
type = CommentAction.propose_update
event: IssueCommentEvent

def __init__(self, config: ServiceConfig, event: IssueCommentEvent):
Expand Down Expand Up @@ -603,8 +612,9 @@ class GitHubPullRequestCommentTestingFarmHandler(
):
""" Issue handler for comment `/packit test` """

name = CommentAction.test
type = CommentAction.test
event: PullRequestCommentEvent
trgggers = [TheJobTriggerType.pr_comment]

def __init__(self, config: ServiceConfig, event: PullRequestCommentEvent):
super().__init__(config=config, event=event)
Expand Down
5 changes: 3 additions & 2 deletions packit_service/worker/handlers/testing_farm_handlers.py
Expand Up @@ -40,7 +40,7 @@
TheJobTriggerType,
)
from packit_service.worker.handlers import AbstractGithubJobHandler
from packit_service.worker.handlers.abstract import add_to_mapping
from packit_service.worker.handlers.abstract import add_to_mapping, use_for
from packit_service.worker.reporting import StatusReporter
from packit_service.worker.result import HandlerResults
from packit_service.worker.testing_farm import TestingFarmJobHelper
Expand All @@ -49,8 +49,9 @@


@add_to_mapping
@use_for(job_type=JobType.tests)
class TestingFarmResultsHandler(AbstractGithubJobHandler):
name = JobType.report_test_results
type = JobType.report_test_results
triggers = [TheJobTriggerType.testing_farm_results]
event: TestingFarmResultsEvent

Expand Down

0 comments on commit a134fe2

Please sign in to comment.