Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework mapping #476

Merged
merged 3 commits into from Mar 11, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 11 additions & 1 deletion 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 Expand Up @@ -527,8 +529,16 @@ def __init__(
self.base_repo_namespace = build.get("repo_namespace")
https_url = build["https_url"]

super().__init__(trigger=TheJobTriggerType.pull_request, project_url=https_url)
self.topic = FedmsgTopic(topic)
if self.topic == FedmsgTopic.copr_build_started:
trigger = TheJobTriggerType.copr_start
elif self.topic == FedmsgTopic.copr_build_finished:
trigger = TheJobTriggerType.copr_end
else:
raise ValueError(f"Unknown topic for CoprEvent: '{self.topic}'")

super().__init__(trigger=trigger, project_url=https_url)

self.build_id = build_id
self.build = build
self.chroot = chroot
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
62 changes: 55 additions & 7 deletions packit_service/worker/handlers/abstract.py
Expand Up @@ -25,32 +25,80 @@
"""
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)
lachmanfrantisek marked this conversation as resolved.
Show resolved Hide resolved

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
"""
[class decorator]
Add the handler to the trigger->handler mapping.
"""
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):
"""
[class decorator]
Use the given type as an alias for this job class.
This decorator will updated needed mapping so users can combine all and new types.
"""

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):
"""
[class decorator]
Set when you need to run for some job even if this one is not configured.

(e.g. we want to run build for test even if only the test is defined)
"""

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):
"""
[class decorator]
Specify a job type for which we want to use this handler.
"""

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 +180,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
15 changes: 12 additions & 3 deletions packit_service/worker/handlers/comment_action_handler.py
Expand Up @@ -47,11 +47,20 @@ class CommentAction(enum.Enum):


def add_to_comment_action_mapping(kls: Type["CommentActionHandler"]):
COMMENT_ACTION_HANDLER_MAPPING[kls.name] = kls
"""
[class decorator]
Add a comment handler to the mapping.
"""
COMMENT_ACTION_HANDLER_MAPPING[kls.type] = kls
return kls


def add_to_comment_action_mapping_with_name(name):
def add_to_comment_action_mapping_with_name(name: CommentAction):
"""
[class decorator]
Use this handler for the given comment action.
"""

def add_to_comment_action_mapping_with_name_inner(
kls: Type["CommentActionHandler"],
):
Expand All @@ -62,7 +71,7 @@ def add_to_comment_action_mapping_with_name_inner(


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

def __init__(
self,
Expand Down
12 changes: 8 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, required_by
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,11 @@ def run(self) -> HandlerResults:

@add_topic
@add_to_mapping
@use_for(job_type=JobType.copr_build)
@required_by(job_type=JobType.tests)
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 +304,11 @@ def run(self):

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

def __init__(
self,
Expand Down