def test_pull_request_tag_event(self, pagure_pr_tag_added): centos_event_parser = CentosEventParser() event_object = centos_event_parser.parse_event(pagure_pr_tag_added) assert isinstance(event_object, PullRequestLabelPagureEvent) assert event_object.pr_id == 18 assert event_object.base_repo_namespace == "source-git" assert event_object.base_repo_name == "packit-hello-world" assert event_object.base_repo_owner == "packit" assert event_object.base_ref == "master" assert event_object.labels == {"accepted"} assert (event_object.project_url == "https://git.stg.centos.org/source-git/packit-hello-world") assert isinstance(event_object.project, PagureProject) assert event_object.project.full_repo_name == "source-git/packit-hello-world" assert isinstance(event_object.base_project, PagureProject) assert (event_object.base_project.full_repo_name == "fork/packit/source-git/packit-hello-world") flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").with_args( base_project=event_object.base_project, project=event_object.project, pr_id=18, reference="0ec7f861383821218c485a45810d384ca224e357", fail_when_missing=False, spec_file_path="SPECS/packit-hello-world.spec", ).and_return(flexmock()).once() flexmock(PagureProject).should_receive("get_web_url").and_return( "https://git.stg.centos.org/source-git/packit-hello-world") assert event_object.package_config
def test_pull_request_comment_event(self, pagure_pr_comment_added): centos_event_parser = CentosEventParser() event_object = centos_event_parser.parse_event(pagure_pr_comment_added) assert isinstance(event_object, PullRequestCommentPagureEvent) assert event_object.pr_id == 16 assert event_object.base_repo_namespace == "source-git" assert event_object.base_repo_name == "packit-hello-world" assert event_object.base_repo_owner == "sakalosj" assert event_object.base_ref is None assert event_object.target_repo == "packit-hello-world" assert event_object.commit_sha == "dfe787d04101728c6ddc213d3f4bf39c969f194c" assert event_object.user_login == "sakalosj" assert event_object.comment == "/packit copr-build" assert (event_object.project_url == "https://git.stg.centos.org/source-git/packit-hello-world") assert isinstance(event_object.project, PagureProject) assert event_object.project.full_repo_name == "source-git/packit-hello-world" assert isinstance(event_object.base_project, PagureProject) assert (event_object.base_project.full_repo_name == "fork/sakalosj/source-git/packit-hello-world") flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").with_args( base_project=event_object.base_project, project=event_object.project, pr_id=16, reference="dfe787d04101728c6ddc213d3f4bf39c969f194c", fail_when_missing=False, spec_file_path="SPECS/packit-hello-world.spec", ).and_return(flexmock()).once() flexmock(PagureProject).should_receive("get_web_url").and_return( "https://git.stg.centos.org/source-git/packit-hello-world") assert event_object.package_config
def test_update_pull_request_event(self, pagure_pr_update): centos_event_parser = CentosEventParser() event_object = centos_event_parser.parse_event(pagure_pr_update) assert isinstance(event_object, PullRequestPagureEvent) assert event_object.action == PullRequestAction.synchronize assert event_object.pr_id == 13 assert event_object.base_repo_namespace == "source-git" assert event_object.base_repo_name == "packit-hello-world" assert event_object.base_repo_owner == "sakalosj" assert event_object.base_ref == "master" assert event_object.target_repo == "packit-hello-world" assert event_object.commit_sha == "b658af51df98c1cbf74a75095ced920bba2ef25e" assert event_object.user_login == "sakalosj" assert event_object.identifier == "13" assert (event_object.project_url == "https://git.stg.centos.org/source-git/packit-hello-world") assert isinstance(event_object.project, PagureProject) assert event_object.project.full_repo_name == "source-git/packit-hello-world" assert isinstance(event_object.base_project, PagureProject) assert (event_object.base_project.full_repo_name == "fork/sakalosj/source-git/packit-hello-world") flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").with_args( base_project=event_object.base_project, project=event_object.project, pr_id=13, reference="b658af51df98c1cbf74a75095ced920bba2ef25e", fail_when_missing=False, spec_file_path="SPECS/packit-hello-world.spec", ).and_return(flexmock()).once() flexmock(PagureProject).should_receive("get_web_url").and_return( "https://git.stg.centos.org/source-git/packit-hello-world") assert event_object.package_config
def test_new_pull_request_event(self, pagure_pr_new): centos_event_parser = CentosEventParser() event_object = centos_event_parser.parse_event(pagure_pr_new) assert isinstance(event_object, PullRequestPagureEvent) assert event_object.action == PullRequestAction.opened assert event_object.pr_id == 12 assert event_object.base_repo_namespace == "source-git" assert event_object.base_repo_name == "packit-hello-world" assert event_object.base_repo_owner == "sakalosj" assert event_object.base_ref == "master" assert event_object.target_repo == "packit-hello-world" assert event_object.commit_sha == "bf9701dea5a167caa7a1afa0759342aa0bf0d8fd" assert event_object.user_login == "sakalosj" assert event_object.identifier == "12" assert (event_object.project_url == "https://git.stg.centos.org/source-git/packit-hello-world") assert isinstance(event_object.project, PagureProject) assert event_object.project.full_repo_name == "source-git/packit-hello-world" assert isinstance(event_object.base_project, PagureProject) assert (event_object.base_project.full_repo_name == "fork/sakalosj/source-git/packit-hello-world") flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").with_args( base_project=event_object.base_project, project=event_object.project, pr_id=12, reference="bf9701dea5a167caa7a1afa0759342aa0bf0d8fd", fail_when_missing=False, spec_file_path="SPECS/packit-hello-world.spec", ).and_return(flexmock()).once() flexmock(PagureProject).should_receive("get_web_url").and_return( "https://git.stg.centos.org/source-git/packit-hello-world") assert event_object.package_config
def test_pagure_pr_tag_added_event_non_existing_pr(clean_before_and_after, pagure_pr_tag_added): event_object = CentosEventParser().parse_event(pagure_pr_tag_added) assert isinstance(event_object, PullRequestLabelPagureEvent) assert event_object.identifier == "342" assert event_object.git_ref is None assert event_object.pr_id == 342 assert event_object.commit_sha == "0ec7f861383821218c485a45810d384ca224e357" assert isinstance(event_object.db_trigger, PullRequestModel) assert event_object.db_trigger.pr_id == 342 assert isinstance(event_object.db_trigger.project, GitProjectModel) assert event_object.db_trigger.project.namespace == "the-namespace" assert event_object.db_trigger.project.repo_name == "the-repo-name"
def process_message( self, event: dict, topic: str = None, source: str = None ) -> Optional[dict]: """ Entrypoint for message processing. :param event: dict with webhook/fed-mes payload :param topic: meant to be a topic provided by messaging subsystem (fedmsg, mqqt) :param source: source of message """ if topic: # let's pre-filter messages: we don't need to get debug logs from processing # messages when we know beforehand that we are not interested in messages for such topic topics = [ getattr(h, "topic", None) for h in MAP_HANDLER_TO_JOB_TYPES.keys() ] if topic not in topics: logger.debug(f"{topic} not in {topics}") return None event_object: Any if source == "centosmsg": event_object = CentosEventParser().parse_event(event) else: event_object = Parser.parse_event(event) if not event_object or not event_object.pre_check(): return None # CoprBuildEvent.get_project returns None when the build id is not known if not event_object.project: logger.warning( "Cannot obtain project from this event! " "Skipping private repository check!" ) elif event_object.project.is_private(): logger.info("We do not interact with private repositories!") return None handler: Union[ GithubAppInstallationHandler, TestingFarmResultsHandler, CoprBuildStartHandler, CoprBuildEndHandler, PagurePullRequestLabelHandler, ] jobs_results: Dict[str, HandlerResults] = {} # installation is handled differently b/c app is installed to GitHub account # not repository, so package config with jobs is missing if event_object.trigger == TheJobTriggerType.installation: handler = GithubAppInstallationHandler( self.config, job_config=None, event=event_object ) job_type = JobType.add_to_whitelist.value jobs_results[job_type] = handler.run_n_clean() # Label/Tag added event handler is run even when the job is not configured in package elif event_object.trigger == TheJobTriggerType.pr_label: handler = PagurePullRequestLabelHandler( self.config, job_config=None, event=event_object ) job_type = JobType.create_bugzilla.value jobs_results[job_type] = handler.run_n_clean() elif event_object.trigger in { TheJobTriggerType.issue_comment, TheJobTriggerType.pr_comment, } and ( isinstance( event_object, ( PullRequestCommentGithubEvent, PullRequestCommentPagureEvent, IssueCommentEvent, ), ) ): jobs_results = self.process_comment_jobs(event_object) else: # Processing the jobs from the config. jobs_results = self.process_jobs(event_object) logger.debug("All jobs finished!") task_results = {"jobs": jobs_results, "event": event_object.get_dict()} for v in jobs_results.values(): if not (v and v["success"]): logger.warning(task_results) logger.error(v["details"]["msg"]) return task_results
def process_message(self, event: dict, topic: str = None, source: str = None) -> Optional[dict]: """ Entrypoint for message processing. :param event: dict with webhook/fed-mes payload :param topic: meant to be a topic provided by messaging subsystem (fedmsg, mqqt) :param source: source of message """ if topic: # let's pre-filter messages: we don't need to get debug logs from processing # messages when we know beforehand that we are not interested in messages for such topic topics = [ getattr(h, "topic", None) for h in MAP_HANDLER_TO_JOB_TYPES.keys() ] if topic not in topics: logger.debug(f"{topic} not in {topics}") return None event_object: Any if source == "centosmsg": event_object = CentosEventParser().parse_event(event) else: event_object = Parser.parse_event(event) if not (event_object and event_object.pre_check()): return None # CoprBuildEvent.get_project returns None when the build id is not known if not event_object.project: logger.warning("Cannot obtain project from this event! " "Skipping private repository check!") elif event_object.project.is_private(): logger.info("We do not interact with private repositories!") return None handler: Union[GithubAppInstallationHandler, TestingFarmResultsHandler, CoprBuildStartHandler, CoprBuildEndHandler, PagurePullRequestLabelHandler, ] processing_results = None # installation is handled differently b/c app is installed to GitHub account # not repository, so package config with jobs is missing if event_object.trigger == TheJobTriggerType.installation: GithubAppInstallationHandler.get_signature(event=event_object, job=None).apply_async() # Label/Tag added event handler is run even when the job is not configured in package elif event_object.trigger == TheJobTriggerType.pr_label: PagurePullRequestLabelHandler.get_signature( event=event_object, job=None, ).apply_async() elif event_object.trigger in { TheJobTriggerType.issue_comment, TheJobTriggerType.pr_comment, } and (isinstance( event_object, ( PullRequestCommentGithubEvent, PullRequestCommentPagureEvent, IssueCommentEvent, MergeRequestCommentGitlabEvent, IssueCommentGitlabEvent, ), )): processing_results = self.process_comment_jobs(event_object) else: # Processing the jobs from the config. processing_results = self.process_jobs(event_object) return processing_results or get_processing_results(event=event_object, jobs=[])
def process_message(self, event: dict, topic: str = None, source: str = None) -> List[TaskResults]: """ Entrypoint for message processing. :param event: dict with webhook/fed-mes payload :param topic: meant to be a topic provided by messaging subsystem (fedmsg, mqqt) :param source: source of message """ if topic: # let's pre-filter messages: we don't need to get debug logs from processing # messages when we know beforehand that we are not interested in messages for such topic topics = [ getattr(handler, "topic", None) for handler in JobHandler.get_all_subclasses() ] if topic not in topics: logger.debug(f"{topic} not in {topics}") return [] event_object: Any if source == "centosmsg": event_object = CentosEventParser().parse_event(event) else: event_object = Parser.parse_event(event) if not (event_object and event_object.pre_check()): return [] # CoprBuildEvent.get_project returns None when the build id is not known if not event_object.project: logger.warning("Cannot obtain project from this event! " "Skipping private repository check!") elif event_object.project.is_private(): service_with_namespace = ( f"{event_object.project.service.hostname}/" f"{event_object.project.namespace}") if (service_with_namespace not in self.service_config.enabled_private_namespaces): logger.info( f"We do not interact with private repositories by default. " f"Add `{service_with_namespace}` to the `enabled_private_namespaces` " f"in the service configuration.") return [] logger.debug(f"Working in `{service_with_namespace}` namespace " f"which is private but enabled via configuration.") handler: Union[GithubAppInstallationHandler, TestingFarmResultsHandler, CoprBuildStartHandler, CoprBuildEndHandler, PagurePullRequestLabelHandler, ] processing_results = None # installation is handled differently b/c app is installed to GitHub account # not repository, so package config with jobs is missing if isinstance(event, InstallationEvent): GithubAppInstallationHandler.get_signature(event=event_object, job=None).apply_async() # Label/Tag added event handler is run even when the job is not configured in package elif isinstance(event, PullRequestLabelPagureEvent): PagurePullRequestLabelHandler.get_signature( event=event_object, job=None, ).apply_async() else: # Processing the jobs from the config. processing_results = self.process_jobs(event_object) return processing_results