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), ]
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)
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
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()
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"])
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"]
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} """ )
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"]
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"]
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
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"]
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"]
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"]
def pc_koji_build_pr(): return PackageConfig(jobs=[ JobConfig( type=JobType.production_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["fedora-all"]), ) ])
def pc_tests(): return PackageConfig(jobs=[ JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["fedora-all"]), ) ])
def pc_build_push(): return PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.commit, metadata=JobMetadataConfig(targets=["fedora-all"]), ) ])
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 )
def pc_build_release(): return PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.release, metadata=JobMetadataConfig(_targets=["fedora-all"]), ) ])
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"]
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"
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"])
def pc_build_pr(): pc = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-all"]), ) ]) return pc
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"]
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"])
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()
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"]
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"]
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()
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
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()