Ejemplo n.º 1
0
def get_default_job_config(**kwargs):
    """ pass kwargs to JobConfig constructor """
    return [
        JobConfig(type=JobType.tests,
                  trigger=JobConfigTriggerType.pull_request,
                  metadata=JobMetadataConfig(targets=["fedora-stable"]),
                  **kwargs),
        JobConfig(type=JobType.propose_downstream,
                  trigger=JobConfigTriggerType.release,
                  metadata=JobMetadataConfig(dist_git_branches=["fedora-all"]),
                  **kwargs),
    ]
Ejemplo n.º 2
0
def get_job_config_build_for_branch(**kwargs):
    """ pass kwargs to JobConfig constructor """
    return JobConfig(type=JobType.copr_build,
                     trigger=JobConfigTriggerType.commit,
                     metadata=JobMetadataConfig(branch="build-branch",
                                                scratch=True),
                     **kwargs)
Ejemplo n.º 3
0
def test_handler_cleanup(tmp_path, trick_p_s_with_k8s):
    tmp_path.joinpath("a").mkdir()
    tmp_path.joinpath("b").write_text("a")
    tmp_path.joinpath("c").symlink_to("b")
    tmp_path.joinpath("d").symlink_to("a", target_is_directory=True)
    tmp_path.joinpath("e").symlink_to("nope", target_is_directory=False)
    tmp_path.joinpath("f").symlink_to("nopez", target_is_directory=True)
    tmp_path.joinpath(".g").write_text("g")
    tmp_path.joinpath(".h").symlink_to(".g", target_is_directory=False)

    c = ServiceConfig()
    pc = flexmock(PackageConfig)
    c.command_handler_work_dir = tmp_path
    jc = JobConfig(
        type=JobType.copr_build,
        trigger=JobConfigTriggerType.pull_request,
        metadata=JobMetadataConfig(),
    )
    j = JobHandler(
        package_config=pc,
        job_config=jc,
        event={},
    )

    flexmock(j).should_receive("service_config").and_return(c)

    j._clean_workplace()

    assert len(list(tmp_path.iterdir())) == 0
Ejemplo n.º 4
0
def test_trigger_build(copr_build, run_new_build):

    valid_commit_sha = "1111111111111111111111111111111111111111"

    package_config = PackageConfig()
    package_config.jobs = []
    package_config.spec_source_id = 1
    job_config = flexmock()
    job_config.type = JobType.build
    job_config.spec_source_id = 1
    job_config.metadata = JobMetadataConfig()

    event = {
        "event_type": "CoprBuileEndEvent",
        "commit_sha": valid_commit_sha,
    }

    flexmock(TFJobHelper).should_receive("get_latest_copr_build").and_return(copr_build)

    if run_new_build:
        flexmock(TFJobHelper, job_owner="owner", job_project="project")
        flexmock(Signature).should_receive("apply_async").once()
    else:
        flexmock(TFJobHelper).should_receive("run_testing_farm").and_return(
            TaskResults(success=True, details={})
        )

    flexmock(cb).should_receive("get_valid_build_targets").and_return(
        {"target", "another-target"}
    )

    tf_handler = TestingFarmHandler(package_config, job_config, event, "target")
    tf_handler.run()
Ejemplo n.º 5
0
def test_koji_build_target_not_supported(github_pr_event):
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        flexmock(job_config_trigger_type=JobConfigTriggerType.release))
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(targets=["nonexisting-target"]),
    )
    flexmock(koji_build).should_receive("get_all_koji_targets").and_return(
        ["dark-past", "bright-future"]).once()

    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.pending,
        description="Building SRPM ...",
        check_name="packit-stg/production-build-nonexisting-target",
        url="",
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.error,
        description="Target not supported: nonexisting-target",
        check_name="packit-stg/production-build-nonexisting-target",
        url=get_srpm_log_url_from_flask(1),
    ).and_return()

    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create").and_return(
        SRPMBuildModel(id=1, success=True))
    flexmock(KojiBuildModel).should_receive("get_or_create").and_return(
        KojiBuildModel(id=1))
    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    response = helper.run_koji_build()
    assert not response["success"]
    assert ("Target not supported: nonexisting-target" == response["details"]
            ["errors"]["nonexisting-target"])
Ejemplo n.º 6
0
def test_copr_build_check_names(pull_request_event):
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        flexmock(job_config_trigger_type=JobConfigTriggerType.release)
    )
    helper = build_helper(
        event=pull_request_event,
        metadata=JobMetadataConfig(targets=["bright-future-x86_64"], owner="nobody"),
    )
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.pending,
        description="Building SRPM ...",
        check_name="packit-stg/rpm-build-bright-future-x86_64",
        url="",
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.pending,
        description="Building RPM ...",
        check_name="packit-stg/rpm-build-bright-future-x86_64",
        url="https://localhost:5000/copr-build/1/logs",
    ).and_return()

    flexmock(GitProject).should_receive("set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create").and_return(SRPMBuildModel())
    flexmock(CoprBuildModel).should_receive("get_or_create").and_return(
        CoprBuildModel(id=1)
    )
    flexmock(PullRequestEvent).should_receive("db_trigger").and_return(flexmock())
    flexmock(PackitAPI).should_receive("run_copr_build").and_return(1, None)
    flexmock(Celery).should_receive("send_task").once()

    config = ServiceConfig.get_service_config()
    config.disable_sentry = True
    assert helper.run_copr_build()["success"]
Ejemplo n.º 7
0
def test_create_source_script_with_job_config():
    test_job_config = JobConfig(
        type=JobType.copr_build,
        trigger=JobConfigTriggerType.release,
        metadata=JobMetadataConfig(project="example1"),
    )
    expected_command = (
        'packit -d prepare-sources --result-dir "$resultdir" '
        f"--job-config {JobConfigSchema().dumps(test_job_config)!r}"
        f" https://github.com/packit/ogr"
    )
    assert (
        create_source_script(
            job_config=test_job_config, url="https://github.com/packit/ogr"
        )
        == f"""
#!/bin/sh

git config --global user.email "*****@*****.**"
git config --global user.name "Packit"
resultdir=$PWD
{expected_command}

"""
    )
Ejemplo n.º 8
0
def test_koji_build_non_scratch(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request, id=123)
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(targets=["bright-future"]),
        db_trigger=trigger,
    )
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.error,
        description="Non-scratch builds not possible from upstream.",
        check_name="packit-stg/production-build-bright-future",
        url=KOJI_PRODUCTION_BUILDS_ISSUE,
    ).and_return()

    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(KojiBuildModel).should_receive("get_or_create").never()

    result = helper.run_koji_build()
    assert result["success"]
    assert "Non-scratch builds not possible from upstream." in result[
        "details"]["msg"]
Ejemplo n.º 9
0
def test_koji_build_failed_srpm(github_pr_event):
    trigger = flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123)
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(targets=["bright-future"]),
        db_trigger=trigger,
    )
    srpm_build_url = get_srpm_log_url_from_flask(2)
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.pending,
        description="Building SRPM ...",
        check_name="packit-stg/production-build-bright-future",
        url="",
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.failure,
        description="SRPM build failed, check the logs for details.",
        check_name="packit-stg/production-build-bright-future",
        url=srpm_build_url,
    ).and_return()

    flexmock(GitProject).should_receive("set_commit_status").and_return().never()
    flexmock(PackitAPI).should_receive("create_srpm").and_raise(Exception, "some error")
    flexmock(SRPMBuildModel).should_receive("create").and_return(
        SRPMBuildModel(id=2, success=False)
    )
    flexmock(KojiBuildModel).should_receive("get_or_create").never()
    flexmock(sentry_integration).should_receive("send_to_sentry").and_return().once()

    result = helper.run_koji_build()
    assert not result["success"]
    assert "SRPM build failed" in result["details"]["msg"]
Ejemplo n.º 10
0
def test_distro2compose_for_aarch64(distro, arch, compose, use_internal_tf):
    job_helper = TFJobHelper(
        service_config=flexmock(
            testing_farm_api_url="xyz",
        ),
        package_config=flexmock(jobs=[]),
        project=flexmock(),
        metadata=flexmock(),
        db_trigger=flexmock(),
        job_config=JobConfig(
            type=JobType.tests,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(use_internal_tf=use_internal_tf),
        ),
    )
    job_helper = flexmock(job_helper)

    response = flexmock(
        status_code=200, json=lambda: {"composes": [{"name": "Fedora-33"}]}
    )
    job_helper.should_receive("send_testing_farm_request").and_return(response).times(
        0 if use_internal_tf else 1
    )

    assert job_helper.distro2compose(distro, arch=arch) == compose
Ejemplo n.º 11
0
def test_copr_build_no_targets_gitlab(gitlab_mr_event):
    # status is set for each build-target (fedora-stable => 2x):
    #  - Building SRPM ...
    #  - Starting RPM build...
    helper = build_helper(event=gitlab_mr_event,
                          metadata=JobMetadataConfig(owner="nobody"))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().times(4)
    flexmock(GitProject).should_receive("get_pr").and_return(flexmock())
    flexmock(SRPMBuildModel).should_receive("create").and_return(
        SRPMBuildModel(success=True))
    flexmock(CoprBuildModel).should_receive("get_or_create").and_return(
        CoprBuildModel(id=1))
    flexmock(MergeRequestGitlabEvent).should_receive("db_trigger").and_return(
        flexmock())

    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    # copr build
    flexmock(CoprHelper).should_receive(
        "create_copr_project_if_not_exists").and_return(None)
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        flexmock(
            config={"copr_url": "https://copr.fedorainfracloud.org/"},
            build_proxy=flexmock().should_receive(
                "create_from_file").and_return(
                    flexmock(id=2,
                             projectname="the-project-name",
                             ownername="the-owner")).mock(),
        ))

    flexmock(Celery).should_receive("send_task").once()
    assert helper.run_copr_build()["success"]
Ejemplo n.º 12
0
def test_copr_build_for_release(release_event):
    # status is set for each build-target (4x):
    #  - Building SRPM ...
    #  - Building RPM ...
    branch_build_job = JobConfig(
        type=JobType.build,
        trigger=JobConfigTriggerType.release,
        metadata=JobMetadataConfig(
            targets=[
                "fedora-29-x86_64",
                "fedora-30-x86_64",
                "fedora-31-x86_64",
                "fedora-rawhide-x86_64",
            ],
            owner="nobody",
            dist_git_branches=["build-branch"],
        ),
    )
    flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return(
        flexmock(job_config_trigger_type=JobConfigTriggerType.release)
    )
    helper = build_helper(jobs=[branch_build_job], event=release_event)
    flexmock(ReleaseEvent).should_receive("get_project").and_return(helper.project)
    flexmock(GitProject).should_receive("set_commit_status").and_return().times(8)
    flexmock(GitProject).should_receive("get_sha_from_tag").and_return("123456").once()
    flexmock(SRPMBuildModel).should_receive("create").and_return(SRPMBuildModel())
    flexmock(CoprBuildModel).should_receive("get_or_create").and_return(
        CoprBuildModel(id=1)
    )
    flexmock(PackitAPI).should_receive("run_copr_build").and_return(1, None).once()
    flexmock(Celery).should_receive("send_task").once()
    assert helper.run_copr_build()["success"]
Ejemplo n.º 13
0
def test_koji_build_check_names(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        id=123,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=123).and_return(
            flexmock(id=2, type=JobConfigTriggerType.pull_request))
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["bright-future"], scratch=True),
        db_trigger=trigger,
    )
    flexmock(koji_build).should_receive("get_all_koji_targets").and_return(
        ["dark-past", "bright-future"]).once()

    koji_build_url = get_koji_build_info_url(1)
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.running,
        description="Building SRPM ...",
        check_name="production-build:bright-future",
        url="",
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.running,
        description="Building RPM ...",
        check_name="production-build:bright-future",
        url=koji_build_url,
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()

    flexmock(GitProject).should_receive("get_pr").and_return(
        flexmock(source_project=flexmock()))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return(
        (flexmock(id=1, success=True), flexmock()))
    flexmock(KojiBuildModel).should_receive("create").and_return(
        flexmock(id=1))
    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    # koji build
    flexmock(Upstream).should_receive("koji_build").and_return(
        "Uploading srpm: /python-ogr-0.11.1"
        ".dev21+gf2dec9b-1.20200407142424746041.21.gf2dec9b.fc31.src.rpm\n"
        "[====================================] 100% 00:00:11   1.67 MiB 148.10 KiB/sec\n"
        "Created task: 43429338\n"
        "Task info: https://koji.fedoraproject.org/koji/taskinfo?taskID=43429338\n"
    )

    flexmock(PackitAPI).should_receive("init_kerberos_ticket").once()

    assert helper.run_koji_build()["success"]
Ejemplo n.º 14
0
def pc_koji_build_pr():
    return PackageConfig(jobs=[
        JobConfig(
            type=JobType.production_build,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(_targets=["fedora-all"]),
        )
    ])
Ejemplo n.º 15
0
def pc_tests():
    return PackageConfig(jobs=[
        JobConfig(
            type=JobType.tests,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(_targets=["fedora-all"]),
        )
    ])
Ejemplo n.º 16
0
def pc_build_push():
    return PackageConfig(jobs=[
        JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.commit,
            metadata=JobMetadataConfig(targets=["fedora-all"]),
        )
    ])
Ejemplo n.º 17
0
def get_job_config_full(**kwargs):
    """ pass kwargs to JobConfig constructor """
    return JobConfig(
        type=JobType.propose_downstream,
        trigger=JobConfigTriggerType.pull_request,
        metadata=JobMetadataConfig(dist_git_branches=["master"]),
        **kwargs
    )
Ejemplo n.º 18
0
def pc_build_release():
    return PackageConfig(jobs=[
        JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.release,
            metadata=JobMetadataConfig(_targets=["fedora-all"]),
        )
    ])
Ejemplo n.º 19
0
def test_copr_build_check_names(github_pr_event):
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        flexmock(job_config_trigger_type=JobConfigTriggerType.release))
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(targets=["bright-future-x86_64"],
                                   owner="nobody"),
    )

    flexmock(copr_build).should_receive(
        "get_copr_build_log_url_from_flask").and_return("https://test.url")
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.pending,
        description="Building SRPM ...",
        check_name="packit-stg/rpm-build-bright-future-x86_64",
        url="",
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=CommitStatus.pending,
        description="Starting RPM build...",
        check_name="packit-stg/rpm-build-bright-future-x86_64",
        url="https://test.url",
    ).and_return()

    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create").and_return(
        SRPMBuildModel(success=True))
    flexmock(CoprBuildModel).should_receive("get_or_create").and_return(
        CoprBuildModel(id=1))
    flexmock(PullRequestGithubEvent).should_receive("db_trigger").and_return(
        flexmock())

    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    # copr build
    flexmock(CoprHelper).should_receive(
        "create_copr_project_if_not_exists").with_args(
            project="the-example-namespace-the-example-repo-342-stg",
            chroots=["bright-future-x86_64"],
            owner="nobody",
            description=None,
            instructions=None,
        ).and_return(None)

    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        flexmock(
            config={"copr_url": "https://copr.fedorainfracloud.org/"},
            build_proxy=flexmock().should_receive(
                "create_from_file").and_return(
                    flexmock(id=2,
                             projectname="the-project-name",
                             ownername="the-owner")).mock(),
        ))

    flexmock(Celery).should_receive("send_task").once()

    assert helper.run_copr_build()["success"]
Ejemplo n.º 20
0
def test_koji_build_failed(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        id=123,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=123).and_return(
            flexmock(id=2, type=JobTriggerModelType.pull_request))
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["bright-future"], scratch=True),
        db_trigger=trigger,
    )
    flexmock(koji_build).should_receive("get_all_koji_targets").and_return(
        ["dark-past", "bright-future"]).once()

    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.running,
        description="Building SRPM ...",
        check_name="production-build:bright-future",
        url="",
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()

    srpm_build_url = get_srpm_build_info_url(2)
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.error,
        description="Submit of the build failed: some error",
        check_name="production-build:bright-future",
        url=srpm_build_url,
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()

    flexmock(GitProject).should_receive("get_pr").and_return(
        flexmock(source_project=flexmock()))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return(
        (flexmock(id=2, success=True), flexmock()))
    flexmock(KojiBuildModel).should_receive("create").and_return(
        flexmock(id=1))
    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    # koji build
    flexmock(sentry_integration).should_receive(
        "send_to_sentry").and_return().once()
    flexmock(Upstream).should_receive("koji_build").and_raise(
        Exception, "some error")

    result = helper.run_koji_build()
    assert not result["success"]
    assert result["details"]["errors"]
    assert result["details"]["errors"]["bright-future"] == "some error"
Ejemplo n.º 21
0
def test_koji_build_failed_kerberos(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        id=123,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=123).and_return(
            flexmock(id=2, type=JobTriggerModelType.pull_request))
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["bright-future"], scratch=True),
        db_trigger=trigger,
    )
    flexmock(koji_build).should_receive("get_all_koji_targets").and_return(
        ["dark-past", "bright-future"]).never()

    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.running,
        description="Building SRPM ...",
        check_name="production-build:bright-future",
        url="",
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.error,
        description=
        "Kerberos authentication error: the bad authentication error",
        check_name="production-build:bright-future",
        url=get_srpm_build_info_url(1),
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()

    flexmock(GitProject).should_receive("get_pr").and_return(
        flexmock(source_project=flexmock()))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return(
        (flexmock(id=1, success=True), flexmock()))
    flexmock(KojiBuildModel).should_receive("create").and_return(
        flexmock(id=1))
    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    flexmock(PackitAPI).should_receive("init_kerberos_ticket").and_raise(
        PackitCommandFailedError,
        "Command failed",
        stdout_output="",
        stderr_output="the bad authentication error",
    )

    response = helper.run_koji_build()
    assert not response["success"]
    assert ("Kerberos authentication error: the bad authentication error" ==
            response["details"]["msg"])
Ejemplo n.º 22
0
def pc_build_pr():
    pc = PackageConfig(jobs=[
        JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(targets=["fedora-all"]),
        )
    ])
    return pc
Ejemplo n.º 23
0
def test_copr_build_for_release(release_event):
    # status is set for each build-target (4x):
    #  - Building SRPM ...
    #  - Starting RPM build...
    branch_build_job = JobConfig(
        type=JobType.build,
        trigger=JobConfigTriggerType.release,
        metadata=JobMetadataConfig(
            targets=[
                "fedora-29-x86_64",
                "fedora-30-x86_64",
                "fedora-31-x86_64",
                "fedora-rawhide-x86_64",
            ],
            owner="nobody",
            dist_git_branches=["build-branch"],
        ),
    )
    trigger = flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123)
    flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return(trigger)
    flexmock(release_event.project).should_receive("get_sha_from_tag").and_return(
        "123456"
    )
    helper = build_helper(
        jobs=[branch_build_job],
        event=release_event,
        db_trigger=trigger,
    )
    flexmock(ReleaseEvent).should_receive("get_project").and_return(helper.project)
    flexmock(GitProject).should_receive("set_commit_status").and_return().times(8)
    flexmock(SRPMBuildModel).should_receive("create").and_return(
        SRPMBuildModel(success=True)
    )
    flexmock(CoprBuildModel).should_receive("get_or_create").and_return(
        CoprBuildModel(id=1)
    )

    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    # copr build
    flexmock(CoprHelper).should_receive("create_copr_project_if_not_exists").and_return(
        None
    )
    flexmock(CoprHelper).should_receive("get_copr_client").and_return(
        flexmock(
            config={"copr_url": "https://copr.fedorainfracloud.org/"},
            build_proxy=flexmock()
            .should_receive("create_from_file")
            .and_return(
                flexmock(id=2, projectname="the-project-name", ownername="the-owner")
            )
            .mock(),
        )
    )

    flexmock(Celery).should_receive("send_task").once()
    assert helper.run_copr_build()["success"]
Ejemplo n.º 24
0
def test_koji_build_target_not_supported(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        id=123,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=123).and_return(
            flexmock(id=2, type=JobTriggerModelType.pull_request))
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["nonexisting-target"],
                                   scratch=True),
        db_trigger=trigger,
    )
    flexmock(koji_build).should_receive("get_all_koji_targets").and_return(
        ["dark-past", "bright-future"]).once()

    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.running,
        description="Building SRPM ...",
        check_name="production-build:nonexisting-target",
        url="",
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.error,
        description="Target not supported: nonexisting-target",
        check_name="production-build:nonexisting-target",
        url=get_srpm_build_info_url(1),
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()

    flexmock(GitProject).should_receive("get_pr").and_return(
        flexmock(source_project=flexmock()))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return((
        flexmock(status="success", id=1).should_receive("set_url").with_args(
            "https://some.host/my.srpm").mock().should_receive(
                "set_start_time").mock().should_receive("set_status").mock().
        should_receive("set_logs").mock().should_receive(
            "set_end_time").mock(),
        flexmock(),
    ))
    flexmock(KojiBuildModel).should_receive("create").and_return(
        flexmock(id=1))
    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    response = helper.run_koji_build()
    assert not response["success"]
    assert ("Target not supported: nonexisting-target" == response["details"]
            ["errors"]["nonexisting-target"])
Ejemplo n.º 25
0
def test_precheck_koji_build_non_scratch(github_pr_event):
    flexmock(PullRequestModel).should_receive("get_or_create").with_args(
        pr_id=342,
        namespace="packit-service",
        repo_name="packit",
        project_url="https://github.com/packit-service/packit",
    ).and_return(
        flexmock(
            id=342,
            job_config_trigger_type=JobConfigTriggerType.pull_request,
            job_trigger_model_type=JobTriggerModelType.pull_request,
        ))
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=342).and_return(
            flexmock(id=2, type=JobTriggerModelType.pull_request))
    flexmock(StatusReporterGithubChecks).should_receive(
        "set_status").with_args(
            state=BaseCommitStatus.neutral,
            description="Non-scratch builds not possible from upstream.",
            check_name="production-build:bright-future",
            url=KOJI_PRODUCTION_BUILDS_ISSUE,
            links_to_external_services=None,
            markdown_content=None,
        ).and_return().once()
    flexmock(GithubProject).should_receive("can_merge_pr").and_return(True)
    koji_build_handler = KojiBuildHandler(
        package_config=PackageConfig(jobs=[
            JobConfig(
                type=JobType.production_build,
                trigger=JobConfigTriggerType.pull_request,
                metadata=JobMetadataConfig(_targets=["bright-future"],
                                           scratch=False),
            ),
        ]),
        job_config=JobConfig(
            type=JobType.production_build,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(_targets=["bright-future"],
                                       scratch=False),
        ),
        event=github_pr_event.get_dict(),
    )
    assert not koji_build_handler.pre_check()
Ejemplo n.º 26
0
def test_koji_build_targets_override(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        id=123,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=123).and_return(
            flexmock(id=2, type=JobTriggerModelType.pull_request))
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["bright-future", "dark-past"],
                                   scratch=True),
        db_trigger=trigger,
        targets_override={"bright-future"},
    )
    flexmock(koji_build).should_receive("get_all_koji_targets").and_return(
        ["dark-past", "bright-future"]).once()

    # SRPM + RPM
    flexmock(StatusReporter).should_receive("set_status").and_return().times(2)

    flexmock(GitProject).should_receive("get_pr").and_return(
        flexmock(source_project=flexmock()))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return((
        flexmock(status="success", id=1).should_receive("set_url").with_args(
            "https://some.host/my.srpm").mock().should_receive(
                "set_start_time").mock().should_receive("set_status").mock().
        should_receive("set_logs").mock().should_receive(
            "set_end_time").mock(),
        flexmock(),
    ))
    flexmock(KojiBuildModel).should_receive("create").and_return(
        flexmock(id=1)).and_return(flexmock(id=2))
    flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm")

    # koji build
    flexmock(Upstream).should_receive("koji_build").once().with_args(
        scratch=True,
        nowait=True,
        koji_target="bright-future",
        srpm_path=Path("my.srpm"),
    ).and_return(
        "Uploading srpm: /python-ogr-0.11.1"
        ".dev21+gf2dec9b-1.20200407142424746041.21.gf2dec9b.fc31.src.rpm\n"
        "[====================================] 100% 00:00:11   1.67 MiB 148.10 KiB/sec\n"
        "Created task: 43429338\n"
        "Task info: https://koji.fedoraproject.org/koji/taskinfo?taskID=43429338\n"
    )

    assert helper.run_koji_build()["success"]
Ejemplo n.º 27
0
def test_koji_build_failed_srpm(github_pr_event):
    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request,
        id=123,
        job_trigger_model_type=JobTriggerModelType.pull_request,
    )
    flexmock(JobTriggerModel).should_receive("get_or_create").with_args(
        type=JobTriggerModelType.pull_request, trigger_id=123).and_return(
            flexmock(id=2, type=JobTriggerModelType.pull_request))
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["bright-future"], scratch=True),
        db_trigger=trigger,
    )
    srpm_build_url = get_srpm_build_info_url(2)
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.running,
        description="Building SRPM ...",
        check_name="production-build:bright-future",
        url="",
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()
    flexmock(StatusReporter).should_receive("set_status").with_args(
        state=BaseCommitStatus.failure,
        description="SRPM build failed, check the logs for details.",
        check_name="production-build:bright-future",
        url=srpm_build_url,
        links_to_external_services=None,
        markdown_content=None,
    ).and_return()

    flexmock(GitProject).should_receive("get_pr").and_return(
        flexmock(source_project=flexmock()))
    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    flexmock(PackitAPI).should_receive("create_srpm").and_raise(
        Exception, "some error")
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return((
        flexmock(status="failure", id=2).should_receive("set_url").with_args(
            "https://some.host/my.srpm").mock().should_receive(
                "set_start_time").mock().should_receive("set_status").mock().
        should_receive("set_logs").mock().should_receive(
            "set_end_time").mock(),
        flexmock(),
    ))
    flexmock(KojiBuildModel).should_receive("create").never()
    flexmock(sentry_integration).should_receive(
        "send_to_sentry").and_return().once()

    result = helper.run_koji_build()
    assert not result["success"]
    assert "SRPM build failed" in result["details"]["msg"]
Ejemplo n.º 28
0
def test_precheck_push_to_a_different_branch(github_push_event):
    flexmock(GitBranchModel).should_receive("get_or_create").and_return(
        flexmock(id=1, job_config_trigger_type=JobConfigTriggerType.commit))

    copr_build_handler = CoprBuildHandler(
        package_config=PackageConfig(jobs=[
            JobConfig(
                type=JobType.copr_build,
                trigger=JobConfigTriggerType.commit,
                metadata=JobMetadataConfig(branch="bad-branch"),
            ),
        ]),
        job_config=JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.commit,
            metadata=JobMetadataConfig(branch="bad-branch"),
        ),
        event=github_push_event.get_dict(),
    )
    assert not copr_build_handler.pre_check()
Ejemplo n.º 29
0
def test_repository_cache_invocation():
    copr_build_helper = CoprBuildJobHelper(
        service_config=flexmock(
            repository_cache="/tmp/repository-cache",
            add_repositories_to_repository_cache=False,
            command_handler_work_dir="/tmp/some-dir",
        ),
        package_config=PackageConfig(jobs=[
            JobConfig(
                type=JobType.copr_build,
                trigger=JobConfigTriggerType.pull_request,
                metadata=JobMetadataConfig(_targets=STABLE_VERSIONS),
            )
        ], ),
        job_config=JobConfig(
            type=JobType.copr_build,
            trigger=JobConfigTriggerType.pull_request,
            metadata=JobMetadataConfig(_targets=STABLE_VERSIONS),
        ),
        project=flexmock(
            service=flexmock(),
            get_git_urls=lambda:
            {"git": "https://github.com/some-namespace/some-repo.git"},
            repo=flexmock(),
            namespace=flexmock(),
        ),
        metadata=flexmock(pr_id=None, git_ref=flexmock()),
        db_trigger=flexmock(
            job_config_trigger_type=JobConfigTriggerType.pull_request),
    )

    flexmock(RepositoryCache).should_call("__init__").once()
    flexmock(RepositoryCache).should_receive("get_repo").with_args(
        "https://github.com/some-namespace/some-repo.git",
        directory=Path("/tmp/some-dir"),
    ).and_return(
        flexmock(
            git=flexmock().should_receive("checkout").and_return().mock(),
            commit=lambda: "commit",
        )).once()
    assert copr_build_helper.local_project
Ejemplo n.º 30
0
def test_build_srpm_log_format(github_pr_event):
    def mock_packit_log(*args, **kwargs):
        packit_logger = logging.getLogger("packit")
        packit_logger.debug("try debug")
        packit_logger.info("try info")
        return "my.srpm"

    def inspect_log_date_format(logs=None, **_):

        timestamp_reg = re.compile(
            r"[0-9]+-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+\s.*")

        log_lines = 0
        for line in logs.split("\n"):
            logger.debug(line)
            if len(line) == 0:
                continue
            log_lines += 1
            assert timestamp_reg.match(line)

        # Check if both test logs were recorded
        assert log_lines == 2

        return (None, None)

    trigger = flexmock(
        job_config_trigger_type=JobConfigTriggerType.pull_request, id=123)
    flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(
        trigger)
    helper = build_helper(
        event=github_pr_event,
        metadata=JobMetadataConfig(_targets=["bright-future"], scratch=True),
        db_trigger=trigger,
    )

    flexmock(GitProject).should_receive(
        "set_commit_status").and_return().never()
    local_project = flexmock()
    local_project.working_dir = ""
    up = flexmock()
    up.local_project = local_project
    flexmock(PackitAPI).should_receive("up").and_return(up)

    # flexmock(PackitAPI).should_receive("up").and_return()
    flexmock(PackitAPI).should_receive("create_srpm").replace_with(
        mock_packit_log)
    srpm_model_mock = (flexmock(SRPMBuildModel).should_receive(
        "set_start_time").mock().should_receive("set_logs").replace_with(
            inspect_log_date_format).mock().should_receive(
                "set_status").mock().should_receive("set_end_time").mock())
    flexmock(SRPMBuildModel).should_receive("create_with_new_run").and_return(
        (srpm_model_mock, None))
    helper._create_srpm()