コード例 #1
0
ファイル: test_models.py プロジェクト: packit/packit-service
def test_get_or_create_pr(clean_before_and_after):
    with get_sa_session() as session:
        expected_pr = PullRequestModel.get_or_create(
            pr_id=42,
            namespace="clapton",
            repo_name="layla",
            project_url="https://github.com/clapton/layla",
        )
        actual_pr = PullRequestModel.get_or_create(
            pr_id=42,
            namespace="clapton",
            repo_name="layla",
            project_url="https://github.com/clapton/layla",
        )

        assert session.query(PullRequestModel).count() == 1
        assert expected_pr.project_id == actual_pr.project_id

        expected_pr = PullRequestModel.get_or_create(
            pr_id=42,
            namespace="clapton",
            repo_name="cocaine",
            project_url="https://github.com/clapton/layla",
        )
        actual_pr = PullRequestModel.get_or_create(
            pr_id=42,
            namespace="clapton",
            repo_name="cocaine",
            project_url="https://github.com/clapton/layla",
        )

        assert session.query(PullRequestModel).count() == 2
        assert expected_pr.project_id == actual_pr.project_id
コード例 #2
0
def test_multiple_different_pr_models(clean_before_and_after):
    pr1 = PullRequestModel.get_or_create(
        pr_id=1, namespace="the-namespace", repo_name="the-repo-name"
    )
    pr2 = PullRequestModel.get_or_create(
        pr_id=2, namespace="the-namespace", repo_name="the-repo-name"
    )
    assert pr1.id != pr2.id
    assert pr1.project.id == pr2.project.id
コード例 #3
0
def test_errors_while_doing_db(clean_before_and_after):
    with get_sa_session() as session:
        try:
            PullRequestModel.get_or_create(pr_id="nope", namespace="", repo_name=False)
        except ProgrammingError:
            pass
        assert len(session.query(PullRequestModel).all()) == 0
        PullRequestModel.get_or_create(pr_id=111, namespace="asd", repo_name="qwe")
        assert len(session.query(PullRequestModel).all()) == 1
コード例 #4
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "pending"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    srpm_build = SRPMBuildModel()
    srpm_build.logs = "asd<br>qwe"

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build = srpm_build
    c.status = state
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = f"/copr-build/1/logs"
    logs_url = get_copr_build_log_url_from_flask(1)
    assert logs_url.endswith(url)

    resp = client.get(url)
    expected = (
        "<html><head>"
        f"<title>COPR build {project.namespace}/{project.repo_name}:"
        f" PR #{pr.pr_id}</title></head><body>"
        f"COPR build ID: {c.build_id}<br>"
        f"Submitted: {optional_time(c.build_submitted_time)}<br>"
        f"State: {c.status}<br><br>"
        f'Build web interface URL: <a href="{c.web_url}">{c.web_url}</a><br>'
        f'Build logs: <a href="{c.build_logs_url}">{c.build_logs_url}</a><br>'
        "SRPM creation logs:<br><br>"
        f"<pre>{c.srpm_build.logs}</pre>"
        "<br></body></html>")
    assert resp.data == expected.encode()
コード例 #5
0
ファイル: test_models.py プロジェクト: packit/packit-service
def test_multiple_pr_models(clean_before_and_after):
    pr1 = PullRequestModel.get_or_create(
        pr_id=1,
        namespace="the-namespace",
        repo_name="the-repo-name",
        project_url="https://github.com/the-namespace/the-repo-name",
    )
    pr1_second = PullRequestModel.get_or_create(
        pr_id=1,
        namespace="the-namespace",
        repo_name="the-repo-name",
        project_url="https://github.com/the-namespace/the-repo-name",
    )
    assert pr1.id == pr1_second.id
    assert pr1.project.id == pr1_second.project.id
コード例 #6
0
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "success"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    srpm = SRPMBuildModel()
    srpm.url = "https://some.random.copr.subdomain.org/my_srpm.srpm"

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build_id = 11
    c.status = state
    c.srpm_build = srpm
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"
    c.owner = "packit"
    c.project_name = "example_project"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = "/copr-build/1"
    logs_url = get_copr_build_info_url_from_flask(1)
    assert logs_url.endswith(url)

    resp = client.get(url).data.decode()
    assert f"srpm-build/{c.srpm_build_id}/logs" in resp
    assert c.web_url in resp
    assert c.build_logs_url in resp
    assert c.target in resp
    assert "Status: success" in resp
    assert "You can install" in resp

    assert "Download SRPM" in resp
    assert srpm.url in resp
コード例 #7
0
def mr_model():
    yield PullRequestModel.get_or_create(
        pr_id=SampleValues.mr_id,
        namespace=SampleValues.gitlab_repo_namespace,
        repo_name=SampleValues.gitlab_repo_name,
        project_url=SampleValues.gitlab_project_url,
    )
コード例 #8
0
 def db_trigger(self) -> Optional[AbstractTriggerDbType]:
     return PullRequestModel.get_or_create(
         pr_id=self.pr_id,
         namespace=self.project.namespace,
         repo_name=self.project.repo,
         project_url=self.project_url,
     )
コード例 #9
0
def test_copr_and_koji_build_for_one_trigger(clean_before_and_after):
    pr1 = PullRequestModel.get_or_create(
        pr_id=1, namespace="the-namespace", repo_name="the-repo-name"
    )
    pr1_trigger = JobTriggerModel.get_or_create(
        type=JobTriggerModelType.pull_request, trigger_id=pr1.id
    )
    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    copr_build = CoprBuildModel.get_or_create(
        build_id="123456",
        commit_sha="687abc76d67d",
        project_name="SomeUser-hello-world-9",
        owner="packit",
        web_url="https://copr.something.somewhere/123456",
        target=TARGET,
        status="pending",
        srpm_build=srpm_build,
        trigger_model=pr1,
    )
    koji_build = KojiBuildModel.get_or_create(
        build_id="987654",
        commit_sha="687abc76d67d",
        web_url="https://copr.something.somewhere/123456",
        target=TARGET,
        status="pending",
        srpm_build=srpm_build,
        trigger_model=pr1,
    )

    assert copr_build in pr1_trigger.copr_builds
    assert koji_build in pr1_trigger.koji_builds

    assert copr_build.job_trigger.get_trigger_object() == pr1
    assert koji_build.job_trigger.get_trigger_object() == pr1
コード例 #10
0
    def test_parse_testing_farm_notification_error(self,
                                                   testing_farm_notification,
                                                   testing_farm_results_error):
        request_id = "129bd474-e4d3-49e0-9dec-d994a99feebc"
        flexmock(TestingFarmJobHelper).should_receive(
            "get_request_details").with_args(request_id).and_return(
                testing_farm_results_error)
        flexmock(TFTTestRunModel).should_receive(
            "get_by_pipeline_id").and_return(
                flexmock(
                    job_trigger=flexmock().should_receive(
                        "get_trigger_object").and_return(
                            PullRequestModel(pr_id=10)).once().mock(),
                    data={
                        "base_project_url": "https://github.com/packit/packit"
                    },
                ))
        event_object = Parser.parse_event(testing_farm_notification)

        assert isinstance(event_object, TestingFarmResultsEvent)
        assert event_object.pipeline_id == request_id
        assert event_object.result == TestingFarmResult.error
        assert event_object.project_url == "https://github.com/packit/packit"
        assert event_object.commit_sha == "e7e3c8b688403048e7aefa64c19b79e89fe764df"
        assert event_object.summary == "something went wrong"
        assert event_object.compose == "Fedora-32"
        assert event_object.copr_build_id == "1810530"
        assert event_object.copr_chroot == "fedora-32-x86_64"
        assert event_object.tests
        assert event_object.db_trigger
        assert isinstance(event_object.project, GithubProject)
        assert event_object.project.full_repo_name == "packit/packit"
コード例 #11
0
def different_pr_model():
    yield PullRequestModel.get_or_create(
        pr_id=4,
        namespace=SampleValues.repo_namespace,
        repo_name=SampleValues.repo_name,
        project_url=SampleValues.project_url,
    )
コード例 #12
0
ファイル: event.py プロジェクト: packit/packit-service
    def db_trigger(self) -> Optional[AbstractTriggerDbType]:
        if not self._db_trigger:

            # TODO, do a better job
            # Probably, try to recreate original classes.
            if self.event_type in {
                    "PullRequestGithubEvent",
                    "PullRequestPagureEvent",
                    "MergeRequestGitlabEvent",
                    "PullRequestCommentGithubEvent",
                    "MergeRequestCommentGitlabEvent",
                    "PullRequestCommentPagureEvent",
                    "CheckRerunPullRequestEvent",
            }:
                self._db_trigger = PullRequestModel.get_or_create(
                    pr_id=self.pr_id,
                    namespace=self.project.namespace,
                    repo_name=self.project.repo,
                    project_url=self.project_url,
                )
            elif self.event_type in {
                    "PushGitHubEvent",
                    "PushGitlabEvent",
                    "PushPagureEvent",
                    "CheckRerunCommitEvent",
            }:
                self._db_trigger = GitBranchModel.get_or_create(
                    branch_name=self.git_ref,
                    namespace=self.project.namespace,
                    repo_name=self.project.repo,
                    project_url=self.project_url,
                )

            elif self.event_type in {"ReleaseEvent", "CheckRerunReleaseEvent"}:
                self._db_trigger = ProjectReleaseModel.get_or_create(
                    tag_name=self.tag_name,
                    namespace=self.project.namespace,
                    repo_name=self.project.repo,
                    project_url=self.project_url,
                    commit_hash=self.commit_sha,
                )
            elif self.event_type in {
                    "IssueCommentEvent",
                    "IssueCommentGitlabEvent",
            }:
                self._db_trigger = IssueModel.get_or_create(
                    issue_id=self.issue_id,
                    namespace=self.project.namespace,
                    repo_name=self.project.repo,
                    project_url=self.project_url,
                )
            else:
                logger.warning(
                    "We don't know, what to search in the database for this event data."
                )

        return self._db_trigger
コード例 #13
0
    def test_parse_testing_farm_results(self, testing_farm_results):
        flexmock(TFTTestRunModel).should_receive(
            "get_by_pipeline_id").and_return(
                flexmock(job_trigger=flexmock().should_receive(
                    "get_trigger_object").and_return(PullRequestModel(
                        pr_id=10)).once().mock()))

        event_object = Parser.parse_event(testing_farm_results)

        assert isinstance(event_object, TestingFarmResultsEvent)
        assert event_object.trigger == TheJobTriggerType.testing_farm_results
        assert event_object.pipeline_id == "43e310b6-c1f1-4d3e-a95c-6c1eca235296"
        assert event_object.result == TestingFarmResult.passed
        assert event_object.repo_namespace == "packit-service"
        assert event_object.repo_name == "hello-world"
        assert event_object.git_ref == "pull/10/head"
        assert (event_object.project_url ==
                "https://github.com/packit-service/hello-world")
        assert event_object.commit_sha == "46597d9b66a1927b50376f73bdb1ec1a5757c330"
        assert event_object.message == "Error or info message to display"
        assert event_object.environment == "Fedora-Cloud-Base-29-1.2.x86_64.qcow2"
        assert event_object.copr_repo_name == "packit/packit-service-hello-world-10-stg"
        assert event_object.copr_chroot == "fedora-29-x86_64"
        assert event_object.tests
        assert {
            TestResult(
                name="test1",
                result=TestingFarmResult.failed,
                log_url="https://somewhere.com/43e310b6/artifacts/test1.log",
            ),
            TestResult(
                name="test2",
                result=TestingFarmResult.passed,
                log_url="https://somewhere.com/43e310b6/artifacts/test2.log",
            ),
        } == set(event_object.tests)

        assert event_object.db_trigger

        assert isinstance(event_object.project, GithubProject)
        assert event_object.project.full_repo_name == "packit-service/hello-world"
        assert (not event_object.
                base_project  # With Github app, we cannot work with fork repo
                )

        flexmock(PackageConfigGetter).should_receive(
            "get_package_config_from_repo").with_args(
                base_project=None,
                project=event_object.project,
                pr_id=10,
                reference="46597d9b66a1927b50376f73bdb1ec1a5757c330",
                fail_when_missing=False,
                spec_file_path=None,
            ).and_return(flexmock()).once()

        assert event_object.package_config
コード例 #14
0
ファイル: test_models.py プロジェクト: packit/packit-service
def test_errors_while_doing_db(clean_before_and_after):
    with get_sa_session() as session:
        try:
            PullRequestModel.get_or_create(
                pr_id="nope",
                namespace="",
                repo_name=False,
                project_url="https://github.com/the-namespace/the-repo",
            )
        except ProgrammingError:
            pass
        assert len(session.query(PullRequestModel).all()) == 0
        PullRequestModel.get_or_create(
            pr_id=111,
            namespace="asd",
            repo_name="qwe",
            project_url="https://github.com/asd/qwe",
        )
        assert len(session.query(PullRequestModel).all()) == 1
コード例 #15
0
ファイル: test_models.py プロジェクト: packit/packit-service
def test_copr_and_koji_build_for_one_trigger(clean_before_and_after):
    pr1 = PullRequestModel.get_or_create(
        pr_id=1,
        namespace="the-namespace",
        repo_name="the-repo-name",
        project_url="https://github.com/the-namespace/the-repo-name",
    )
    # SRPMBuildModel is (sadly) not shared between Koji and Copr builds.
    srpm_build_for_copr, run_model_for_copr = SRPMBuildModel.create_with_new_run(
        trigger_model=pr1, commit_sha="687abc76d67d")
    srpm_build_for_copr.set_logs("asd\nqwe\n")
    srpm_build_for_copr.set_status("success")

    srpm_build_for_koji, run_model_for_koji = SRPMBuildModel.create_with_new_run(
        trigger_model=pr1, commit_sha="687abc76d67d")
    srpm_build_for_copr.set_logs("asd\nqwe\n")
    srpm_build_for_copr.set_status("success")

    copr_build = CoprBuildModel.create(
        build_id="123456",
        commit_sha="687abc76d67d",
        project_name="SomeUser-hello-world-9",
        owner="packit",
        web_url="https://copr.something.somewhere/123456",
        target=SampleValues.target,
        status="pending",
        run_model=run_model_for_copr,
    )
    koji_build = KojiBuildModel.create(
        build_id="987654",
        commit_sha="687abc76d67d",
        web_url="https://copr.something.somewhere/123456",
        target=SampleValues.target,
        status="pending",
        run_model=run_model_for_koji,
    )

    assert copr_build in pr1.get_copr_builds()
    assert koji_build in pr1.get_koji_builds()

    assert srpm_build_for_copr in pr1.get_srpm_builds()
    assert srpm_build_for_koji in pr1.get_srpm_builds()

    assert copr_build.get_job_trigger_model(
    ) == koji_build.get_job_trigger_model()

    assert srpm_build_for_copr.get_trigger_object() == pr1
    assert srpm_build_for_koji.get_trigger_object() == pr1
    assert copr_build.get_trigger_object() == pr1
    assert koji_build.get_trigger_object() == pr1

    assert len(koji_build.runs) == 1
    assert koji_build.runs[0] == run_model_for_koji
    assert len(copr_build.runs) == 1
    assert copr_build.runs[0] == run_model_for_copr
コード例 #16
0
ファイル: test_views.py プロジェクト: sakalosj/packit-service
def test_get_logs(client):
    chroot = "foo-1-x86_64"
    state = "pending"
    build_id = 2

    project = GitProjectModel()
    project.namespace = "john-foo"
    project.repo_name = "bar"

    pr = PullRequestModel()
    pr.pr_id = 234
    pr.project = project

    c = CoprBuildModel()
    c.target = chroot
    c.build_id = str(build_id)
    c.srpm_build_id = 11
    c.status = state
    c.web_url = (
        "https://copr.fedorainfracloud.org/coprs/john-foo-bar/john-foo-bar/build/2/"
    )
    c.build_logs_url = "https://localhost:5000/build/2/foo-1-x86_64/logs"

    flexmock(CoprBuildModel).should_receive("get_by_id").and_return(c)
    flexmock(CoprBuildModel).should_receive("get_project").and_return(project)
    flexmock(CoprBuildModel).should_receive("job_trigger").and_return(
        flexmock(get_trigger_object=lambda: pr))

    url = "/copr-build/1"
    logs_url = get_copr_build_info_url_from_flask(1)
    assert logs_url.endswith(url)

    resp = client.get(url).data.decode()
    assert f"srpm-build/{c.srpm_build_id}/logs" in resp
    assert c.web_url in resp
    assert c.build_logs_url in resp
    assert c.target in resp
コード例 #17
0
 def db_trigger(self) -> Optional[AbstractTriggerDbType]:
     if not self._db_trigger and self.source == "merge_request_event":
         # Can't use self.project because that can be either source or target project.
         # We need target project here. Let's derive it from self.merge_request_url
         m = fullmatch(r"(\S+)/-/merge_requests/(\d+)",
                       self.merge_request_url)
         if m:
             project = ServiceConfig.get_service_config().get_project(
                 url=m[1])
             self._db_trigger = PullRequestModel.get_or_create(
                 pr_id=int(m[2]),
                 namespace=project.namespace,
                 repo_name=project.repo,
                 project_url=m[1],
             )
     return self._db_trigger
コード例 #18
0
ファイル: abstract.py プロジェクト: sakalosj/packit-service
 def db_trigger(self):
     if not self._db_trigger and self.data.trigger_id is not None:
         if self.data.trigger in (
                 TheJobTriggerType.pull_request,
                 TheJobTriggerType.pr_comment,
                 TheJobTriggerType.pr_label,
         ):
             self._db_trigger = PullRequestModel.get_by_id(
                 self.data.trigger_id)
         elif self.data.trigger == TheJobTriggerType.issue_comment:
             self._db_trigger = IssueModel.get_by_id(self.data.trigger_id)
         elif self.data.trigger == TheJobTriggerType.release:
             self._db_trigger = ProjectReleaseModel.get_by_id(
                 self.data.trigger_id)
         elif self.data.trigger == TheJobTriggerType.push:
             self._db_trigger = GitBranchModel.get_by_id(
                 self.data.trigger_id)
     return self._db_trigger
コード例 #19
0
def packit_build_752():
    pr_model = PullRequestModel.get_or_create(pr_id=752,
                                              namespace="packit-service",
                                              repo_name="packit")

    srpm_build = SRPMBuildModel.create("asd\nqwe\n")
    yield CoprBuildModel.get_or_create(
        build_id=str(BUILD_ID),
        commit_sha="687abc76d67d",
        project_name="packit-service-packit-752",
        owner="packit",
        web_url=("https://download.copr.fedorainfracloud.org/"
                 "results/packit/packit-service-packit-752"),
        target="fedora-rawhide-x86_64",
        status="pending",
        srpm_build=srpm_build,
        trigger_model=pr_model,
    )
コード例 #20
0
def mock_pr_functionality(request):
    packit_yaml = (
        "{'specfile_path': 'the-specfile.spec', 'synced_files': [], 'jobs':"
        + str(request.param)
        + "}"
    )
    flexmock(
        GithubProject,
        full_repo_name="packit/hello-world",
        get_file_content=lambda path, ref: packit_yaml,
        get_files=lambda ref, filter_regex: ["the-specfile.spec"],
        get_web_url=lambda: "https://github.com/the-namespace/the-repo",
        get_pr=lambda pr_id: flexmock(head_commit="12345"),
    )
    flexmock(Github, get_repo=lambda full_name_or_id: None)

    config = ServiceConfig()
    config.command_handler_work_dir = SANDCASTLE_WORK_DIR
    flexmock(ServiceConfig).should_receive("get_service_config").and_return(config)
    trigger = JobTriggerModel(type=JobConfigTriggerType.pull_request, id=123)
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(trigger)
    flexmock(PullRequestModel).should_receive("get_by_id").with_args(123).and_return(
        trigger
    )
    flexmock(LocalProject, refresh_the_arguments=lambda: None)
    flexmock(JobTriggerModel).should_receive("get_by_id").with_args(123456).and_return(
        trigger
    )
    flexmock(trigger).should_receive("get_trigger_object").and_return(
        PullRequestModel(pr_id=123)
    )
    flexmock(PullRequestModel).should_receive("get_or_create").with_args(
        pr_id=123,
        namespace="packit",
        repo_name="hello-world",
        project_url="https://github.com/packit/hello-world",
    ).and_return(
        flexmock(id=12, job_config_trigger_type=JobConfigTriggerType.pull_request)
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").and_return(
        flexmock(id=123456)
    )
コード例 #21
0
def pr_model():
    yield PullRequestModel.get_or_create(pr_id=342,
                                         namespace="the-namespace",
                                         repo_name="the-repo-name")
コード例 #22
0
 def db_trigger(self) -> Optional[AbstractTriggerDbType]:
     return PullRequestModel.get_or_create(
         pr_id=self.pr_id,
         namespace=self.base_repo_namespace,
         repo_name=self.base_repo_name,
     )
コード例 #23
0
def different_pr_model():
    yield PullRequestModel.get_or_create(pr_id=4,
                                         namespace="the-namespace",
                                         repo_name="the-repo-name")