Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
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"
Esempio n. 6
0
    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
Esempio n. 7
0
    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=[])
Esempio n. 8
0
    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